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-agent

Turborepo 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
});