Infrastructure
SDK & CLI
Five npm packages and a CLI tool enabling sub-10-minute time-to-first-payment on testnet.
@reapp/sdk Package Architecture
Five packages covering the full REAPP stack. The CLI wraps all packages for developer tooling.
CLI Quickstart
CLI Quickstart Commands
npx reapp-cli init my-agent-project
cd my-agent-project
npx reapp-cli setup --network testnet
npx reapp-cli mandate create --budget 10 --asset USDC --period day --expiry 30d
npx reapp-cli pay --mandate M_abc123 --url 'http://localhost:3000/api/premium' --dry-run
npx reapp-cli demo research-agentTurborepo Monorepo Structure
The project uses Turborepo with pnpm workspaces — minimal config (~20 lines of turbo.json), aligned with the Vercel/Next.js ecosystem. Package exports use tsup for clean ESM builds.
Monorepo Directory Layout
reapp/
├── apps/
│ ├── demo/ # Next.js consumer demo
│ │ ├── app/api/chat/route.ts # AI SDK streaming endpoint
│ │ └── app/page.tsx # assistant-ui chat
│ └── docs/ # Documentation site
├── packages/
│ ├── core/ # @reapp/core — shared types, errors, config
│ ├── stellar/ # @reapp/stellar — x402 Stellar scheme
│ ├── sdk/ # @reapp/sdk — agent tools, provider registry
│ │ └── src/tools/ # send-payment, get-balance, swap tools
│ ├── ap2/ # @reapp/ap2 — TypeScript AP2 mandates
│ ├── chat-ui/ # @reapp/chat-ui — payment cards, wallet connect
│ ├── express-middleware/ # @reapp/express-middleware — x402 route gating
│ └── tsconfig/ # Shared TypeScript configs
├── turbo.json
├── pnpm-workspace.yaml
└── .changeset/Payment Provider Registry
The SDK uses a plugin/extension pattern for payment providers — a registry that auto-generates AI SDK tool definitions from registered providers:
Payment Provider Registry
// packages/sdk/src/providers/registry.ts
export interface PaymentProvider {
name: string;
chainType: 'stellar' | 'evm' | 'svm' | string;
sendPayment(params: PaymentParams): Promise<PaymentResult>;
getBalance(address: string, token: string): Promise<bigint>;
}
class PaymentProviderRegistry {
private providers = new Map<string, PaymentProvider>();
register(provider: PaymentProvider): void {
this.providers.set(provider.name, provider);
}
// Generate AI SDK tool definitions from all registered providers
toTools(): Record<string, ToolDefinition> {
const tools: Record<string, ToolDefinition> = {};
for (const [name, provider] of this.providers) {
tools[`${name}_sendPayment`] = {
description: `Send payment via ${name}`,
parameters: z.object({
recipient: z.string(),
amount: z.string(),
token: z.string(),
}),
execute: async (params) => provider.sendPayment(params),
};
}
return tools;
}
}Stellar SDK Integration
Built on @stellar/stellar-sdk v14.6.1. The v14+ generated typed contract clients eliminate manual XDR construction:
Stellar Typed Contract Client
# Generate typed contract client from deployed contract
npx @stellar/stellar-sdk generate \
--contract-id CABC...XYZ \
--rpc-url https://soroban-testnet.stellar.org \
--output-dir ./usdc-client
# Usage — fully typed with IDE autocompletion
import { Client } from './usdc-client';
import { basicNodeSigner } from '@stellar/stellar-sdk/contract';
const usdcClient = new Client({
contractId: 'CABC...XYZ',
networkPassphrase: Networks.TESTNET,
rpcUrl: 'https://soroban-testnet.stellar.org',
publicKey: keypair.publicKey(),
...basicNodeSigner(keypair, Networks.TESTNET),
});
await usdcClient.transfer({
from: 'GABC...', to: 'GDEF...',
amount: 10_0000000n, // 10 USDC, 7 decimals
});