Install, initialize, record, and verify agent actions in 5 steps.
npm install @invariance/sdkOr with pnpm:
pnpm add @invariance/sdkGenerate an Ed25519 keypair for signing receipts, then initialize the SDK:
import { Invariance } from '@invariance/sdk';
// Generate a signing keypair (do this once, store privateKey securely)
const { privateKey, publicKey } = Invariance.generateKeypair();
// Initialize the SDK
const inv = Invariance.init({
apiKey: process.env.INVARIANCE_API_KEY!,
privateKey: process.env.INVARIANCE_PRIVATE_KEY!,
});Sessions group related actions into hash-chained receipt sequences:
// Create a session (lazy — returns immediately)
const session = inv.session({
agent: 'my-agent',
name: 'task-run-1',
});
// Record actions — each receipt is hash-chained to the previous
await session.record({
action: 'search',
input: { query: 'latest AI papers' },
output: { resultCount: 15 },
});
await session.record({
action: 'summarize',
input: { paperId: 'arxiv-2024-001' },
output: { summary: 'This paper proposes...' },
});
// End the session — seals the chain
session.end();Use wrap() for policy-checked execution with automatic receipt creation:
// Configure policies at init
const inv = Invariance.init({
apiKey: process.env.INVARIANCE_API_KEY!,
privateKey: process.env.INVARIANCE_PRIVATE_KEY!,
policies: [
{ action: 'transfer', maxAmountUsd: 10000 },
{ action: 'swap', rateLimit: { max: 10, windowMs: 60000 } },
],
});
// wrap() checks policies → executes → records receipt
const { result, receipt } = await inv.wrap(
{
agent: 'trader',
action: 'swap',
input: { from: 'ETH', to: 'USDC', amount: '5' },
},
async () => {
// Your actual swap logic
return { txHash: '0xabc...', amountOut: '17500' };
},
);
console.log(result.txHash); // '0xabc...'
console.log(receipt.hash); // SHA-256 hash of the action
console.log(receipt.signature); // Ed25519 signatureVerify chain integrity and shut down gracefully:
import { verifyChain } from '@invariance/sdk';
// Fetch receipts and verify the hash chain
const receipts = await inv.query({ sessionId: session.id });
const verification = verifyChain(receipts);
console.log(verification.valid); // true
console.log(verification.receiptCount); // number of receipts
// Always shut down to flush remaining receipts
await inv.shutdown();