@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,127 @@
|
|
|
1
|
+
// Contrato de tipos do Freio de Lote (RM-059, fatia F2). O Freio nao acrescenta noun ao `$`: este arquivo
|
|
2
|
+
// declara o estado dele (`PluginState['ork-freio']`) e os tipos que os modulos puros e os testes usam.
|
|
3
|
+
// Sem import nem referencia, como o motor exige de um contrato.
|
|
4
|
+
|
|
5
|
+
/** Uma claim ativa da thread, como o Freio a usa: o id, o arquivo e os comandos de verificacao. */
|
|
6
|
+
export type FreioClaim = {
|
|
7
|
+
id: string
|
|
8
|
+
arquivo: string | null
|
|
9
|
+
comandos: string[]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** O que a carga leu do nucleo (T2.1). */
|
|
13
|
+
export type FreioCarga = {
|
|
14
|
+
/** A thread do despacho, do contexto da ponte. */
|
|
15
|
+
thread: string
|
|
16
|
+
/** O status da thread no retrato do nucleo; `fechada` deixa o Freio dormente. */
|
|
17
|
+
statusDaThread: string | null
|
|
18
|
+
/** As claims nao retiradas; `null` enquanto o nucleo nao respondeu. */
|
|
19
|
+
claims: FreioClaim[] | null
|
|
20
|
+
/** Quando as claims foram lidas, em ms desde a epoca. */
|
|
21
|
+
claimsEm: number
|
|
22
|
+
/** O maior numero de claim da thread na leitura, retiradas incluidas (falta na carga gravada antes dele). */
|
|
23
|
+
maiorClaim?: number
|
|
24
|
+
/** A uniao dos `touch_paths` das tarefas do plano; `null` sem plano ou sem nenhum. */
|
|
25
|
+
touchPaths: string[] | null
|
|
26
|
+
/** O plano ja foi lido (com ou sem `touch_paths`). */
|
|
27
|
+
planoLido: boolean
|
|
28
|
+
/** Quando o plano foi lido, em ms desde a epoca. */
|
|
29
|
+
planoEm: number
|
|
30
|
+
/** O que falhou na ultima carga, para a linha de status e o teste. */
|
|
31
|
+
erros: string[]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** A foto do `git status` da worktree: o HEAD e a assinatura de cada caminho sujo. */
|
|
35
|
+
export type FreioFoto = {
|
|
36
|
+
head: string | null
|
|
37
|
+
/** Caminho relativo a raiz da sessao para `XY|tamanho|mtimeMs` (ou `XY|ausente`). */
|
|
38
|
+
caminhos: Record<string, string>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Uma claim afetada pelo lote, na fila da conferencia (T2.2). */
|
|
42
|
+
export type FreioPedido = {
|
|
43
|
+
id: string
|
|
44
|
+
/** 3 pelo `arquivo`, 2 pelo caminho citado no comando, 1 pelo nome-base citado (D5). */
|
|
45
|
+
forca: number
|
|
46
|
+
/** Os caminhos tocados que a afetaram. */
|
|
47
|
+
caminhos: string[]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** O que o Freio vigia entre os lotes. */
|
|
51
|
+
export type FreioVigia = {
|
|
52
|
+
thread: string
|
|
53
|
+
/** A ultima foto do `git status`; `null` antes da primeira. */
|
|
54
|
+
foto: FreioFoto | null
|
|
55
|
+
/** O numero do lote, que marca quando cada caminho foi tocado. */
|
|
56
|
+
seq: number
|
|
57
|
+
/** O ultimo lote que tocou cada caminho. */
|
|
58
|
+
toques: Record<string, number>
|
|
59
|
+
/** As claims afetadas que esperam conferencia. */
|
|
60
|
+
fila: FreioPedido[]
|
|
61
|
+
/** Os caminhos fora dos `touch_paths` ja avisados nesta sessao. */
|
|
62
|
+
avisadosFora: string[]
|
|
63
|
+
// Os campos da conferencia (T2.3) faltam na vigia gravada antes deles; `comConferencia` os preenche.
|
|
64
|
+
/** A rodada em curso no nucleo, ou `null`. */
|
|
65
|
+
rodada?: FreioRodada | null
|
|
66
|
+
/** O que o lote seguinte devolve ao modelo. */
|
|
67
|
+
entrega?: FreioEntrega
|
|
68
|
+
/** As claims cuja ultima conferencia reprovou. */
|
|
69
|
+
emRisco?: string[]
|
|
70
|
+
/** Ate quando o Freio nao pede conferencia (depois de uma indisponivel), em ms desde a epoca. */
|
|
71
|
+
pausaAte?: number
|
|
72
|
+
/** Por que a ultima conferencia ficou indisponivel, ou `null`. */
|
|
73
|
+
indisponivel?: string | null
|
|
74
|
+
/** O modelo ja foi avisado da conferencia indisponivel nesta sessao. */
|
|
75
|
+
avisouIndisponivel?: boolean
|
|
76
|
+
/** Caminhos fora dos `touch_paths` que o laco principal ainda nao recebeu (lote de subagente nao recebe aviso). */
|
|
77
|
+
foraPendentes?: string[]
|
|
78
|
+
/** As claims cuja falha o modelo ja recebeu: so elas voltam como recuperadas quando passam. */
|
|
79
|
+
avisadas?: string[]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Uma rodada de conferencia: as claims, os caminhos que afetaram cada uma e o lote em que ela comecou (T2.3). */
|
|
83
|
+
export type FreioRodada = {
|
|
84
|
+
ids: string[]
|
|
85
|
+
caminhos: Record<string, string[]>
|
|
86
|
+
/** A forca de cada claim, para ela voltar a fila no mesmo lugar (recusa por claim, conducao alheia). */
|
|
87
|
+
forcas?: Record<string, number>
|
|
88
|
+
/** O numero do lote no inicio; toque mais novo deixa o resultado da claim velho (D6). */
|
|
89
|
+
inicio: number
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Uma claim que a conferencia reprovou (`claims.failed`), como volta ao modelo. */
|
|
93
|
+
export type FreioFalha = {
|
|
94
|
+
id: string
|
|
95
|
+
alegacao: string
|
|
96
|
+
arquivo: string | null
|
|
97
|
+
comando: string
|
|
98
|
+
codigo: number | null
|
|
99
|
+
/** O fim da saida, ja redigido pelo nucleo. */
|
|
100
|
+
fim: string
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Uma claim cuja conferencia terminou sem veredito (prazo, comando que nao rodou). */
|
|
104
|
+
export type FreioSemVeredito = {
|
|
105
|
+
id: string
|
|
106
|
+
motivo: string
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** O que o lote seguinte devolve ao modelo. */
|
|
110
|
+
export type FreioEntrega = {
|
|
111
|
+
falhas: FreioFalha[]
|
|
112
|
+
semVeredito: FreioSemVeredito[]
|
|
113
|
+
recuperadas: string[]
|
|
114
|
+
/** O motivo da conferencia indisponivel, so na primeira vez da sessao. */
|
|
115
|
+
indisponivel: string | null
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
declare module 'claude-code' {
|
|
119
|
+
interface PluginState {
|
|
120
|
+
'ork-freio': {
|
|
121
|
+
/** O que a carga leu do nucleo. */
|
|
122
|
+
carga: FreioCarga
|
|
123
|
+
/** O que o Freio vigia entre os lotes. */
|
|
124
|
+
vigia: FreioVigia
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ork-mensageiro",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Mensageiro de Sessões do Orkastery no Claude Code: leva a resposta que o dono deu pelo diálogo nativo à sessão de fase claude-bg que parou esperando por ele, como mensagem entre sessões, e na sessão de fase só deixa chegar ao modelo a mensagem que o núcleo confirmou como aquela resposta. Nunca responde nem aprova pelo dono.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Orkastery contributors",
|
|
7
|
+
"url": "https://github.com/orkastery"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://orkastery.com/",
|
|
10
|
+
"repository": "https://github.com/orkastery/orkastery",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"types": "./types/index.d.ts",
|
|
13
|
+
"dependencies": ["ork-ponte"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// O lado do dono do Mensageiro de Sessoes (RM-059, fatia F9, T9.2), em funcoes puras. A sessao do dono que recebeu a
|
|
2
|
+
// resposta pelo dialogo nativo tem a mensagem na caixa de saida do servidor MCP dela (`ork_session_outbox`), so na
|
|
3
|
+
// memoria; o Mensageiro a leva a sessao de fase por `$.session.send`, sem mexer no texto, e anota o envio no nucleo.
|
|
4
|
+
// O que segue incerto noutra sessao do dono sai do retrato da ponte (secao `hitl`). Nada daqui guarda o texto da
|
|
5
|
+
// resposta no estado (D12 da thread ork-rm059mensag). So importa tipos.
|
|
6
|
+
import type { MensageiroDono, MensageiroEntrega, MensageiroEstadoDaEntrega, MensageiroIncerta } from '../types'
|
|
7
|
+
|
|
8
|
+
export const SERVIDOR = 'orkastery'
|
|
9
|
+
/** A ferramenta da caixa de saida, so no servidor do dono do Claude Code (T9.1). */
|
|
10
|
+
export const FERRAMENTA_DA_CAIXA = 'ork_session_outbox'
|
|
11
|
+
/** O contrato da entrega no nucleo (`core/src/entrega-por-mod.ts`), conferido pelo teste do nucleo. */
|
|
12
|
+
export const CONTRATO_DA_ENTREGA = 'ork.session-delivery/v1'
|
|
13
|
+
/** D10: o envio que nao entrou na fila volta depois do recuo; o que entrou e nao foi reservado, depois da espera. */
|
|
14
|
+
export const RECUO_DO_ENVIO_MS = 30000
|
|
15
|
+
export const ESPERA_DA_RESERVA_MS = 60000
|
|
16
|
+
export const MAXIMO_DE_ENVIOS = 10
|
|
17
|
+
/** D21: a reserva sem recibo por este tempo deixa de ser "confirmando" e pede o dono. */
|
|
18
|
+
export const ESPERA_DO_RECIBO_MS = 5 * 60000
|
|
19
|
+
/** A faixa diz "entregue" por este tempo; o painel guarda o que terminou por este outro. */
|
|
20
|
+
export const FAIXA_DA_ENTREGA_MS = 10 * 60000
|
|
21
|
+
export const GUARDA_DO_TERMINADO_MS = 30 * 60000
|
|
22
|
+
export const MAXIMO_DE_ENTREGAS = 50
|
|
23
|
+
export const DONO_VAZIO: MensageiroDono = { entregas: [], incertas: [], lidoEm: null, erro: null }
|
|
24
|
+
|
|
25
|
+
const UUID = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/
|
|
26
|
+
const ID_DE_THREAD = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/
|
|
27
|
+
const VIVOS: readonly MensageiroEstadoDaEntrega[] = ['na-fila', 'a-caminho', 'reservada', 'nao-chegou']
|
|
28
|
+
|
|
29
|
+
/** Uma entrega da caixa de saida como o nucleo a lista, com o ultimo envio em ms. */
|
|
30
|
+
export type EntradaDaCaixa = {
|
|
31
|
+
thread: string; pedidoId: string; envioId: string; sessionId: string
|
|
32
|
+
/** A mensagem inteira, com o cabecalho do nucleo: vai ao `$.session.send` como esta e nunca ao estado. */
|
|
33
|
+
mensagem: string
|
|
34
|
+
tentativas: number
|
|
35
|
+
ultimoEnvio: { em: number; entregue: boolean; motivo: string | null } | null
|
|
36
|
+
reservada: boolean
|
|
37
|
+
/** Quando a entrega entrou na caixa (ms desde a epoca); conta o sem-recibo quando o envio nao foi anotado. */
|
|
38
|
+
criadaEm: number | null
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const objeto = (v: unknown): v is Record<string, any> => !!v && typeof v === 'object' && !Array.isArray(v)
|
|
42
|
+
const uuid = (v: unknown): v is string => typeof v === 'string' && UUID.test(v)
|
|
43
|
+
|
|
44
|
+
/** Uma linha so, sem caractere de controle e com teto: o que vem do nucleo ou de um erro nunca quebra a tela. */
|
|
45
|
+
export function umaLinha(v: unknown, teto = 200): string {
|
|
46
|
+
const s = typeof v === 'string' ? v : v instanceof Error ? v.message : String(v)
|
|
47
|
+
return Array.from(s.replace(/\p{Cc}/gu, ' ').replace(/\s+/g, ' ').trim()).slice(0, teto).join('')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** O JSON que uma ferramenta do nucleo devolveu; a recusa vira erro com o motivo dela. */
|
|
51
|
+
export function jsonDoMcp(r: unknown, ferramenta: string): unknown {
|
|
52
|
+
const o = objeto(r) ? r : {}
|
|
53
|
+
const conteudo = Array.isArray(o.content) ? o.content : []
|
|
54
|
+
const texto = conteudo.filter(c => objeto(c) && c.type === 'text' && typeof c.text === 'string').map(c => c.text).join('')
|
|
55
|
+
let dados: unknown
|
|
56
|
+
try { dados = JSON.parse(texto) } catch { throw new Error(`${ferramenta} respondeu fora do JSON`) }
|
|
57
|
+
if (o.isError === true) throw new Error(`${ferramenta} recusou: ${umaLinha(objeto(dados) && typeof dados.erro === 'string' ? dados.erro : texto)}`)
|
|
58
|
+
return dados
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function lerEntrada(e: unknown): EntradaDaCaixa[] {
|
|
62
|
+
if (!objeto(e) || typeof e.thread !== 'string' || !ID_DE_THREAD.test(e.thread) || !uuid(e.pedidoId) || !uuid(e.envioId) ||
|
|
63
|
+
!uuid(e.sessionId) || typeof e.mensagem !== 'string' ||
|
|
64
|
+
!e.mensagem.startsWith(`[${CONTRATO_DA_ENTREGA} pedido=${e.pedidoId} entrega=${e.envioId}] `)) return []
|
|
65
|
+
const u = objeto(e.ultimoEnvio) ? e.ultimoEnvio : null
|
|
66
|
+
const em = u && typeof u.em === 'string' ? Date.parse(u.em) : NaN
|
|
67
|
+
const criadaEm = typeof e.criadaEm === 'string' ? Date.parse(e.criadaEm) : NaN
|
|
68
|
+
return [{ thread: e.thread, pedidoId: e.pedidoId, envioId: e.envioId, sessionId: e.sessionId, mensagem: e.mensagem,
|
|
69
|
+
tentativas: Number.isSafeInteger(e.tentativas) && e.tentativas > 0 ? e.tentativas : 0,
|
|
70
|
+
ultimoEnvio: u && Number.isFinite(em) ? { em, entregue: u.entregue === true, motivo: typeof u.motivo === 'string' ? umaLinha(u.motivo) : null } : null,
|
|
71
|
+
reservada: e.reservada === true, criadaEm: Number.isFinite(criadaEm) ? criadaEm : null }]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** A caixa de saida do `listar`; o que nao bate com o contrato fica de fora, e a resposta fora do contrato e erro. */
|
|
75
|
+
export function lerCaixa(dados: unknown): EntradaDaCaixa[] {
|
|
76
|
+
if (!objeto(dados) || dados.contrato !== CONTRATO_DA_ENTREGA || !Array.isArray(dados.entregas)) {
|
|
77
|
+
throw new Error('a caixa de saída respondeu fora do contrato ork.session-delivery/v1')
|
|
78
|
+
}
|
|
79
|
+
return dados.entregas.flatMap(lerEntrada)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** A entrega que o `enviada` devolveu, com a reserva que ela tinha na lista (o nucleo so a le no `listar`). */
|
|
83
|
+
export function entradaAnotada(dados: unknown, reservada: boolean): EntradaDaCaixa | null {
|
|
84
|
+
const lida = objeto(dados) && dados.contrato === CONTRATO_DA_ENTREGA ? lerEntrada({ ...(objeto(dados.entrega) ? dados.entrega : {}), reservada }) : []
|
|
85
|
+
return lida[0] ?? null
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** D10: envia o que nunca foi, o que nao entrou na fila depois do recuo e o que entrou e ninguem reservou depois da espera. */
|
|
89
|
+
export function deveEnviar(e: EntradaDaCaixa, agora: number): boolean {
|
|
90
|
+
if (e.reservada || e.tentativas >= MAXIMO_DE_ENVIOS) return false
|
|
91
|
+
if (!e.ultimoEnvio) return true
|
|
92
|
+
return agora - e.ultimoEnvio.em >= (e.ultimoEnvio.entregue ? ESPERA_DA_RESERVA_MS : RECUO_DO_ENVIO_MS)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** O argumento do `$.session.send`: a sessao do pedido e a mensagem do nucleo, sem mexer em nada. */
|
|
96
|
+
export function argsDoEnvio(e: EntradaDaCaixa): { to: { sessionId: string }; text: string } {
|
|
97
|
+
return { to: { sessionId: e.sessionId }, text: e.mensagem }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** O resultado do `$.session.send` como o nucleo o anota. */
|
|
101
|
+
export function resultadoDoEnvio(r: unknown): { entregue: boolean; motivo: string | null } {
|
|
102
|
+
if (objeto(r) && r.isDelivered === true) return { entregue: true, motivo: null }
|
|
103
|
+
return { entregue: false, motivo: umaLinha(objeto(r) && typeof r.reason === 'string' && r.reason ? r.reason : 'a sessão não recebeu a mensagem') }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function argsDaAnotacao(e: EntradaDaCaixa, r: { entregue: boolean; motivo: string | null }): Record<string, unknown> {
|
|
107
|
+
return { operacao: 'enviada', threadId: e.thread, envioId: e.envioId, entregue: r.entregue, ...(r.motivo ? { motivo: r.motivo } : {}) }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** A secao `hitl` do retrato, quando ela veio lida (disponivel ou vazia); `null` quando nao da para concluir nada. */
|
|
111
|
+
function secaoHitl(retrato: unknown): Record<string, any>[] | null {
|
|
112
|
+
const secoes = objeto(retrato) && objeto(retrato.sections) ? retrato.sections : {}
|
|
113
|
+
const hitl = objeto(secoes.hitl) ? secoes.hitl : null
|
|
114
|
+
if (!hitl || (hitl.state !== 'available' && hitl.state !== 'empty')) return null
|
|
115
|
+
return Array.isArray(hitl.items) ? hitl.items.filter(objeto) : []
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const threadDoItem = (i: Record<string, any>): string | null => {
|
|
119
|
+
const ref = Array.isArray(i.refs) ? i.refs.find((r: unknown) => objeto(r) && r.kind === 'thread' && typeof r.id === 'string') : null
|
|
120
|
+
return ref && ID_DE_THREAD.test(ref.id) ? ref.id : null
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Os pedidos abertos que o retrato mostra (respondido sai da secao); `null` quando a secao nao veio lida. */
|
|
124
|
+
export function pedidosNoRetrato(retrato: unknown): Set<string> | null {
|
|
125
|
+
const itens = secaoHitl(retrato)
|
|
126
|
+
return itens === null ? null : new Set(itens.flatMap(i => (typeof i.id === 'string' ? [i.id] : [])))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Os pedidos de sessao com a entrega incerta no retrato (`delivery.uncertain`): a entrega segue em alguma sessao do dono. */
|
|
130
|
+
export function incertasDoRetrato(retrato: unknown): MensageiroIncerta[] {
|
|
131
|
+
return (secaoHitl(retrato) ?? []).flatMap(i => {
|
|
132
|
+
const thread = threadDoItem(i)
|
|
133
|
+
return i.status === 'delivery.uncertain' && objeto(i.facts) && i.facts.target === 'session' && uuid(i.id) && thread
|
|
134
|
+
? [{ thread, pedidoId: i.id }] : []
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** O estado de uma entrega que esta na caixa, agora. */
|
|
139
|
+
export function estadoDaEntrada(e: EntradaDaCaixa, agora: number): MensageiroEstadoDaEntrega {
|
|
140
|
+
if (e.reservada) {
|
|
141
|
+
const desde = e.ultimoEnvio?.em ?? e.criadaEm
|
|
142
|
+
return typeof desde === 'number' && agora - desde >= ESPERA_DO_RECIBO_MS ? 'sem-recibo' : 'reservada'
|
|
143
|
+
}
|
|
144
|
+
if (!e.ultimoEnvio) return 'na-fila'
|
|
145
|
+
if (e.tentativas >= MAXIMO_DE_ENVIOS) return 'desistiu'
|
|
146
|
+
return e.ultimoEnvio.entregue ? 'a-caminho' : 'nao-chegou'
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function motivoDaEntrada(e: EntradaDaCaixa, estado: MensageiroEstadoDaEntrega): string | null {
|
|
150
|
+
if (estado === 'sem-recibo') return 'a sessão de fase reservou a entrega e não gravou o recibo em 5 min'
|
|
151
|
+
if (estado === 'desistiu') {
|
|
152
|
+
return e.ultimoEnvio?.entregue
|
|
153
|
+
? `a sessão de fase não confirmou a entrega depois de ${e.tentativas} envios`
|
|
154
|
+
: e.ultimoEnvio?.motivo ?? `a mensagem não entrou na fila da sessão em ${e.tentativas} envios`
|
|
155
|
+
}
|
|
156
|
+
return estado === 'nao-chegou' ? e.ultimoEnvio?.motivo ?? null : null
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* As entregas desta sessao depois de uma leitura da caixa. A que saiu da caixa terminou: entregue, quando o retrato
|
|
161
|
+
* nao mostra mais o pedido (respondido); "saiu da caixa", quando o pedido segue aberto. Sem o retrato, nada se conclui.
|
|
162
|
+
*/
|
|
163
|
+
export function atualizarEntregas(anteriores: readonly MensageiroEntrega[], caixa: readonly EntradaDaCaixa[],
|
|
164
|
+
noRetrato: Set<string> | null, agora: number): MensageiroEntrega[] {
|
|
165
|
+
const restantes = new Map(anteriores.map(e => [e.envioId, e]))
|
|
166
|
+
const saida: MensageiroEntrega[] = []
|
|
167
|
+
for (const c of caixa) {
|
|
168
|
+
const estado = estadoDaEntrada(c, agora)
|
|
169
|
+
const antes = restantes.get(c.envioId)
|
|
170
|
+
restantes.delete(c.envioId)
|
|
171
|
+
saida.push({ thread: c.thread, pedidoId: c.pedidoId, envioId: c.envioId, sessionId: c.sessionId, estado, tentativas: c.tentativas,
|
|
172
|
+
motivo: motivoDaEntrada(c, estado), em: antes && antes.estado === estado ? antes.em : agora })
|
|
173
|
+
}
|
|
174
|
+
for (const e of restantes.values()) {
|
|
175
|
+
if (!VIVOS.includes(e.estado) && e.estado !== 'desistiu' && e.estado !== 'sem-recibo') {
|
|
176
|
+
if (agora - e.em <= GUARDA_DO_TERMINADO_MS) saida.push(e)
|
|
177
|
+
continue
|
|
178
|
+
}
|
|
179
|
+
if (noRetrato === null) { saida.push(e); continue }
|
|
180
|
+
const aberto = noRetrato.has(e.pedidoId)
|
|
181
|
+
saida.push({ ...e, estado: aberto ? 'saiu-da-caixa' : 'entregue', em: agora,
|
|
182
|
+
motivo: aberto ? 'a caixa de saída soltou a entrega sem recibo; responda pelo claude attach' : null })
|
|
183
|
+
}
|
|
184
|
+
return saida.slice(-MAXIMO_DE_ENTREGAS)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** A thread do ledger que mudou, pelos caminhos que a ponte vigia (`.orkastery/threads/<thread>/ledger.jsonl`). */
|
|
188
|
+
export function threadDoLedger(caminho: unknown): string | null {
|
|
189
|
+
if (typeof caminho !== 'string') return null
|
|
190
|
+
const m = /\.orkastery\/threads\/([^/]+)\/ledger\.jsonl$/.exec(caminho)
|
|
191
|
+
return m && ID_DE_THREAD.test(m[1]) ? m[1] : null
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function daThread(entregas: readonly MensageiroEntrega[], um: string, varios: (n: number) => string): string {
|
|
195
|
+
return entregas.length === 1 ? `${um} ${entregas[0].thread}` : varios(entregas.length)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* A linha da faixa (D7 do plano dos mods): o que nao chegou e precisa do dono vem primeiro; depois o que esta a caminho;
|
|
200
|
+
* depois o que acabou de ser entregue. Sem nada disso, a linha sai da faixa.
|
|
201
|
+
*/
|
|
202
|
+
export function textoDaFaixa(dono: MensageiroDono, agora: number): string | undefined {
|
|
203
|
+
const falhas = dono.entregas.filter(e => e.estado === 'desistiu' || e.estado === 'saiu-da-caixa')
|
|
204
|
+
if (falhas.length) return falhas.length === 1
|
|
205
|
+
? `a resposta para a ${falhas[0].thread} não chegou; responda pelo claude attach` : `${falhas.length} respostas não chegaram; abra /mensageiro`
|
|
206
|
+
// Sem recibo, a resposta pode ter entrado na conversa: o dono confere antes de responder de novo.
|
|
207
|
+
const semRecibo = dono.entregas.filter(e => e.estado === 'sem-recibo')
|
|
208
|
+
if (semRecibo.length) return semRecibo.length === 1
|
|
209
|
+
? `a resposta para a ${semRecibo[0].thread} ficou sem recibo; confira pelo claude attach` : `${semRecibo.length} respostas sem recibo; abra /mensageiro`
|
|
210
|
+
const vivas = dono.entregas.filter(e => VIVOS.includes(e.estado))
|
|
211
|
+
if (vivas.length) return daThread(vivas, 'resposta a caminho da', n => `${n} respostas a caminho das sessões de fase`)
|
|
212
|
+
const entregues = dono.entregas.filter(e => e.estado === 'entregue' && agora - e.em <= FAIXA_DA_ENTREGA_MS)
|
|
213
|
+
if (entregues.length) return daThread(entregues, 'resposta entregue à', n => `${n} respostas entregues às sessões de fase`)
|
|
214
|
+
return undefined
|
|
215
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// O painel do Mensageiro de Sessoes (RM-059, fatia F9), em funcoes puras: o estado vira linhas da tela, uma por
|
|
2
|
+
// elemento, e as linhas viram a arvore do painel com os elementos que a superficie resolveu (so `Box`, `Text` e
|
|
3
|
+
// `Button`, os mesmos no terminal e no desktop). Todo estado tem rotulo e glifo, nunca so cor (regra da Partitura).
|
|
4
|
+
// O texto da resposta do dono nunca aparece aqui: so a thread, o pedido e o estado da entrega. So importa tipos e
|
|
5
|
+
// modulos puros do Mensageiro.
|
|
6
|
+
import type { MensageiroDono, MensageiroEntrega, MensageiroEstadoDaEntrega, MensageiroEstadoDaRecebida, MensageiroFase, MensageiroMostrado,
|
|
7
|
+
MensageiroRecebida } from '../types'
|
|
8
|
+
import { umaLinha } from './caixa'
|
|
9
|
+
import { codigoDoMotivo, motivoLegivel } from './recepcao'
|
|
10
|
+
|
|
11
|
+
export type LinhaDoMensageiro = {
|
|
12
|
+
tipo: 'titulo' | 'secao' | 'texto' | 'dim' | 'falha' | 'feito'
|
|
13
|
+
chave: string
|
|
14
|
+
texto: string
|
|
15
|
+
/** O que vai ao registro do mostrado da ponte quando a linha esta na janela de rolagem do painel a vista. */
|
|
16
|
+
mostrado?: MensageiroMostrado
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const ROTULO_DO_ESTADO: Record<MensageiroEstadoDaEntrega, string> = {
|
|
20
|
+
'na-fila': 'na fila do núcleo',
|
|
21
|
+
'a-caminho': 'a caminho: na fila da sessão, esperando a conferência',
|
|
22
|
+
'reservada': 'recebida pela sessão, confirmando',
|
|
23
|
+
'sem-recibo': 'recebida pela sessão, sem recibo em 5 min: confira pelo claude attach',
|
|
24
|
+
'nao-chegou': 'não entrou na fila da sessão; nova tentativa em breve',
|
|
25
|
+
'desistiu': 'não chegou: responda pelo claude attach',
|
|
26
|
+
'entregue': 'entregue, com o recibo da sessão',
|
|
27
|
+
'saiu-da-caixa': 'saiu da caixa sem recibo: responda pelo claude attach',
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const GLIFO: Record<MensageiroEstadoDaEntrega, string> = {
|
|
31
|
+
'na-fila': '·', 'a-caminho': '●', 'reservada': '●', 'sem-recibo': '?', 'nao-chegou': '×', 'desistiu': '×', 'entregue': '✓', 'saiu-da-caixa': '?',
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const TIPO: Record<MensageiroEstadoDaEntrega, LinhaDoMensageiro['tipo']> = {
|
|
35
|
+
'na-fila': 'texto', 'a-caminho': 'texto', 'reservada': 'texto', 'sem-recibo': 'falha', 'nao-chegou': 'falha', 'desistiu': 'falha', 'entregue': 'feito', 'saiu-da-caixa': 'falha',
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Quanto tempo faz, como o dono le. */
|
|
39
|
+
export function idade(ms: number): string {
|
|
40
|
+
if (!(ms >= 60000)) return 'agora'
|
|
41
|
+
const min = Math.floor(ms / 60000)
|
|
42
|
+
return min < 60 ? `há ${min} min` : `há ${Math.floor(min / 60)} h`
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const curto = (id: string) => id.slice(0, 8)
|
|
46
|
+
|
|
47
|
+
function linhasDaEntrega(e: MensageiroEntrega, agora: number): LinhaDoMensageiro[] {
|
|
48
|
+
const k = (s: string) => `${e.envioId}:${s}`
|
|
49
|
+
const envios = e.tentativas > 1 ? ` · ${e.tentativas} envios` : ''
|
|
50
|
+
const texto = `${GLIFO[e.estado]} ${e.thread} · pedido ${curto(e.pedidoId)} · ${ROTULO_DO_ESTADO[e.estado]}${envios} · ${idade(agora - e.em)}`
|
|
51
|
+
const linhas: LinhaDoMensageiro[] = [{ tipo: TIPO[e.estado], chave: k('estado'), texto: umaLinha(texto, 300),
|
|
52
|
+
mostrado: { chave: `hitl:${e.pedidoId}`, thread: e.thread, texto: `${e.thread}: resposta do dono ${ROTULO_DO_ESTADO[e.estado]}` } }]
|
|
53
|
+
if (e.motivo) linhas.push({ tipo: 'dim', chave: k('motivo'), texto: ` ${umaLinha(e.motivo, 200)}` })
|
|
54
|
+
return linhas
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** As linhas do painel na sessao do dono. */
|
|
58
|
+
export function linhasDoDono(dono: MensageiroDono, agora: number): LinhaDoMensageiro[] {
|
|
59
|
+
const linhas: LinhaDoMensageiro[] = [
|
|
60
|
+
{ tipo: 'titulo', chave: 'titulo', texto: 'Mensageiro de Sessões' },
|
|
61
|
+
{ tipo: 'dim', chave: 'o-que-faz', texto: 'Leva a resposta que você deu pelo diálogo à sessão de fase que parou esperando por ela.' },
|
|
62
|
+
]
|
|
63
|
+
if (dono.erro) linhas.push({ tipo: 'falha', chave: 'erro', texto: `× ${umaLinha(dono.erro, 200)}` })
|
|
64
|
+
linhas.push({ tipo: 'secao', chave: 'secao-entregas', texto: 'Respostas desta sessão' })
|
|
65
|
+
if (!dono.entregas.length) linhas.push({ tipo: 'dim', chave: 'sem-entregas', texto: ' nenhuma resposta a caminho agora' })
|
|
66
|
+
for (const e of [...dono.entregas].reverse()) linhas.push(...linhasDaEntrega(e, agora))
|
|
67
|
+
if (dono.incertas.length) {
|
|
68
|
+
// O retrato so diz que a entrega esta incerta (sem o runtime): ela pode seguir noutra sessao do dono ou noutro canal
|
|
69
|
+
// (um envio nativo pendente), ou ter se perdido com uma sessao que fechou. O painel nao sabe qual, e diz isso.
|
|
70
|
+
linhas.push({ tipo: 'secao', chave: 'secao-incertas', texto: 'Fora desta sessão' })
|
|
71
|
+
for (const i of dono.incertas) {
|
|
72
|
+
linhas.push({ tipo: 'texto', chave: `incerta:${i.pedidoId}`,
|
|
73
|
+
texto: `· ${i.thread} · pedido ${curto(i.pedidoId)} · entrega incerta fora desta sessão: noutra sessão do dono, noutro canal ou perdida` })
|
|
74
|
+
}
|
|
75
|
+
linhas.push({ tipo: 'dim', chave: 'incertas-limite', texto: ' sem retorno, responda pelo claude attach' })
|
|
76
|
+
}
|
|
77
|
+
linhas.push({ tipo: 'dim', chave: 'limite', texto: 'A resposta chega como mensagem de outra sessão: informa a sessão de fase, não autoriza ação que só você aprova. Para isso, claude attach.' })
|
|
78
|
+
if (dono.lidoEm === null) linhas.push({ tipo: 'dim', chave: 'lido', texto: 'a caixa de saída ainda não foi lida' })
|
|
79
|
+
else linhas.push({ tipo: 'dim', chave: 'lido', texto: `caixa de saída lida ${idade(agora - dono.lidoEm)}` })
|
|
80
|
+
return linhas
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const ROTULO_DA_RECEBIDA: Record<MensageiroEstadoDaRecebida, string> = {
|
|
84
|
+
'consumida': 'consumida antes do modelo',
|
|
85
|
+
'confirmando': 'entrou na conversa; gravando o recibo no núcleo',
|
|
86
|
+
'entregue': 'entrou na conversa, com o recibo no núcleo',
|
|
87
|
+
'sem-recibo': 'entrou na conversa, mas o recibo não foi gravado',
|
|
88
|
+
'nao-entrou': 'conferida, mas não entrou na conversa',
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const GLIFO_DA_RECEBIDA: Record<MensageiroEstadoDaRecebida, string> = {
|
|
92
|
+
'consumida': '○', 'confirmando': '●', 'entregue': '✓', 'sem-recibo': '?', 'nao-entrou': '×',
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const TIPO_DA_RECEBIDA: Record<MensageiroEstadoDaRecebida, LinhaDoMensageiro['tipo']> = {
|
|
96
|
+
'consumida': 'texto', 'confirmando': 'texto', 'entregue': 'feito', 'sem-recibo': 'falha', 'nao-entrou': 'falha',
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function linhasDaRecebida(r: MensageiroRecebida, i: number, agora: number): LinhaDoMensageiro[] {
|
|
100
|
+
const k = (s: string) => `recebida:${i}:${s}`
|
|
101
|
+
const quem = r.estado === 'consumida'
|
|
102
|
+
? `mensagem de outra sessão (${umaLinha(r.origem, 80)})${r.pedidoId ? ` com a marca do pedido ${curto(r.pedidoId)}` : ''}`
|
|
103
|
+
: `resposta do dono ao pedido ${r.pedidoId ? curto(r.pedidoId) : '?'}`
|
|
104
|
+
const linhas: LinhaDoMensageiro[] = [{ tipo: TIPO_DA_RECEBIDA[r.estado], chave: k('estado'),
|
|
105
|
+
texto: umaLinha(`${GLIFO_DA_RECEBIDA[r.estado]} ${quem} · ${ROTULO_DA_RECEBIDA[r.estado]} · ${idade(agora - r.em)}`, 300) }]
|
|
106
|
+
if (r.motivo) {
|
|
107
|
+
const motivo = r.estado === 'consumida' ? `${motivoLegivel(r.motivo)} · ${codigoDoMotivo(r.motivo)}` : r.motivo
|
|
108
|
+
linhas.push({ tipo: 'dim', chave: k('motivo'), texto: ` ${umaLinha(motivo, 200)}` })
|
|
109
|
+
}
|
|
110
|
+
return linhas
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* As linhas do painel na sessao de fase: o que chegou de outras sessoes, o mais novo primeiro. Sem botao: o estado so
|
|
115
|
+
* muda quando algo chega, e o painel se redesenha sozinho. O texto de nenhuma mensagem aparece aqui.
|
|
116
|
+
*/
|
|
117
|
+
export function linhasDaFase(fase: MensageiroFase, agora: number): LinhaDoMensageiro[] {
|
|
118
|
+
const linhas: LinhaDoMensageiro[] = [
|
|
119
|
+
{ tipo: 'secao', chave: 'titulo', texto: 'Mensageiro de Sessões' },
|
|
120
|
+
{ tipo: 'dim', chave: 'o-que-faz', texto: `Nesta sessão de fase${fase.thread ? ` da ${fase.thread}` : ''}, só entra na conversa a resposta do dono que o núcleo conferiu; o resto que chega de outra sessão é consumido.` },
|
|
121
|
+
]
|
|
122
|
+
if (fase.erro) linhas.push({ tipo: 'falha', chave: 'erro', texto: `× ${umaLinha(fase.erro, 200)}` })
|
|
123
|
+
linhas.push({ tipo: 'secao', chave: 'secao-recebidas', texto: 'O que chegou de outras sessões' })
|
|
124
|
+
if (!fase.recebidas.length) linhas.push({ tipo: 'dim', chave: 'sem-recebidas', texto: ' nada chegou de outra sessão' })
|
|
125
|
+
const recebidas = fase.recebidas.map((r, i) => ({ r, i })).reverse()
|
|
126
|
+
for (const { r, i } of recebidas) linhas.push(...linhasDaRecebida(r, i, agora))
|
|
127
|
+
linhas.push({ tipo: 'dim', chave: 'limite', texto: 'A resposta do dono informa esta sessão; ação que só o dono aprova continua pedindo o dono.' })
|
|
128
|
+
return linhas
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* O que esta inteiro dentro da janela de rolagem do painel: so isso conta como mostrado ao dono (M5). Toda linha do
|
|
133
|
+
* painel trunca numa linha da tela, e a do titulo divide a linha com o botao.
|
|
134
|
+
*/
|
|
135
|
+
export function mostradosVisiveis(linhas: readonly LinhaDoMensageiro[], janela: { offset: number; bodyRows: number } | undefined): MensageiroMostrado[] {
|
|
136
|
+
if (!janela || !(janela.bodyRows > 0)) return []
|
|
137
|
+
const fim = janela.offset + janela.bodyRows
|
|
138
|
+
return linhas.flatMap((l, i) => (l.mostrado && i >= janela.offset && i < fim ? [l.mostrado] : []))
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export type Gestos = { atualizar?: () => void }
|
|
142
|
+
|
|
143
|
+
/** A arvore do painel com os elementos que a superficie resolveu. */
|
|
144
|
+
export function desenharPainel(el: { Box: any; Text: any; Button: any }, linhas: readonly LinhaDoMensageiro[], gestos: Gestos) {
|
|
145
|
+
const { Box, Text, Button } = el
|
|
146
|
+
return (
|
|
147
|
+
<Box flexDirection="column">
|
|
148
|
+
{linhas.map(l => {
|
|
149
|
+
if (l.tipo === 'titulo') {
|
|
150
|
+
return (
|
|
151
|
+
<Box key="titulo" flexDirection="row">
|
|
152
|
+
<Text key="titulo-texto" bold wrap="truncate">{l.texto}</Text>
|
|
153
|
+
<Button key="atualizar" label="Atualizar" onPress={() => gestos.atualizar?.()} />
|
|
154
|
+
</Box>
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
if (l.tipo === 'secao') return <Text key={l.chave} bold wrap="truncate">{l.texto}</Text>
|
|
158
|
+
if (l.tipo === 'falha') return <Text key={l.chave} color="error" wrap="truncate">{l.texto}</Text>
|
|
159
|
+
if (l.tipo === 'feito') return <Text key={l.chave} color="success" wrap="truncate">{l.texto}</Text>
|
|
160
|
+
if (l.tipo === 'dim') return <Text key={l.chave} dimColor wrap="truncate">{l.texto}</Text>
|
|
161
|
+
return <Text key={l.chave} wrap="truncate">{l.texto}</Text>
|
|
162
|
+
})}
|
|
163
|
+
</Box>
|
|
164
|
+
)
|
|
165
|
+
}
|