SDK — @cactus-agents/* Packages
O SDK vive em front-cactus-core/, um monorepo pnpm com pnpm-workspace.yaml.
Os pacotes são publicados no GitHub Packages como registry npm privado da org cactus-agents.
Pacotes publicados
16 hoje — a lista viva é front-cactus-core/packages/*/package.json (nome + versão saem de lá).
| Pacote | Versão | Descrição |
|---|---|---|
@cactus-agents/accounts | 2.9.0 | Auth + conta do usuário + carteira. Sucessor de auth/user/wallet. Tem subpath /react com a store e os hooks |
@cactus-agents/api-client | 0.18.4 | HTTP client framework-agnostic (fetch), cache server/client, classificação de erros, refresh-on-401 |
@cactus-agents/brand | 0.8.0 | Transform API → BrandConfig |
@cactus-agents/country-config | 0.15.0 | Catálogo mundial de países, DDI, moedas, validadores de documento |
@cactus-agents/games | 2.2.1 | Casino games, páginas curadas, categorias, providers, start-game, votos, stats |
@cactus-agents/gamification | 0.13.0 | Smartico (logado + visitante) + módulo de rewards via BFF + helpers de display |
@cactus-agents/i18n | 0.103.0 | Traduções e namespaces (1 idioma por build) |
@cactus-agents/kyc | 0.10.0 | KYC service + helpers de status; subpaths /unico e /sumsub |
@cactus-agents/mocks | 1.3.0 | Deprecated. Todos os arquivos de src/ são stubs vazios — os mocks foram substituídos por integrações reais de API. Não é dependência de nenhum consumidor |
@cactus-agents/payments | 0.22.0 | Providers, depósito, saque, PIX/SPEI, bank-list, contas MX/CHL |
@cactus-agents/platform-cache | 0.14.0 | Engine de cache multi-camada (memory + CF Cache API + KV) |
@cactus-agents/sports | 0.6.0 | Sportsbook multi-provider (First, Altenar, Betby, Rogue) |
@cactus-agents/sweepstakes | 0.6.0 | Dual-currency GC/SC: saldos, troca de moeda, resgate, loja de Gold Coins |
@cactus-agents/types | 0.7.0 | Tipos canônicos compartilhados (só interfaces, zero lógica) |
@cactus-agents/utils | 1.3.0 | Helpers compartilhados (imagens/CDN, device, bot, player) |
@cactus-agents/validations | 0.8.0 | Engine de regras — force/regulatory/global + contexts, predicados |
:::caution auth, user e wallet não existem mais
Os três foram removidos do monorepo em 2026-04-17 (core 452450e) e unificados em @cactus-agents/accounts (eac3812). pnpm add @cactus-agents/auth falha. Os diretórios packages/{auth,user,wallet}/ que sobraram no repo não têm src/ nem package.json — são cascas de dist/ velho. Tabela de migração símbolo-a-símbolo em accounts.
:::
:::note Não todo @cactus-agents/* mora aqui
@cactus-agents/sports-rogue (^0.29.2 no front-web-base) é dependência real mas é publicada fora deste monorepo — não tem página nesta seção. @cactus-agents/sports só expõe o RogueProviderConfig; o SDK React do provider Rogue vem desse outro pacote. Logo, esta tabela não é a superfície completa do scope npm.
:::
Tooling
Cada pacote segue a mesma configuração:
- Build: tsup (ESM + CJS +
.d.ts) - Testes: Vitest
- TypeScript: strict mode
- Lint/format: Biome (versão pinada em
front-cactus-core/package.json→devDependencies["@biomejs/biome"]) - Pre-commit: Husky + lint-staged
Comandos
cd front-cactus-core
pnpm build # Build todos os pacotes
pnpm test # Rodar todos os testes
pnpm lint # Biome lint
Para rodar os testes de um pacote só:
cd packages/games && npx vitest run
Convenção de interface
Todos os pacotes que fazem HTTP seguem o padrão de fetcher injection, mantendo-os framework-agnostic. O fetcher mínimo é get + post:
interface BrandFetcher {
get(path: string): Promise<unknown>;
post(path: string, body: unknown): Promise<unknown>;
}
Alguns pacotes exigem mais verbos — UserFetcher (accounts) precisa de patch e delete, GamesFetcher precisa de delete.
Wrappers createXFromClient (recomendado)
Para quem usa o @cactus-agents/api-client, cada pacote expõe um wrapper de conveniência que aceita o ApiClient diretamente — sem montar o fetcher à mão:
import { createApiClient } from "@cactus-agents/api-client";
import {
createAuthFromClient,
createRecoveryFromClient,
createUserFromClient,
createWalletFromClient,
} from "@cactus-agents/accounts";
import { createBrandFromClient } from "@cactus-agents/brand";
import { createGamesFromClient } from "@cactus-agents/games";
import { createKycFromClient } from "@cactus-agents/kyc";
import { createPaymentsFromClient } from "@cactus-agents/payments";
import { createSportsFromClient } from "@cactus-agents/sports";
const client = createApiClient({ baseUrl, tenant, language });
const auth = createAuthFromClient(client);
const user = createUserFromClient(client);
const wallet = createWalletFromClient(client);
const recovery = createRecoveryFromClient(client);
const brand = await createBrandFromClient(client, { country: "BRA", language: "pt-br" });
const games = createGamesFromClient(client);
const payments = createPaymentsFromClient(client);
const kyc = createKycFromClient(client);
const sports = createSportsFromClient(client);
| Pacote | Wrapper | Função de baixo nível |
|---|---|---|
@cactus-agents/accounts | createAuthFromClient(client) | createAuthService(fetcher) |
@cactus-agents/accounts | createUserFromClient(client) | createUserService(fetcher) |
@cactus-agents/accounts | createWalletFromClient(client) | createWalletService(fetcher) |
@cactus-agents/accounts | createRecoveryFromClient(client) | createRecoveryService(fetcher) |
@cactus-agents/brand | createBrandFromClient(client, opts) | createBrandConfig(opts) |
@cactus-agents/games | createGamesFromClient(client) | createGamesService(fetcher) |
@cactus-agents/gamification | createRewardsFromClient(client) | createRewardsService(fetcher) |
@cactus-agents/kyc | createKycFromClient(client) | createKycService(fetcher) |
@cactus-agents/payments | createPaymentsFromClient(client) | createPaymentsService(fetcher) |
@cactus-agents/sports | createSportsFromClient(client) | createSportsService(fetcher) |
@cactus-agents/sweepstakes | createSweepstakesFromClient(client) | createSweepstakesService(fetcher) |
@cactus-agents/validations | — (import direto) | fetchAllValidations(input) |
Fetcher manual (baixo nível)
Para uso com HTTP clients arbitrários (não-ApiClient), injete um fetcher manualmente:
const brand = await createBrandConfig({
fetcher: { get: myClient.get, post: myClient.post },
country: "BRA",
language: "pt-br",
});