/** * Redis-backed SpendStore + DecisionLogStore. * * Install: `npm install @agentguard-run/spend ioredis` * * Multi-process spend tracking via INCR semantics. Decision log stored * on a Redis Stream for crash-safe ordered append. * * @example * import Redis from 'ioredis'; * import { RedisSpendStore, RedisDecisionLogStore } from '@agentguard-run/spend/dist/adapters/redis-store'; * * const redis = new Redis('redis://localhost:6379'); * const config = { * policy, * spendStore: new RedisSpendStore(redis, { keyPrefix: 'agentguard' }), * logStore: new RedisDecisionLogStore(redis, { streamKey: 'agentguard:log' }), * signingKeys: { privateKey, publicKey }, * }; */ import type { SignedDecisionLogEntry, SpendStore, DecisionLogStore, SpendWindow } from '../types'; type RedisLike = { get(key: string): Promise; incrby(key: string, increment: number): Promise; expire(key: string, seconds: number): Promise; set?(key: string, value: string | number): Promise; eval?(script: string, numKeys: number, ...args: any[]): Promise; xadd(key: string, ...args: any[]): Promise; xrevrange(key: string, end: string, start: string, ...args: any[]): Promise; xrange(key: string, start: string, end: string, ...args: any[]): Promise; }; export interface RedisSpendStoreOptions { keyPrefix?: string; } export declare class RedisSpendStore implements SpendStore { private redis; private prefix; constructor(redis: RedisLike, opts?: RedisSpendStoreOptions); private key; getWindowSpend(scopeKey: string, window: SpendWindow): Promise; incrementWindowSpend(scopeKey: string, window: SpendWindow, cents: number): Promise; reserveWindowSpend(scopeKey: string, window: SpendWindow, cents: number, limitCents: number): Promise<{ allowed: boolean; before: number; after: number; }>; settleWindowSpend(scopeKey: string, window: SpendWindow, deltaCents: number): Promise; } export interface RedisDecisionLogStoreOptions { streamKey?: string; } export declare class RedisDecisionLogStore implements DecisionLogStore { private redis; private stream; constructor(redis: RedisLike, opts?: RedisDecisionLogStoreOptions); append(entry: SignedDecisionLogEntry): Promise; getLatest(signerFingerprint?: string): Promise; read(fromSequence: number, limit: number, signerFingerprint?: string): Promise; } export {}; //# sourceMappingURL=redis-store.d.ts.map