kontext-sdk 0.3.2 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +169 -60
- package/dist/cli.js +5452 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +5428 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/index.d.mts +644 -3455
- package/dist/index.d.ts +644 -3455
- package/dist/index.js +3331 -8999
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3327 -8975
- package/dist/index.mjs.map +1 -1
- package/package.json +21 -12
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/integrations/usdc.ts","../src/commands/check.ts","../src/trust.ts","../src/types.ts","../src/anomaly.ts","../src/store.ts","../src/digest.ts","../src/logger.ts","../src/tasks.ts","../src/audit.ts","../src/integrations/payment-compliance.ts","../src/plans.ts","../src/plan-gate.ts","../src/exporters.ts","../src/feature-flags.ts","../src/client.ts","../src/storage.ts","../src/commands/verify.ts","../src/commands/reason.ts","../src/commands/cert.ts","../src/commands/audit.ts","../src/commands/sync.ts","../src/commands/mcp.ts","../src/cli.ts"],"names":["path","fs","createHash","path2","fs2","ENHANCED_DUE_DILIGENCE_THRESHOLD","REPORTING_THRESHOLD","LARGE_TRANSACTION_THRESHOLD","now","flag","path3","fs3","relative","GENESIS_HASH","fs4","verifyChainFromActions","init_audit","fs5","path4","Kontext","FileStorage","UsdcCompliance","runCheck","runVerify","runReason","runCert","runAudit","runSync","runMcp"],"mappings":"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","file":"cli.js","sourcesContent":["// ============================================================================\n// Kontext SDK - Utility Functions\n// ============================================================================\n\n/**\n * Generate a unique identifier.\n * Uses crypto.randomUUID when available, falls back to a timestamp-based ID.\n */\nexport function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback for environments without crypto.randomUUID\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}-${random}`;\n}\n\n/**\n * Generate an ISO 8601 timestamp string for the current moment.\n */\nexport function now(): string {\n return new Date().toISOString();\n}\n\n/**\n * Check whether a date falls within a given date range.\n */\nexport function isWithinDateRange(\n date: string | Date,\n start: Date,\n end: Date,\n): boolean {\n const d = typeof date === 'string' ? new Date(date) : date;\n return d >= start && d <= end;\n}\n\n/**\n * Parse a numeric string amount to a number, returning NaN for invalid inputs.\n */\nexport function parseAmount(amount: string): number {\n const parsed = parseFloat(amount);\n return parsed;\n}\n\n/**\n * Validate an Ethereum-style hex address.\n */\nexport function isValidAddress(address: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(address);\n}\n\n/**\n * Validate a transaction hash (64 hex characters with 0x prefix).\n */\nexport function isValidTxHash(hash: string): boolean {\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Convert an array of objects to a CSV string.\n */\nexport function toCsv(records: Record<string, unknown>[]): string {\n if (records.length === 0) return '';\n\n const firstRecord = records[0];\n if (!firstRecord) return '';\n\n const headers = Object.keys(firstRecord);\n const headerRow = headers.join(',');\n\n const rows = records.map((record) => {\n return headers\n .map((header) => {\n const value = record[header];\n if (value === null || value === undefined) return '';\n const str = typeof value === 'object' ? JSON.stringify(value) : String(value);\n // Escape CSV values containing commas, quotes, or newlines\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n })\n .join(',');\n });\n\n return [headerRow, ...rows].join('\\n');\n}\n\n/**\n * Determine the current hour (0-23) in UTC.\n */\nexport function getCurrentHourUtc(): number {\n return new Date().getUTCHours();\n}\n\n/**\n * Clamp a number between a minimum and maximum value.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n","// ============================================================================\n// Kontext SDK - USDC Integration\n// ============================================================================\n\nimport type {\n LogTransactionInput,\n UsdcComplianceCheck,\n ComplianceCheckResult,\n AnomalySeverity,\n Chain,\n} from '../types.js';\nimport { parseAmount } from '../utils.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/** Known USDC contract addresses on supported chains */\nconst USDC_CONTRACTS: Record<string, string> = {\n ethereum: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n polygon: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n arbitrum: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n optimism: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n // Arc (Circle's stablecoin-native blockchain) -- placeholder address, update when Arc mainnet launches\n arc: '0xa0c0000000000000000000000000000000000001',\n};\n\n/** USDC has 6 decimals */\nconst USDC_DECIMALS = 6;\n\n// ============================================================================\n// OFAC Sanctioned Addresses (from U.S. Treasury SDN List)\n// ============================================================================\n// These addresses are publicly listed on the OFAC Specially Designated\n// Nationals (SDN) list maintained by the U.S. Department of the Treasury.\n// Source: https://www.treasury.gov/ofac/downloads/sdnlist.txt\n// Last updated: 2025-03-21 (Tornado Cash delisted per Fifth Circuit ruling)\n//\n// NOTE: Tornado Cash smart contract addresses were REMOVED from the SDN list\n// on March 21, 2025. However, they are retained here for backward compatibility\n// and because the comprehensive OFACSanctionsScreener tracks them as DELISTED\n// entries for risk-scoring purposes.\n//\n// For the authoritative, current-status screening, use OFACSanctionsScreener\n// which distinguishes between active SDN entries and delisted entries.\n//\n// The SANCTIONED_ADDRESSES list below includes both active and formerly\n// sanctioned addresses for maximum backward compatibility.\n\n/** OFAC-sanctioned Ethereum addresses (includes both active SDN and delisted for compat) */\nlet SANCTIONED_ADDRESSES: string[] = [\n // --- ACTIVELY SANCTIONED (SDN) ---\n\n // Lazarus Group / DPRK (Ronin Bridge hack)\n '0x098B716B8Aaf21512996dC57EB0615e2383E2f96',\n '0xa0e1c89Ef1a489c9C7dE96311eD5Ce5D32c20E4B',\n '0x3Cffd56B47B7b41c56258D9C7731ABaDc360E460',\n '0x53b6936513e738f44FB50d2b9476730C0Ab3Bfc1',\n // Lazarus Group - Harmony/Stake.com hacks\n '0x4F47Bc496083C727c5fbe3CE9CDf2B0f6496270c',\n '0x0836222F2B2B24A3F36f98668Ed8F0B38D1a872f',\n // DPRK Cyber Operations\n '0x7F367cC41522cE07553e823bf3be79A889DEbe1B',\n '0x01e2919679362dFBC9ee1644Ba9C6da6D6245BB1',\n '0xc455f7fd3e0e12afd51fba5c106909934d8a0e4a',\n // Garantex exchange (sanctioned April 2022)\n '0x6F1cA141A28907F78Ebaa64f83E4AE6038d3cbe7',\n '0x2f389cE8bD8ff92De3402FFCe4691d17fC4f6535',\n '0x19Aa5Fe80D33a56D56c78e82eA5E50E5d80b4Dff',\n // Blender.io (sanctioned May 2022)\n '0x23773E65ed146A459791799d01336DB287f25334',\n // Roman Semenov (Tornado Cash developer - REMAINS sanctioned)\n '0xdcbEfFBECcE100cCE9E4b153C4e15cB885643193',\n '0x931546D9e66836AbF687d2bc64B30407bAc8C568',\n '0x43fa21d92141BA9db43052492E0DeEE5aa5f0A93',\n // Zedcex / Zedxion (IRGC-linked, sanctioned June 2024)\n '0xaeAAc358560e11f52454D997AAFF2c5731B6f8a6',\n\n // --- DELISTED (formerly sanctioned, retained for backward compat) ---\n\n // Tornado Cash contracts (sanctioned Aug 2022, DELISTED March 21, 2025)\n '0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b',\n '0xd96f2B1c14Db8458374d9Aca76E26c3D18364307',\n '0x4736dCf1b7A3d580672CcE6E7c65cd5cc9cFBfA9',\n '0xDD4c48C0B24039969fC16D1cdF626eaB821d3384',\n '0xd4B88Df4D29F5CedD6857912842cff3b20C8Cfa3',\n '0x910Cbd523D972eb0a6f4cAe4618aD62622b39DbF',\n '0xA160cdAB225685dA1d56aa342Ad8841c3b53f291',\n '0xFD8610d20aA15b7B2E3Be39B396a1bC3516c7144',\n '0xF60dD140cFf0706bAE9Cd734Ac3683731B816EeD',\n '0x22aaA7720ddd5388A3c0A3333430953C68f1849b',\n '0xBA214C1c1928a32Bffe790263E38B4Af9bFCD659',\n '0xb1C8094B234DcE6e03f10a5b673c1d8C69739A00',\n '0x527653eA119F3E6a1F5BD18fbF4714081D7B31ce',\n '0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2', // Tornado Cash Router\n '0x8589427373D6D84E98730D7795D8f6f8731FDA16', // Tornado Cash\n '0x722122dF12D4e14e13Ac3b6895a86e84145b6967', // Tornado Cash / Sinbad.io\n];\n\n/**\n * Pre-computed set of lowercased sanctioned addresses for O(1) lookups.\n * Initialized from hardcoded list, then merged with OFAC SLS cache if available.\n */\nlet SANCTIONED_SET: Set<string> = new Set(\n SANCTIONED_ADDRESSES.map((addr) => addr.toLowerCase()),\n);\n\n// Load cached OFAC SDN addresses from `kontext sync` if available\nfunction loadCachedSDN(): void {\n try {\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const cachePath = path.join(dataDir, 'ofac-sdn-cache.json');\n if (fs.existsSync(cachePath)) {\n const cache = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));\n if (Array.isArray(cache.addresses)) {\n for (const addr of cache.addresses) {\n SANCTIONED_SET.add(String(addr).toLowerCase());\n }\n }\n }\n } catch {\n // Cache not available — fall back to hardcoded list\n }\n}\nloadCachedSDN();\n\n/** Threshold amounts that trigger enhanced due diligence (GENIUS Act aligned) */\nconst ENHANCED_DUE_DILIGENCE_THRESHOLD = 3000;\nconst REPORTING_THRESHOLD = 10000;\nconst LARGE_TRANSACTION_THRESHOLD = 50000;\n\n/** Sanctions list identifiers for compliance reporting */\nconst SANCTIONS_LIST_ID = 'OFAC_SDN';\n\n/**\n * Result of a sanctions check with list matching details.\n */\nexport interface SanctionsCheckResult {\n /** Whether the address is sanctioned */\n sanctioned: boolean;\n /** The address that was checked */\n address: string;\n /** Which sanctions list matched (if any) */\n listMatch: string | null;\n /** Matched sanctioned address (original case) */\n matchedAddress: string | null;\n}\n\n/**\n * USDC-specific compliance helper functions.\n *\n * Provides pre-built compliance checks for USDC transactions on Base and\n * Ethereum, aligned with the GENIUS Act requirements for stablecoin transfers.\n *\n * Checks include:\n * - Token validation (is it USDC?)\n * - Chain support validation\n * - Amount threshold checks (EDD, reporting, large tx)\n * - Address format validation\n * - Sanctions screening against OFAC SDN list\n * - Transfer limit checks\n */\nexport class UsdcCompliance {\n /**\n * Run a full compliance check on a USDC transaction.\n *\n * @param tx - Transaction to evaluate\n * @returns UsdcComplianceCheck with pass/fail results and recommendations\n *\n * @example\n * ```typescript\n * const check = UsdcCompliance.checkTransaction({\n * txHash: '0x...',\n * chain: 'base',\n * amount: '5000',\n * token: 'USDC',\n * from: '0xSender...',\n * to: '0xReceiver...',\n * agentId: 'agent-1',\n * });\n * if (!check.compliant) {\n * console.log('Non-compliant:', check.recommendations);\n * }\n * ```\n */\n static checkTransaction(tx: LogTransactionInput): UsdcComplianceCheck {\n const checks: ComplianceCheckResult[] = [];\n\n checks.push(UsdcCompliance.checkTokenType(tx));\n checks.push(UsdcCompliance.checkChainSupport(tx.chain!));\n checks.push(UsdcCompliance.checkAddressFormat(tx.from, 'sender'));\n checks.push(UsdcCompliance.checkAddressFormat(tx.to, 'recipient'));\n checks.push(UsdcCompliance.checkAmountValid(tx.amount));\n checks.push(UsdcCompliance.checkSanctions(tx.from, 'sender'));\n checks.push(UsdcCompliance.checkSanctions(tx.to, 'recipient'));\n checks.push(UsdcCompliance.checkEnhancedDueDiligence(tx.amount));\n checks.push(UsdcCompliance.checkReportingThreshold(tx.amount));\n\n const failedChecks = checks.filter((c) => !c.passed);\n const compliant = failedChecks.every((c) => c.severity === 'low');\n\n const highestSeverity = failedChecks.reduce<AnomalySeverity>(\n (max, c) => {\n const order: AnomalySeverity[] = ['low', 'medium', 'high', 'critical'];\n return order.indexOf(c.severity) > order.indexOf(max) ? c.severity : max;\n },\n 'low',\n );\n\n const recommendations = UsdcCompliance.generateRecommendations(checks, tx);\n\n return {\n compliant,\n checks,\n riskLevel: highestSeverity,\n recommendations,\n };\n }\n\n /**\n * Check whether an address is on the OFAC sanctions list.\n * Performs case-insensitive full address matching.\n *\n * @param address - The Ethereum address to check\n * @returns true if the address is sanctioned\n *\n * @example\n * ```typescript\n * if (UsdcCompliance.isSanctioned('0x722122dF12D4e14e13Ac3b6895a86e84145b6967')) {\n * console.log('Address is OFAC sanctioned!');\n * }\n * ```\n */\n static isSanctioned(address: string): boolean {\n return SANCTIONED_SET.has(address.toLowerCase());\n }\n\n /**\n * Perform a detailed sanctions check that returns which list matched.\n *\n * @param address - The Ethereum address to check\n * @returns SanctionsCheckResult with match details\n */\n static checkSanctionsDetailed(address: string): SanctionsCheckResult {\n const lower = address.toLowerCase();\n const isSanctioned = SANCTIONED_SET.has(lower);\n\n let matchedAddress: string | null = null;\n if (isSanctioned) {\n matchedAddress = SANCTIONED_ADDRESSES.find(\n (a) => a.toLowerCase() === lower,\n ) ?? null;\n }\n\n return {\n sanctioned: isSanctioned,\n address,\n listMatch: isSanctioned ? SANCTIONS_LIST_ID : null,\n matchedAddress,\n };\n }\n\n /**\n * Get all known sanctioned addresses.\n *\n * @returns Array of sanctioned addresses\n */\n static getSanctionedAddresses(): string[] {\n return [...SANCTIONED_ADDRESSES];\n }\n\n /**\n * Get the USDC contract address for a given chain.\n *\n * @param chain - The blockchain network\n * @returns The USDC contract address, or undefined for unsupported chains\n */\n static getContractAddress(chain: Chain): string | undefined {\n return USDC_CONTRACTS[chain];\n }\n\n /**\n * Get the chains supported for USDC compliance monitoring.\n */\n static getSupportedChains(): Chain[] {\n return Object.keys(USDC_CONTRACTS) as Chain[];\n }\n\n /**\n * Add new sanctioned addresses at runtime.\n * Normalizes all addresses to lowercase for consistent matching.\n * Skips addresses that are already in the list.\n *\n * @param addresses - Array of Ethereum addresses to add\n * @returns The count of newly added addresses (excluding duplicates)\n */\n static addSanctionedAddresses(addresses: string[]): number {\n let added = 0;\n for (const addr of addresses) {\n const lower = addr.toLowerCase();\n if (!SANCTIONED_SET.has(lower)) {\n SANCTIONED_ADDRESSES.push(addr);\n SANCTIONED_SET.add(lower);\n added++;\n }\n }\n return added;\n }\n\n /**\n * Replace the entire sanctioned addresses list at runtime.\n * Clears existing entries and rebuilds from the provided array.\n *\n * @param addresses - The new complete list of sanctioned addresses\n */\n static replaceSanctionedAddresses(addresses: string[]): void {\n SANCTIONED_ADDRESSES.length = 0;\n SANCTIONED_ADDRESSES.push(...addresses);\n SANCTIONED_SET.clear();\n for (const addr of addresses) {\n SANCTIONED_SET.add(addr.toLowerCase());\n }\n }\n\n /**\n * Get the current number of addresses in the sanctions list.\n *\n * @returns The size of the current sanctions list\n */\n static getSanctionsListSize(): number {\n return SANCTIONED_SET.size;\n }\n\n // --------------------------------------------------------------------------\n // Individual compliance checks\n // --------------------------------------------------------------------------\n\n private static checkTokenType(tx: LogTransactionInput): ComplianceCheckResult {\n const isUsdc = tx.token === 'USDC';\n return {\n name: 'token_type',\n passed: isUsdc,\n description: isUsdc\n ? 'Transaction token is USDC'\n : `Expected USDC but got ${tx.token}`,\n severity: isUsdc ? 'low' : 'high',\n };\n }\n\n private static checkChainSupport(chain: Chain): ComplianceCheckResult {\n const supported = chain in USDC_CONTRACTS;\n return {\n name: 'chain_support',\n passed: supported,\n description: supported\n ? `Chain ${chain} is supported for USDC compliance monitoring`\n : `Chain ${chain} is not in the supported USDC compliance list`,\n severity: supported ? 'low' : 'medium',\n };\n }\n\n private static checkAddressFormat(\n address: string,\n label: string,\n ): ComplianceCheckResult {\n const isValid = /^0x[a-fA-F0-9]{40}$/.test(address);\n return {\n name: `address_format_${label}`,\n passed: isValid,\n description: isValid\n ? `${label} address format is valid`\n : `${label} address format is invalid: ${address}`,\n severity: isValid ? 'low' : 'high',\n };\n }\n\n private static checkAmountValid(amount: string): ComplianceCheckResult {\n const parsed = parseAmount(amount);\n const isValid = !isNaN(parsed) && parsed > 0;\n return {\n name: 'amount_valid',\n passed: isValid,\n description: isValid\n ? `Transaction amount ${amount} is valid`\n : `Transaction amount ${amount} is invalid`,\n severity: isValid ? 'low' : 'critical',\n };\n }\n\n private static checkSanctions(\n address: string,\n label: string,\n ): ComplianceCheckResult {\n const result = UsdcCompliance.checkSanctionsDetailed(address);\n\n if (result.sanctioned) {\n console.warn(\n `[Kontext] SANCTIONS WARNING: ${label} address ${address} matches ${result.listMatch} sanctioned address ${result.matchedAddress}`,\n );\n }\n\n return {\n name: `sanctions_${label}`,\n passed: !result.sanctioned,\n description: result.sanctioned\n ? `${label} address ${address} matches ${result.listMatch} sanctioned address`\n : `${label} address passed sanctions screening`,\n severity: result.sanctioned ? 'critical' : 'low',\n };\n }\n\n private static checkEnhancedDueDiligence(amount: string): ComplianceCheckResult {\n const parsed = parseAmount(amount);\n const requiresEdd = !isNaN(parsed) && parsed >= ENHANCED_DUE_DILIGENCE_THRESHOLD;\n\n return {\n name: 'enhanced_due_diligence',\n passed: true, // This is informational -- it always \"passes\" but flags the need\n description: requiresEdd\n ? `Amount ${amount} USDC requires enhanced due diligence (threshold: ${ENHANCED_DUE_DILIGENCE_THRESHOLD})`\n : `Amount ${amount} USDC is below enhanced due diligence threshold`,\n severity: requiresEdd ? 'medium' : 'low',\n };\n }\n\n private static checkReportingThreshold(amount: string): ComplianceCheckResult {\n const parsed = parseAmount(amount);\n const requiresReporting = !isNaN(parsed) && parsed >= REPORTING_THRESHOLD;\n const isLarge = !isNaN(parsed) && parsed >= LARGE_TRANSACTION_THRESHOLD;\n\n let description: string;\n let severity: AnomalySeverity;\n\n if (isLarge) {\n description = `Amount ${amount} USDC is a large transaction (>= ${LARGE_TRANSACTION_THRESHOLD}) -- requires enhanced monitoring`;\n severity = 'high';\n } else if (requiresReporting) {\n description = `Amount ${amount} USDC meets reporting threshold (>= ${REPORTING_THRESHOLD})`;\n severity = 'medium';\n } else {\n description = `Amount ${amount} USDC is below reporting threshold`;\n severity = 'low';\n }\n\n return {\n name: 'reporting_threshold',\n passed: true, // Informational\n description,\n severity,\n };\n }\n\n // --------------------------------------------------------------------------\n // Recommendations\n // --------------------------------------------------------------------------\n\n private static generateRecommendations(\n checks: ComplianceCheckResult[],\n tx: LogTransactionInput,\n ): string[] {\n const recommendations: string[] = [];\n const amount = parseAmount(tx.amount);\n\n // Check for failed critical checks\n const criticalFailures = checks.filter(\n (c) => !c.passed && c.severity === 'critical',\n );\n if (criticalFailures.length > 0) {\n recommendations.push('BLOCK: Critical compliance check failures detected. Do not proceed.');\n }\n\n // Sanctions-specific recommendations\n const sanctionsFailures = checks.filter(\n (c) => c.name.startsWith('sanctions_') && !c.passed,\n );\n if (sanctionsFailures.length > 0) {\n recommendations.push(\n 'BLOCK: Address matches OFAC SDN sanctioned entity. Transaction is prohibited under U.S. law.',\n );\n }\n\n // Amount-based recommendations\n if (!isNaN(amount)) {\n if (amount >= LARGE_TRANSACTION_THRESHOLD) {\n recommendations.push(\n 'Require manual review for large transaction per GENIUS Act Section 4(b).',\n );\n recommendations.push('Verify recipient identity through KYC process.');\n recommendations.push('Document business purpose for the transfer.');\n } else if (amount >= REPORTING_THRESHOLD) {\n recommendations.push(\n 'Generate Currency Transaction Report (CTR) per BSA requirements.',\n );\n recommendations.push('Retain transaction records for minimum 5 years.');\n } else if (amount >= ENHANCED_DUE_DILIGENCE_THRESHOLD) {\n recommendations.push(\n 'Enhanced due diligence recommended -- verify transaction purpose.',\n );\n }\n }\n\n // Address-based recommendations\n const addressFailures = checks.filter(\n (c) => c.name.startsWith('address_format') && !c.passed,\n );\n if (addressFailures.length > 0) {\n recommendations.push('Verify address format before proceeding.');\n }\n\n // Default recommendation for clean transactions\n if (recommendations.length === 0) {\n recommendations.push('Transaction passes all compliance checks. Safe to proceed.');\n }\n\n return recommendations;\n }\n}\n","// ============================================================================\n// kontext check — stateless OFAC + threshold compliance check\n// ============================================================================\n\nimport { UsdcCompliance } from '../integrations/usdc.js';\nimport type { Token, Chain } from '../types.js';\n\ninterface CheckArgs {\n from: string;\n to?: string;\n amount: string;\n token: Token;\n json: boolean;\n}\n\nexport function runCheck(args: CheckArgs): void {\n // Single address mode: screen one address against OFAC\n if (!args.to) {\n const sanctioned = UsdcCompliance.isSanctioned(args.from);\n const detailed = UsdcCompliance.checkSanctionsDetailed(args.from);\n\n if (args.json) {\n const output = {\n address: args.from,\n sanctioned,\n ...detailed,\n };\n process.stdout.write(JSON.stringify(output, null, 2) + '\\n');\n } else {\n process.stdout.write(`Address: ${args.from}\\n`);\n process.stdout.write(`OFAC Sanctions: ${sanctioned ? 'SANCTIONED' : 'CLEAR'}\\n`);\n }\n\n if (sanctioned) {\n process.exit(1);\n }\n return;\n }\n\n // Two address mode: full compliance check (OFAC + thresholds)\n const result = UsdcCompliance.checkTransaction({\n txHash: '0x0000000000000000000000000000000000000000000000000000000000000000',\n chain: 'base' as Chain,\n amount: args.amount,\n token: args.token,\n from: args.from,\n to: args.to,\n agentId: 'cli',\n });\n\n if (args.json) {\n const output = {\n compliant: result.compliant,\n riskLevel: result.riskLevel,\n checks: result.checks.map((c) => ({\n name: c.name,\n passed: c.passed,\n description: c.description,\n severity: c.severity,\n })),\n recommendations: result.recommendations,\n };\n process.stdout.write(JSON.stringify(output, null, 2) + '\\n');\n } else {\n const amount = parseFloat(args.amount);\n\n // OFAC sanctions\n const senderSanctioned = result.checks.find((c) => c.name === 'sanctions_sender');\n const recipientSanctioned = result.checks.find((c) => c.name === 'sanctions_recipient');\n const anySanctioned = (senderSanctioned && !senderSanctioned.passed) || (recipientSanctioned && !recipientSanctioned.passed);\n process.stdout.write(`OFAC Sanctions: ${anySanctioned ? 'SANCTIONED' : 'CLEAR'}\\n`);\n\n // Travel Rule / EDD threshold ($3,000)\n const eddTriggered = !isNaN(amount) && amount >= 3000;\n if (eddTriggered) {\n process.stdout.write(`Travel Rule: TRIGGERED ($${amount.toLocaleString()} >= $3,000 EDD threshold)\\n`);\n } else {\n process.stdout.write(`Travel Rule: CLEAR ($${amount.toLocaleString()} < $3,000)\\n`);\n }\n\n // CTR threshold ($10,000)\n const ctrTriggered = !isNaN(amount) && amount >= 10000;\n if (ctrTriggered) {\n process.stdout.write(`CTR Threshold: TRIGGERED ($${amount.toLocaleString()} >= $10,000)\\n`);\n } else {\n process.stdout.write(`CTR Threshold: CLEAR ($${amount.toLocaleString()} < $10,000)\\n`);\n }\n\n // Large TX alert ($50,000)\n const largeTriggered = !isNaN(amount) && amount >= 50000;\n if (largeTriggered) {\n process.stdout.write(`Large TX Alert: TRIGGERED ($${amount.toLocaleString()} >= $50,000)\\n`);\n } else {\n process.stdout.write(`Large TX Alert: CLEAR ($${amount.toLocaleString()} < $50,000)\\n`);\n }\n\n // Risk level\n process.stdout.write(`Risk Level: ${result.riskLevel}\\n`);\n }\n\n // Exit code: 0 = clear, 1 = compliance failure\n if (!result.compliant) {\n process.exit(1);\n }\n}\n","// ============================================================================\n// Kontext SDK - Trust Scoring\n// ============================================================================\n\nimport type {\n TrustScore,\n TrustFactor,\n TransactionEvaluation,\n RiskFactor,\n LogTransactionInput,\n KontextConfig,\n ActionLog,\n TransactionRecord,\n Task,\n AnomalyEvent,\n} from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now, parseAmount, clamp } from './utils.js';\n\n// ============================================================================\n// Named constants — trust level thresholds\n//\n// Trust levels map numeric scores to human-readable labels. The thresholds\n// are calibrated so that:\n// - \"verified\" (90+) requires sustained clean history across all factors\n// - \"high\" (70+) is achievable with good task completion and low anomalies\n// - \"medium\" (50+) is the default/neutral zone for new agents with some history\n// - \"low\" (30+) indicates concerning anomaly rates or poor task completion\n// - \"untrusted\" (<30) signals repeated failures or high-severity anomalies\n// ============================================================================\n\nconst TRUST_LEVEL_VERIFIED = 90;\nconst TRUST_LEVEL_HIGH = 70;\nconst TRUST_LEVEL_MEDIUM = 50;\nconst TRUST_LEVEL_LOW = 30;\n\n// ============================================================================\n// Named constants — risk thresholds\n//\n// Transaction risk thresholds determine automated actions:\n// - FLAG (60+): Transaction is marked for human review in the audit trail\n// - BLOCK (80+): Transaction should be rejected or held pending manual approval\n// - REVIEW (50+): Transaction is flagged as \"review\" but not blocked\n//\n// These align with common fintech risk tiers where 60+ is \"medium-high\"\n// risk and 80+ is \"high\" risk. The gap between REVIEW (50) and FLAG (60)\n// allows a soft warning zone before hard flagging.\n// ============================================================================\n\nconst RISK_FLAG_THRESHOLD = 60;\nconst RISK_BLOCK_THRESHOLD = 80;\nconst RISK_REVIEW_THRESHOLD = 50;\n\n// ============================================================================\n// Named constants — trust factor weights\n//\n// Factor weights reflect the relative importance of each trust signal:\n// - TASK_COMPLETION (0.25) and ANOMALY (0.25) are weighted highest because\n// they are the strongest behavioral indicators of agent reliability\n// - TX_CONSISTENCY (0.20) captures spending pattern regularity, which is\n// a key anti-money-laundering signal\n// - HISTORY (0.15) and COMPLIANCE (0.15) provide baseline context but are\n// less discriminating on their own — a long history doesn't guarantee\n// trustworthiness, and compliance is partially captured by other factors\n//\n// Weights sum to 1.0. The weighted average is normalized by total weight\n// so adding/removing factors doesn't skew scores.\n// ============================================================================\n\nconst WEIGHT_HISTORY = 0.15;\nconst WEIGHT_TASK_COMPLETION = 0.25;\nconst WEIGHT_ANOMALY = 0.25;\nconst WEIGHT_TX_CONSISTENCY = 0.20;\nconst WEIGHT_COMPLIANCE = 0.15;\n\n// ============================================================================\n// Pre-fetched agent data interface (avoids redundant store queries)\n// ============================================================================\n\n/** Pre-fetched data for a single agent, passed to factor methods to avoid redundant store queries. */\nexport interface AgentData {\n actions: ActionLog[];\n transactions: TransactionRecord[];\n tasks: Task[];\n anomalies: AnomalyEvent[];\n}\n\n/**\n * TrustScorer computes trust scores for agents and risk scores for transactions.\n *\n * This MVP implementation uses rule-based scoring across multiple factors:\n * - **History depth**: More transaction history = higher trust.\n * - **Task completion rate**: Higher completion rate = higher trust.\n * - **Anomaly frequency**: Fewer anomalies = higher trust.\n * - **Transaction consistency**: Consistent patterns = higher trust.\n * - **Compliance adherence**: Following compliance rules = higher trust.\n *\n * Scores range from 0-100 with levels: untrusted, low, medium, high, verified.\n *\n * In a production system, these rules would be augmented with ML-based scoring,\n * graph analysis, and external reputation data.\n */\nexport class TrustScorer {\n private readonly config: KontextConfig;\n private readonly store: KontextStore;\n\n constructor(config: KontextConfig, store: KontextStore) {\n this.config = config;\n this.store = store;\n }\n\n /**\n * Compute the trust score for a given agent.\n *\n * @param agentId - The agent identifier\n * @returns TrustScore with overall score, factor breakdown, and trust level\n *\n * @example\n * ```typescript\n * const score = await scorer.getTrustScore('payment-agent-1');\n * console.log(`Trust: ${score.score}/100 (${score.level})`);\n * ```\n */\n async getTrustScore(agentId: string): Promise<TrustScore> {\n const factors = this.computeAgentFactors(agentId);\n\n const weightedScore = factors.reduce((sum, f) => sum + f.score * f.weight, 0);\n const totalWeight = factors.reduce((sum, f) => sum + f.weight, 0);\n const score = totalWeight > 0 ? Math.round(weightedScore / totalWeight) : 50;\n const clampedScore = clamp(score, 0, 100);\n\n return {\n agentId,\n score: clampedScore,\n factors,\n computedAt: now(),\n level: this.scoreToLevel(clampedScore),\n };\n }\n\n /**\n * Evaluate the risk of a specific transaction.\n *\n * @param tx - Transaction input to evaluate\n * @returns TransactionEvaluation with risk score, factors, and recommendation\n *\n * @example\n * ```typescript\n * const eval = await scorer.evaluateTransaction({\n * txHash: '0x...',\n * chain: 'base',\n * amount: '50000',\n * token: 'USDC',\n * from: '0xSender',\n * to: '0xReceiver',\n * agentId: 'agent-1',\n * });\n * if (eval.flagged) console.log('Transaction flagged for review');\n * ```\n */\n async evaluateTransaction(tx: LogTransactionInput): Promise<TransactionEvaluation> {\n const factors = this.computeTransactionRiskFactors(tx);\n\n const totalScore = factors.reduce((sum, f) => sum + f.score, 0);\n const riskScore = clamp(Math.round(totalScore / Math.max(factors.length, 1)), 0, 100);\n\n const riskLevel = this.riskScoreToLevel(riskScore);\n const flagged = riskScore >= RISK_FLAG_THRESHOLD;\n const recommendation = riskScore >= RISK_BLOCK_THRESHOLD ? 'block' as const\n : riskScore >= RISK_REVIEW_THRESHOLD ? 'review' as const\n : 'approve' as const;\n\n return {\n ...(tx.txHash ? { txHash: tx.txHash } : {}),\n riskScore,\n riskLevel,\n factors,\n flagged,\n recommendation,\n evaluatedAt: now(),\n };\n }\n\n // --------------------------------------------------------------------------\n // Agent trust factor computation\n // --------------------------------------------------------------------------\n\n private computeAgentFactors(agentId: string): TrustFactor[] {\n // Query the store ONCE for all agent data (reduces ~8 scans to 4)\n const data: AgentData = {\n actions: this.store.getActionsByAgent(agentId),\n transactions: this.store.getTransactionsByAgent(agentId),\n tasks: this.store.queryTasks((t) => t.agentId === agentId),\n anomalies: this.store.queryAnomalies((a) => a.agentId === agentId),\n };\n\n return [\n this.computeHistoryDepthFactor(data),\n this.computeTaskCompletionFactor(data),\n this.computeAnomalyFrequencyFactor(data),\n this.computeTransactionConsistencyFactor(data),\n this.computeComplianceAdherenceFactor(data),\n ];\n }\n\n /**\n * History depth factor: more recorded actions = more data to assess trust.\n *\n * Scoring curve (step function, not linear) prevents gaming by spamming\n * low-value actions — crossing each tier requires meaningfully more history:\n * - 0 actions → 10 (minimal trust, new agent)\n * - 1-4 → 30 (some activity but too little to draw conclusions)\n * - 5-19 → 50 (neutral, moderate activity)\n * - 20-49 → 70 (established agent with reasonable track record)\n * - 50-99 → 85 (well-established agent)\n * - 100+ → 95 (capped below 100 because history alone doesn't guarantee trust)\n */\n private computeHistoryDepthFactor(data: AgentData): TrustFactor {\n const count = data.actions.length;\n\n let score: number;\n if (count === 0) score = 10;\n else if (count < 5) score = 30;\n else if (count < 20) score = 50;\n else if (count < 50) score = 70;\n else if (count < 100) score = 85;\n else score = 95;\n\n return {\n name: 'history_depth',\n score,\n weight: WEIGHT_HISTORY,\n description: `Agent has ${count} recorded actions`,\n };\n }\n\n /**\n * Task completion factor: agents that confirm tasks build trust, failures erode it.\n *\n * Formula: score = (completionRate * 100) - (failureRate * 30)\n * - The 30x failure penalty means each failure costs 3x more than a confirmation gains.\n * This asymmetry reflects real-world trust: it takes many good actions to build trust\n * but only a few failures to lose it.\n * - Returns 50 (neutral) when no tasks exist, avoiding penalizing new agents.\n */\n private computeTaskCompletionFactor(data: AgentData): TrustFactor {\n const totalTasks = data.tasks.length;\n\n if (totalTasks === 0) {\n return {\n name: 'task_completion',\n score: 50, // Neutral if no tasks\n weight: WEIGHT_TASK_COMPLETION,\n description: 'No tasks recorded yet',\n };\n }\n\n const confirmed = data.tasks.filter((t) => t.status === 'confirmed').length;\n const failed = data.tasks.filter((t) => t.status === 'failed').length;\n const completionRate = confirmed / totalTasks;\n const failureRate = failed / totalTasks;\n\n // High completion and low failure = high trust\n const score = Math.round(completionRate * 100 - failureRate * 30);\n\n return {\n name: 'task_completion',\n score: clamp(score, 0, 100),\n weight: WEIGHT_TASK_COMPLETION,\n description: `${confirmed}/${totalTasks} tasks confirmed (${Math.round(completionRate * 100)}% rate)`,\n };\n }\n\n /**\n * Anomaly frequency factor: fewer anomalies relative to total actions = higher trust.\n *\n * Uses anomaly rate (anomalies / actions) with step-function scoring:\n * - 0% → 100 (clean record)\n * - <1% → 90 (near-perfect, occasional false positive acceptable)\n * - <5% → 70 (some noise but generally clean)\n * - <10% → 50 (neutral, warrants monitoring)\n * - <25% → 30 (concerning pattern)\n * - 25%+ → 10 (severe anomaly rate)\n *\n * Critical anomalies incur a -15 point penalty each, high anomalies -8 each.\n * This severity weighting ensures a single critical anomaly (e.g., sanctions hit)\n * has outsized impact compared to multiple low-severity anomalies.\n */\n private computeAnomalyFrequencyFactor(data: AgentData): TrustFactor {\n const anomalyCount = data.anomalies.length;\n const actionCount = data.actions.length;\n\n if (actionCount === 0) {\n return {\n name: 'anomaly_frequency',\n score: 50,\n weight: WEIGHT_ANOMALY,\n description: 'No actions recorded yet',\n };\n }\n\n const anomalyRate = anomalyCount / actionCount;\n\n // Fewer anomalies = higher score\n let score: number;\n if (anomalyRate === 0) score = 100;\n else if (anomalyRate < 0.01) score = 90;\n else if (anomalyRate < 0.05) score = 70;\n else if (anomalyRate < 0.1) score = 50;\n else if (anomalyRate < 0.25) score = 30;\n else score = 10;\n\n // Weight critical anomalies more heavily\n const criticalCount = data.anomalies.filter((a) => a.severity === 'critical').length;\n const highCount = data.anomalies.filter((a) => a.severity === 'high').length;\n const penaltyFromSeverity = criticalCount * 15 + highCount * 8;\n\n return {\n name: 'anomaly_frequency',\n score: clamp(score - penaltyFromSeverity, 0, 100),\n weight: WEIGHT_ANOMALY,\n description: `${anomalyCount} anomalies across ${actionCount} actions (${Math.round(anomalyRate * 100)}% rate)`,\n };\n }\n\n /**\n * Transaction consistency factor: stable spending patterns indicate legitimate usage.\n *\n * Uses the coefficient of variation (CV = stdDev / mean) to measure amount regularity:\n * - CV < 0.1 → 95 (extremely consistent, e.g., recurring payroll)\n * - CV < 0.3 → 80 (fairly consistent with some variance)\n * - CV < 0.5 → 65 (moderate variance, common for operational spending)\n * - CV < 1.0 → 45 (high variance, warrants attention)\n * - CV < 2.0 → 30 (very erratic, potential structuring)\n * - CV 2.0+ → 15 (extreme variance, strong structuring indicator)\n *\n * Also penalizes -15 points when >80% of destinations are unique with >5 txs,\n * which is a common money-laundering pattern (spray-and-pray distribution).\n */\n private computeTransactionConsistencyFactor(data: AgentData): TrustFactor {\n const transactions = data.transactions;\n\n if (transactions.length < 2) {\n return {\n name: 'transaction_consistency',\n score: 50,\n weight: WEIGHT_TX_CONSISTENCY,\n description: 'Insufficient transaction history for consistency analysis',\n };\n }\n\n // Analyze amount consistency (standard deviation relative to mean)\n const amounts = transactions.map((t) => parseAmount(t.amount)).filter((a) => !isNaN(a));\n\n if (amounts.length < 2) {\n return {\n name: 'transaction_consistency',\n score: 50,\n weight: WEIGHT_TX_CONSISTENCY,\n description: 'Insufficient valid amounts for consistency analysis',\n };\n }\n\n const mean = amounts.reduce((sum, a) => sum + a, 0) / amounts.length;\n const variance = amounts.reduce((sum, a) => sum + Math.pow(a - mean, 2), 0) / amounts.length;\n const stdDev = Math.sqrt(variance);\n const cv = mean > 0 ? stdDev / mean : 0; // Coefficient of variation\n\n // Lower CV = more consistent = higher score\n let score: number;\n if (cv < 0.1) score = 95;\n else if (cv < 0.3) score = 80;\n else if (cv < 0.5) score = 65;\n else if (cv < 1.0) score = 45;\n else if (cv < 2.0) score = 30;\n else score = 15;\n\n // Check for unique destination consistency\n const destinations = new Set(transactions.map((t) => t.to));\n const destRatio = destinations.size / transactions.length;\n // Many unique destinations with few transactions = less consistent\n if (destRatio > 0.8 && transactions.length > 5) {\n score = Math.max(score - 15, 0);\n }\n\n return {\n name: 'transaction_consistency',\n score: clamp(score, 0, 100),\n weight: WEIGHT_TX_CONSISTENCY,\n description: `CV=${cv.toFixed(2)}, ${destinations.size} unique destinations across ${transactions.length} transactions`,\n };\n }\n\n /**\n * Compliance adherence factor: agents that follow the task-confirm-evidence workflow\n * demonstrate higher operational integrity.\n *\n * Scoring:\n * - Base score: 50 (neutral)\n * - +30 max for evidence rate (confirmedTasksWithEvidence / confirmedTasks)\n * - +20 max for coverage rate (tasks / transactions, capped at 1.0)\n *\n * The rationale: tasks with evidence prove the agent completed auditable work.\n * Coverage rate measures what fraction of financial activity has corresponding\n * task tracking — higher coverage means better compliance discipline.\n */\n private computeComplianceAdherenceFactor(data: AgentData): TrustFactor {\n const { tasks, transactions } = data;\n\n // Check how many transactions have corresponding confirmed tasks\n const confirmedTasks = tasks.filter((t) => t.status === 'confirmed');\n const tasksWithEvidence = confirmedTasks.filter(\n (t) => t.providedEvidence !== null && Object.keys(t.providedEvidence).length > 0,\n );\n\n let score = 50; // Base score\n\n // Bonus for having tasks with evidence\n if (confirmedTasks.length > 0) {\n const evidenceRate = tasksWithEvidence.length / confirmedTasks.length;\n score += Math.round(evidenceRate * 30);\n }\n\n // Bonus for transaction volume with tasks\n if (transactions.length > 0 && tasks.length > 0) {\n const coverageRate = Math.min(tasks.length / transactions.length, 1);\n score += Math.round(coverageRate * 20);\n }\n\n return {\n name: 'compliance_adherence',\n score: clamp(score, 0, 100),\n weight: WEIGHT_COMPLIANCE,\n description: `${tasksWithEvidence.length} tasks with evidence, ${transactions.length} total transactions`,\n };\n }\n\n // --------------------------------------------------------------------------\n // Transaction risk factor computation\n // --------------------------------------------------------------------------\n\n private computeTransactionRiskFactors(tx: LogTransactionInput): RiskFactor[] {\n const factors: RiskFactor[] = [];\n\n // Factor 1: Amount risk\n factors.push(this.computeAmountRisk(tx));\n\n // Factor 2: New destination risk\n factors.push(this.computeNewDestinationRisk(tx));\n\n // Factor 3: Frequency risk\n factors.push(this.computeFrequencyRisk(tx));\n\n // Factor 4: Agent trust inverse\n factors.push(this.computeAgentRisk(tx.agentId));\n\n // Factor 5: Round amount risk\n factors.push(this.computeRoundAmountRisk(tx));\n\n return factors;\n }\n\n /**\n * Amount risk: higher transaction amounts carry inherently higher risk.\n *\n * Tiers are aligned with common fintech thresholds:\n * - <$100: near-zero risk (5), micro-transactions\n * - <$1K: low risk (15), typical consumer spending\n * - <$10K: moderate (30), approaches CTR reporting thresholds\n * - <$50K: elevated (55), large business transactions\n * - <$100K: high (75), requires enhanced due diligence\n * - $100K+: very high (95), institutional-scale transfers\n *\n * Additional +20 penalty when amount exceeds 5x the agent's historical average,\n * detecting sudden spending spikes that could indicate account compromise.\n */\n private computeAmountRisk(tx: LogTransactionInput): RiskFactor {\n const amount = parseAmount(tx.amount);\n\n if (isNaN(amount)) {\n return { name: 'amount_risk', score: 50, description: 'Unable to parse transaction amount' };\n }\n\n // Higher amounts = higher risk\n let score: number;\n if (amount < 100) score = 5;\n else if (amount < 1000) score = 15;\n else if (amount < 10000) score = 30;\n else if (amount < 50000) score = 55;\n else if (amount < 100000) score = 75;\n else score = 95;\n\n // Compare to agent's historical average\n const history = this.store.getTransactionsByAgent(tx.agentId);\n if (history.length > 0) {\n const avgAmount =\n history.reduce((sum, t) => sum + parseAmount(t.amount), 0) / history.length;\n if (avgAmount > 0 && amount > avgAmount * 5) {\n score = Math.min(score + 20, 100);\n }\n }\n\n return {\n name: 'amount_risk',\n score,\n description: `Transaction amount ${tx.amount} ${tx.token ?? tx.currency ?? ''}`,\n };\n }\n\n private computeNewDestinationRisk(tx: LogTransactionInput): RiskFactor {\n const history = this.store.getTransactionsByAgent(tx.agentId);\n const knownDestinations = new Set(history.map((t) => t.to.toLowerCase()));\n\n const isNew = !knownDestinations.has(tx.to.toLowerCase());\n\n if (history.length === 0) {\n return {\n name: 'new_destination',\n score: 30,\n description: 'First transaction for this agent -- no destination history',\n };\n }\n\n return {\n name: 'new_destination',\n score: isNew ? 45 : 5,\n description: isNew\n ? `New destination address: ${tx.to}`\n : `Known destination address: ${tx.to}`,\n };\n }\n\n private computeFrequencyRisk(tx: LogTransactionInput): RiskFactor {\n const oneHourAgo = new Date(Date.now() - 3600000);\n const recentTxs = this.store.queryTransactions(\n (t) =>\n t.agentId === tx.agentId && new Date(t.timestamp) >= oneHourAgo,\n );\n\n const count = recentTxs.length;\n\n let score: number;\n if (count < 5) score = 5;\n else if (count < 10) score = 20;\n else if (count < 25) score = 45;\n else if (count < 50) score = 70;\n else score = 90;\n\n return {\n name: 'frequency_risk',\n score,\n description: `${count} transactions in the last hour`,\n };\n }\n\n private computeAgentRisk(agentId: string): RiskFactor {\n const actions = this.store.getActionsByAgent(agentId);\n const anomalies = this.store.queryAnomalies((a) => a.agentId === agentId);\n\n if (actions.length === 0) {\n return {\n name: 'agent_reputation',\n score: 40,\n description: 'New agent with no history',\n };\n }\n\n const anomalyRate = anomalies.length / actions.length;\n const score = Math.round(anomalyRate * 100);\n\n return {\n name: 'agent_reputation',\n score: clamp(score, 0, 100),\n description: `Agent anomaly rate: ${Math.round(anomalyRate * 100)}%`,\n };\n }\n\n /**\n * Round amount risk: round numbers are a structuring indicator in AML heuristics.\n *\n * Money launderers often transact in round amounts (e.g., $10,000 exactly) or\n * just under regulatory thresholds (e.g., $9,500 to avoid $10K CTR filing).\n *\n * Scoring:\n * - Non-round amounts: 5 (baseline, most legitimate transactions)\n * - Multiples of $1,000: 15 (mildly suspicious)\n * - Multiples of $10,000: 25 (more suspicious)\n * - Amounts $9,000-$10,000: +20 penalty (classic structuring band)\n *\n * This factor alone rarely triggers flagging — it contributes to the composite\n * risk score alongside amount, frequency, and destination analysis.\n */\n private computeRoundAmountRisk(tx: LogTransactionInput): RiskFactor {\n const amount = parseAmount(tx.amount);\n\n if (isNaN(amount)) {\n return { name: 'round_amount', score: 10, description: 'Unable to parse amount' };\n }\n\n // Round amounts (multiples of 1000, 5000, 10000) are slightly more suspicious\n // in anti-money-laundering heuristics (structuring detection)\n const isRound1000 = amount >= 1000 && amount % 1000 === 0;\n const isRound10000 = amount >= 10000 && amount % 10000 === 0;\n const isJustUnderThreshold = amount >= 9000 && amount <= 10000;\n\n let score = 5;\n if (isRound10000) score = 25;\n else if (isRound1000) score = 15;\n if (isJustUnderThreshold) score += 20; // Structuring indicator\n\n return {\n name: 'round_amount',\n score,\n description: `Amount ${tx.amount} -- ${isRound1000 ? 'round amount' : 'non-round amount'}`,\n };\n }\n\n // --------------------------------------------------------------------------\n // Scoring helpers\n // --------------------------------------------------------------------------\n\n private scoreToLevel(score: number): TrustScore['level'] {\n if (score >= TRUST_LEVEL_VERIFIED) return 'verified';\n if (score >= TRUST_LEVEL_HIGH) return 'high';\n if (score >= TRUST_LEVEL_MEDIUM) return 'medium';\n if (score >= TRUST_LEVEL_LOW) return 'low';\n return 'untrusted';\n }\n\n private riskScoreToLevel(score: number): TransactionEvaluation['riskLevel'] {\n if (score >= RISK_BLOCK_THRESHOLD) return 'critical';\n if (score >= RISK_FLAG_THRESHOLD) return 'high';\n if (score >= 35) return 'medium';\n return 'low';\n }\n}\n","// ============================================================================\n// Kontext SDK - Core Type Definitions\n// ============================================================================\n\n/** Supported blockchain networks */\nexport type Chain = 'ethereum' | 'base' | 'polygon' | 'arbitrum' | 'optimism' | 'arc' | 'avalanche' | 'solana';\n\n/** Supported stablecoin tokens */\nexport type Token = 'USDC' | 'USDT' | 'DAI' | 'EURC' | 'USDP' | 'USDG';\n\n/** SDK operating mode */\nexport type KontextMode = 'local' | 'cloud';\n\n/** Log level for the SDK logger */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/** Environment configuration */\nexport type Environment = 'development' | 'staging' | 'production';\n\n/** Anomaly severity levels */\nexport type AnomalySeverity = 'low' | 'medium' | 'high' | 'critical';\n\n/** Task status lifecycle */\nexport type TaskStatus = 'pending' | 'in_progress' | 'confirmed' | 'failed' | 'expired';\n\n/** Supported export formats */\nexport type ExportFormat = 'json' | 'csv';\n\n/** Report types */\nexport type ReportType = 'compliance' | 'transaction' | 'anomaly';\n\n/** Anomaly detection rule types */\nexport type AnomalyRuleType =\n | 'unusualAmount'\n | 'frequencySpike'\n | 'newDestination'\n | 'offHoursActivity'\n | 'rapidSuccession'\n | 'roundAmount';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/** SDK initialization configuration */\nexport interface KontextConfig {\n /** API key for cloud mode (optional for local/OSS mode) */\n apiKey?: string;\n /** Unique project identifier */\n projectId: string;\n /** Deployment environment */\n environment: Environment;\n /** Backend API URL. Falls back to KONTEXT_API_URL env var, then https://api.kontext.so */\n apiUrl?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Batch size for log flushing */\n batchSize?: number;\n /** Batch flush interval in milliseconds */\n flushIntervalMs?: number;\n /** Local file output directory for OSS mode */\n localOutputDir?: string;\n /** Minimum log level for SDK output (default: 'warn', or 'debug' if debug=true) */\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n /** Pluggable storage adapter for persistence (default: in-memory) */\n storage?: import('./storage.js').StorageAdapter;\n\n /**\n * Anomaly detection rules to enable at init time.\n * When provided, anomaly detection is automatically enabled and every\n * verify() call includes anomaly results in its response.\n *\n * Free-tier rules: `unusualAmount`, `frequencySpike`\n * Pay as you go rules: `newDestination`, `offHoursActivity`, `rapidSuccession`, `roundAmount`\n */\n anomalyRules?: AnomalyRuleType[];\n\n /**\n * Thresholds for anomaly detection. Only used when `anomalyRules` is set.\n */\n anomalyThresholds?: AnomalyThresholds;\n\n /**\n * Pluggable event exporter for shipping events to external systems.\n * Follows the OpenTelemetry exporter pattern.\n *\n * Built-in exporters:\n * - `NoopExporter` (default) — discards events, current SDK behavior\n * - `ConsoleExporter` — prints events to stdout\n * - `JsonFileExporter` — writes JSONL files to disk\n *\n * @example\n * ```typescript\n * import { Kontext, ConsoleExporter } from '@kontext/sdk';\n *\n * const kontext = Kontext.init({\n * projectId: 'my-app',\n * environment: 'development',\n * exporter: new ConsoleExporter(),\n * });\n * ```\n */\n exporter?: import('./exporters.js').EventExporter;\n\n /**\n * Optional metadata schema validator. When provided, all metadata passed to\n * `log()`, `logTransaction()`, and `createTask()` will be validated against\n * this schema before being recorded.\n *\n * Accepts any object with a `parse(data: unknown)` method (e.g., a Zod schema).\n * Throws on validation failure, passes through on success.\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * const kontext = Kontext.init({\n * projectId: 'my-app',\n * environment: 'production',\n * metadataSchema: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])),\n * });\n * ```\n */\n metadataSchema?: MetadataValidator;\n\n /**\n * Pricing plan tier. Controls event metering limits.\n * - 'free': 20,000 events/month\n * - 'pro': 100,000 events/user/month (multiplied by seats)\n * - 'enterprise': Unlimited events\n * @default 'free'\n */\n plan?: 'free' | 'pro' | 'enterprise';\n\n /**\n * Number of seats (users) on the plan. Pro plan limits are multiplied\n * by the number of seats: 100K events/user/mo.\n * @default 1\n */\n seats?: number;\n\n /**\n * Custom URL for the Pro plan upgrade page.\n * @default 'https://kontext.so/upgrade'\n */\n upgradeUrl?: string;\n\n /**\n * Feature flag configuration. When provided, the SDK initializes a\n * `FeatureFlagManager` that fetches flags from Firestore REST API.\n */\n featureFlags?: FeatureFlagConfig;\n\n /**\n * User / tenant identifier for storage isolation.\n * Required when using FirestoreStorageAdapter. Logs for each userId\n * are stored under separate Firestore paths:\n * users/{userId}/projects/{projectId}/...\n *\n * Use a stable, opaque identifier: your auth system's user ID,\n * a Stripe customer ID, or a hash of the API key.\n */\n userId?: string;\n\n /**\n * When set, verify() auto-creates a pending task if the transaction\n * amount exceeds this threshold (string, to preserve decimal precision).\n * The task is returned in `result.task` and `result.requiresApproval`\n * is set to `true`. Your agent should wait for confirmTask() before\n * executing the transfer.\n *\n * Free tier feature — works with createTask() / confirmTask().\n *\n * @example\n * ```typescript\n * const ctx = Kontext.init({\n * projectId: 'my-agent',\n * environment: 'production',\n * approvalThreshold: '3000', // auto-task above $3K\n * });\n * ```\n */\n approvalThreshold?: string;\n}\n\n/**\n * Interface for metadata validation. Compatible with Zod schemas and any\n * validator that implements a `parse` method.\n */\nexport interface MetadataValidator {\n /** Validate and return the metadata. Should throw on invalid data. */\n parse(data: unknown): Record<string, unknown>;\n}\n\n// ============================================================================\n// Actions & Logging\n// ============================================================================\n\n/** Base action log entry */\nexport interface ActionLog {\n /** Unique action identifier */\n id: string;\n /** Timestamp of the action */\n timestamp: string;\n /** ID of the project */\n projectId: string;\n /** ID of the agent performing the action */\n agentId: string;\n /** Session ID grouping all steps in one agent run */\n sessionId?: string;\n /** Correlation ID for tracing related actions */\n correlationId: string;\n /** Type of action */\n type: string;\n /** Human-readable description */\n description: string;\n /** Arbitrary metadata */\n metadata: Record<string, unknown>;\n /** Rolling SHA-256 digest for tamper-evident audit trail */\n digest?: string;\n /** Prior digest in the chain */\n priorDigest?: string;\n}\n\n/** Input for logging a generic action */\nexport interface LogActionInput {\n /** Type of action (e.g., 'transfer', 'approval', 'query') */\n type: string;\n /** Human-readable description */\n description: string;\n /** ID of the agent performing the action */\n agentId: string;\n /** Optional session ID grouping all steps in a single agent run */\n sessionId?: string;\n /** Optional correlation ID (auto-generated if not provided) */\n correlationId?: string;\n /** Arbitrary metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for logging a transaction (crypto or general payment) */\nexport interface LogTransactionInput {\n /** On-chain transaction hash (required for crypto, optional for general payments) */\n txHash?: string;\n /** Blockchain network (required for crypto, optional for general payments) */\n chain?: Chain;\n /** Transaction amount (string to preserve decimal precision) */\n amount: string;\n /** Token being transferred (required for crypto, optional for general payments) */\n token?: Token;\n /** Sender address or entity name */\n from: string;\n /** Recipient address or entity name */\n to: string;\n /** ID of the agent initiating the transaction */\n agentId: string;\n /** Optional session ID grouping all steps in a single agent run */\n sessionId?: string;\n /** Optional correlation ID */\n correlationId?: string;\n /** Additional transaction metadata */\n metadata?: Record<string, unknown>;\n /** Currency code for general payments (e.g., 'USD', 'EUR'). Inferred from token for crypto. */\n currency?: string;\n /** Payment method (e.g., 'wire', 'ach', 'card', 'crypto') */\n paymentMethod?: string;\n /** External payment reference (invoice ID, wire reference, etc.) */\n paymentReference?: string;\n}\n\n/** Stored transaction record */\nexport interface TransactionRecord extends ActionLog {\n type: 'transaction';\n txHash?: string;\n chain?: Chain;\n amount: string;\n token?: Token;\n from: string;\n to: string;\n currency?: string;\n paymentMethod?: string;\n paymentReference?: string;\n}\n\n/** Check whether a transaction input has all crypto-specific fields */\nexport function isCryptoTransaction(input: LogTransactionInput): boolean {\n return !!input.txHash && !!input.chain && !!input.token;\n}\n\n// ============================================================================\n// Tasks\n// ============================================================================\n\n/** Input for creating a new tracked task */\nexport interface CreateTaskInput {\n /** Human-readable task description */\n description: string;\n /** ID of the agent responsible for the task */\n agentId: string;\n /** List of evidence types required for confirmation */\n requiredEvidence: string[];\n /** Optional correlation ID */\n correlationId?: string;\n /** Task expiration time in milliseconds from creation */\n expiresInMs?: number;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Evidence provided for task confirmation */\nexport interface TaskEvidence {\n /** On-chain transaction hash */\n txHash?: string;\n /** Transaction receipt data */\n receipt?: Record<string, unknown>;\n /** Proof data (e.g., Merkle proof, signature) */\n proof?: string;\n /** Any additional evidence fields */\n [key: string]: unknown;\n}\n\n/** Input for confirming a task */\nexport interface ConfirmTaskInput {\n /** ID of the task to confirm */\n taskId: string;\n /** Evidence supporting task completion */\n evidence: TaskEvidence;\n}\n\n/** Complete task record */\nexport interface Task {\n /** Unique task identifier */\n id: string;\n /** Project ID */\n projectId: string;\n /** Task description */\n description: string;\n /** Responsible agent ID */\n agentId: string;\n /** Current task status */\n status: TaskStatus;\n /** Required evidence types */\n requiredEvidence: string[];\n /** Provided evidence (if any) */\n providedEvidence: TaskEvidence | null;\n /** Correlation ID */\n correlationId: string;\n /** Creation timestamp */\n createdAt: string;\n /** Last update timestamp */\n updatedAt: string;\n /** Confirmation timestamp */\n confirmedAt: string | null;\n /** Expiration timestamp */\n expiresAt: string | null;\n /** Additional metadata */\n metadata: Record<string, unknown>;\n}\n\n// ============================================================================\n// Audit & Export\n// ============================================================================\n\n/** Date range filter */\nexport interface DateRange {\n /** Start date (inclusive) */\n start: Date;\n /** End date (inclusive) */\n end: Date;\n}\n\n/** Export configuration */\nexport interface ExportOptions {\n /** Output format */\n format: ExportFormat;\n /** Date range filter */\n dateRange?: DateRange;\n /** Filter by agent IDs */\n agentIds?: string[];\n /** Filter by action types */\n types?: string[];\n /** Filter by chains */\n chains?: Chain[];\n /** Include task data */\n includeTasks?: boolean;\n /** Include anomaly data */\n includeAnomalies?: boolean;\n}\n\n/** Report generation options */\nexport interface ReportOptions {\n /** Type of report */\n type: ReportType;\n /** Reporting period */\n period: DateRange;\n /** Filter by agent IDs */\n agentIds?: string[];\n}\n\n/** Generated compliance report */\nexport interface ComplianceReport {\n /** Report ID */\n id: string;\n /** Report type */\n type: ReportType;\n /** Generation timestamp */\n generatedAt: string;\n /** Reporting period */\n period: DateRange;\n /** Project ID */\n projectId: string;\n /** Summary statistics */\n summary: {\n totalActions: number;\n totalTransactions: number;\n totalTasks: number;\n confirmedTasks: number;\n failedTasks: number;\n totalAnomalies: number;\n averageTrustScore: number;\n };\n /** Action logs in the period */\n actions: ActionLog[];\n /** Transaction records in the period */\n transactions: TransactionRecord[];\n /** Tasks in the period */\n tasks: Task[];\n /** Anomalies detected in the period */\n anomalies: AnomalyEvent[];\n}\n\n/** Exported audit data */\nexport interface ExportResult {\n /** Export format */\n format: ExportFormat;\n /** Export timestamp */\n exportedAt: string;\n /** Number of records */\n recordCount: number;\n /** The data (JSON string or CSV string) */\n data: string;\n /** Terminal digest of the chain at time of export */\n terminalDigest?: string;\n}\n\n// ============================================================================\n// Anomaly Detection\n// ============================================================================\n\n/** Detected anomaly event */\nexport interface AnomalyEvent {\n /** Unique anomaly ID */\n id: string;\n /** Anomaly type/rule that triggered */\n type: AnomalyRuleType;\n /** Severity level */\n severity: AnomalySeverity;\n /** Human-readable description */\n description: string;\n /** ID of the agent involved */\n agentId: string;\n /** Related action log ID */\n actionId: string;\n /** Detection timestamp */\n detectedAt: string;\n /** Related data */\n data: Record<string, unknown>;\n /** Whether the anomaly has been reviewed */\n reviewed: boolean;\n}\n\n/** Anomaly detection configuration */\nexport interface AnomalyDetectionConfig {\n /** Detection rules to enable */\n rules: AnomalyRuleType[];\n /** Thresholds for detection */\n thresholds?: AnomalyThresholds;\n}\n\n/** Configurable anomaly thresholds */\nexport interface AnomalyThresholds {\n /** Maximum transaction amount before flagging */\n maxAmount?: string;\n /** Maximum transactions per hour */\n maxFrequency?: number;\n /** Hours considered \"off-hours\" (24h format, e.g., [22, 23, 0, 1, 2, 3, 4, 5]) */\n offHours?: number[];\n /** Minimum seconds between transactions before \"rapid succession\" flag */\n minIntervalSeconds?: number;\n}\n\n/** Anomaly event callback */\nexport type AnomalyCallback = (anomaly: AnomalyEvent) => void;\n\n// ============================================================================\n// Trust Scoring\n// ============================================================================\n\n/** Trust score result for an agent */\nexport interface TrustScore {\n /** Agent ID */\n agentId: string;\n /** Overall trust score (0-100) */\n score: number;\n /** Score breakdown by factor */\n factors: TrustFactor[];\n /** Timestamp of computation */\n computedAt: string;\n /** Trust level label */\n level: 'untrusted' | 'low' | 'medium' | 'high' | 'verified';\n}\n\n/** Individual trust factor */\nexport interface TrustFactor {\n /** Factor name */\n name: string;\n /** Factor score (0-100) */\n score: number;\n /** Factor weight (0-1) */\n weight: number;\n /** Human-readable description */\n description: string;\n}\n\n/** Transaction evaluation result */\nexport interface TransactionEvaluation {\n /** Transaction hash (present for crypto transactions) */\n txHash?: string;\n /** Risk score (0-100, higher = more risky) */\n riskScore: number;\n /** Risk level */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Individual risk factors */\n factors: RiskFactor[];\n /** Whether the transaction should be flagged */\n flagged: boolean;\n /** Recommended action */\n recommendation: 'approve' | 'review' | 'block';\n /** Evaluation timestamp */\n evaluatedAt: string;\n}\n\n/** Individual risk factor */\nexport interface RiskFactor {\n /** Factor name */\n name: string;\n /** Risk score contribution (0-100) */\n score: number;\n /** Human-readable description */\n description: string;\n}\n\n// ============================================================================\n// Compliance Certificates\n// ============================================================================\n\n/** Input for generating a compliance certificate */\nexport interface GenerateComplianceCertificateInput {\n /** ID of the agent to generate the certificate for */\n agentId: string;\n /** Optional time window */\n timeRange?: { from: Date; to: Date };\n /** Whether to include reasoning entries */\n includeReasoning?: boolean;\n}\n\n/** Compliance certificate summarizing agent actions and verifying the digest chain */\nexport interface ComplianceCertificate {\n /** Unique certificate ID */\n certificateId: string;\n /** Agent ID */\n agentId: string;\n /** ISO timestamp of when the certificate was issued */\n issuedAt: string;\n /** Summary of counts */\n summary: {\n actions: number;\n transactions: number;\n toolCalls: number;\n reasoningEntries: number;\n };\n /** Digest chain verification status */\n digestChain: {\n terminalDigest: string;\n chainLength: number;\n verified: boolean;\n };\n /** Agent's current trust score */\n trustScore: number;\n /** Overall compliance status */\n complianceStatus: 'compliant' | 'non-compliant' | 'review-required';\n /** Summary list of action types and counts */\n actions: Array<{ type: string; count: number }>;\n /** Reasoning entries (if includeReasoning is true) */\n reasoning: ReasoningEntry[];\n /** SHA-256 hash of the certificate content for integrity verification */\n contentHash: string;\n}\n\n// ============================================================================\n// USDC Integration\n// ============================================================================\n\n/** USDC compliance check result */\nexport interface UsdcComplianceCheck {\n /** Whether the transaction is compliant */\n compliant: boolean;\n /** List of compliance checks performed */\n checks: ComplianceCheckResult[];\n /** Overall risk level */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Recommendations */\n recommendations: string[];\n}\n\n/** Individual compliance check result */\nexport interface ComplianceCheckResult {\n /** Check name */\n name: string;\n /** Whether the check passed */\n passed: boolean;\n /** Human-readable description */\n description: string;\n /** Severity if failed */\n severity: AnomalySeverity;\n}\n\n// ============================================================================\n// Feature Flags\n// ============================================================================\n\n/** Scope of a feature flag */\nexport type FlagScope = 'sdk' | 'server' | 'website' | 'all';\n\n/** Plan-based targeting for a single environment */\nexport interface FlagPlanTargeting {\n free: boolean;\n pro: boolean;\n enterprise: boolean;\n}\n\n/** Targeting configuration across all environments */\nexport interface FlagTargeting {\n development: FlagPlanTargeting;\n staging: FlagPlanTargeting;\n production: FlagPlanTargeting;\n}\n\n/** A feature flag document stored in Firestore */\nexport interface FeatureFlag {\n name: string;\n description: string;\n scope: FlagScope;\n targeting: FlagTargeting;\n createdAt: string;\n updatedAt: string;\n createdBy: string;\n}\n\n/** Configuration for the FeatureFlagManager */\nexport interface FeatureFlagConfig {\n /** GCP project ID containing the Firestore database */\n gcpProjectId: string;\n /** Access token for Firestore REST API (optional — server uses metadata server) */\n accessToken?: string;\n /** Cache TTL in milliseconds (default: 300_000 for SDK, 60_000 for server) */\n cacheTtlMs?: number;\n /** Default value when a flag is not found (default: false) */\n defaultValue?: boolean;\n /** Current environment */\n environment: Environment;\n /** Current plan tier */\n plan: 'free' | 'pro' | 'enterprise';\n /** Scope filter — only load flags matching this scope (or 'all') */\n scope?: FlagScope;\n}\n\n// ============================================================================\n// Verify\n// ============================================================================\n\n/** Input for the verify() convenience method */\nexport interface VerifyInput extends LogTransactionInput {\n /** Agent reasoning for this transaction (logged into digest chain if provided) */\n reasoning?: string;\n /** Confidence level 0–1 for the reasoning */\n confidence?: number;\n /** Additional reasoning context */\n context?: Record<string, unknown>;\n}\n\n/** Result of the verify() convenience method */\nexport interface VerifyResult {\n /** Whether the transaction passed all compliance checks */\n compliant: boolean;\n /** Individual compliance check results */\n checks: ComplianceCheckResult[];\n /** Overall risk level */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Recommended actions */\n recommendations: string[];\n /** The logged transaction record */\n transaction: TransactionRecord;\n /** Agent trust score (auto-computed when agentId is present) */\n trustScore: TrustScore;\n /** Anomalies detected for this transaction (empty if anomaly detection not configured) */\n anomalies: AnomalyEvent[];\n /** Digest chain proof at time of verification */\n digestProof: {\n terminalDigest: string;\n chainLength: number;\n valid: boolean;\n };\n /** Reasoning entry ID (present when reasoning was provided in input) */\n reasoningId?: string;\n /** True when the transaction amount exceeds the approvalThreshold */\n requiresApproval?: boolean;\n /** The pending approval task (present when requiresApproval is true) */\n task?: Task;\n}\n\n// ============================================================================\n// Agent Reasoning & Session Tracing\n// ============================================================================\n\n/**\n * Input for logging an agent's reasoning/decision step.\n * Supports full trace reconstruction via sessionId + step sequencing.\n */\nexport interface LogReasoningInput {\n /** ID of the agent performing the reasoning */\n agentId: string;\n /**\n * Session ID grouping all steps in one agent run.\n * Use Kontext.generateSessionId() or your framework's run ID\n * (LangGraph thread_id, Vercel AI id, OpenAI run_id).\n */\n sessionId?: string;\n /** Step number within the session (for ordering) */\n step?: number;\n /** Parent step number (links this step to a prior decision) */\n parentStep?: number;\n /** The action or decision being made (e.g., 'evaluate-transfer') */\n action: string;\n /** Natural language explanation of the reasoning */\n reasoning: string;\n /** Confidence level 0–1 */\n confidence?: number;\n /** Tool or method called as a result of this reasoning */\n toolCall?: string;\n /** Result returned by the tool call */\n toolResult?: unknown;\n /** Additional context */\n context?: Record<string, unknown>;\n}\n\n/** A stored reasoning/decision entry in the audit trail */\nexport interface ReasoningEntry {\n /** Unique entry ID */\n id: string;\n /** Timestamp */\n timestamp: string;\n /** Agent ID */\n agentId: string;\n /** Session ID */\n sessionId?: string;\n /** Step number */\n step?: number;\n /** Parent step */\n parentStep?: number;\n /** Action name */\n action: string;\n /** Reasoning text */\n reasoning: string;\n /** Confidence 0–1 */\n confidence: number;\n /** Tool called */\n toolCall?: string;\n /** Tool result */\n toolResult?: unknown;\n /** Context */\n context: Record<string, unknown>;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/** Error codes for Kontext SDK */\nexport enum KontextErrorCode {\n INITIALIZATION_ERROR = 'INITIALIZATION_ERROR',\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n TASK_NOT_FOUND = 'TASK_NOT_FOUND',\n TASK_ALREADY_CONFIRMED = 'TASK_ALREADY_CONFIRMED',\n TASK_EXPIRED = 'TASK_EXPIRED',\n INSUFFICIENT_EVIDENCE = 'INSUFFICIENT_EVIDENCE',\n API_ERROR = 'API_ERROR',\n NETWORK_ERROR = 'NETWORK_ERROR',\n EXPORT_ERROR = 'EXPORT_ERROR',\n ANOMALY_CONFIG_ERROR = 'ANOMALY_CONFIG_ERROR',\n PLAN_REQUIRED = 'PLAN_REQUIRED',\n APPROVAL_NOT_FOUND = 'APPROVAL_NOT_FOUND',\n APPROVAL_EXPIRED = 'APPROVAL_EXPIRED',\n}\n\n/** Kontext SDK error */\nexport class KontextError extends Error {\n public readonly code: KontextErrorCode;\n public readonly details?: Record<string, unknown>;\n\n constructor(code: KontextErrorCode, message: string, details?: Record<string, unknown>) {\n super(message);\n this.name = 'KontextError';\n this.code = code;\n this.details = details;\n }\n}\n","// ============================================================================\n// Kontext SDK - Anomaly Detection\n// ============================================================================\n\nimport type {\n AnomalyDetectionConfig,\n AnomalyThresholds,\n AnomalyEvent,\n AnomalyCallback,\n AnomalyRuleType,\n AnomalySeverity,\n TransactionRecord,\n ActionLog,\n KontextConfig,\n} from './types.js';\nimport { KontextError, KontextErrorCode } from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now, parseAmount, getCurrentHourUtc } from './utils.js';\n\n/** Default anomaly detection thresholds */\nconst DEFAULT_THRESHOLDS: Required<AnomalyThresholds> = {\n maxAmount: '10000',\n maxFrequency: 30,\n offHours: [22, 23, 0, 1, 2, 3, 4, 5],\n minIntervalSeconds: 10,\n};\n\n/**\n * AnomalyDetector monitors agent actions and transactions for suspicious patterns.\n *\n * Supported detection rules:\n * - **unusualAmount**: Flags transactions above a configured threshold or\n * significantly above the agent's historical average.\n * - **frequencySpike**: Flags when an agent's transaction rate exceeds\n * the configured maximum per hour.\n * - **newDestination**: Flags transactions to previously unseen addresses.\n * - **offHoursActivity**: Flags activity during configured off-hours (UTC).\n * - **rapidSuccession**: Flags transactions that occur within a very short\n * time interval of each other.\n * - **roundAmount**: Flags round-number amounts that may indicate structuring.\n *\n * Severity levels: low, medium, high, critical.\n */\nexport class AnomalyDetector {\n private readonly config: KontextConfig;\n private readonly store: KontextStore;\n private detectionConfig: AnomalyDetectionConfig | null = null;\n private thresholds: Required<AnomalyThresholds> = { ...DEFAULT_THRESHOLDS };\n private callbacks: AnomalyCallback[] = [];\n private enabled = false;\n\n constructor(config: KontextConfig, store: KontextStore) {\n this.config = config;\n this.store = store;\n }\n\n /**\n * Enable anomaly detection with the specified configuration.\n *\n * @param detectionConfig - Rules and thresholds for detection\n *\n * @example\n * ```typescript\n * detector.enableAnomalyDetection({\n * rules: ['unusualAmount', 'frequencySpike', 'newDestination'],\n * thresholds: { maxAmount: '10000', maxFrequency: 50 },\n * });\n * ```\n */\n enableAnomalyDetection(detectionConfig: AnomalyDetectionConfig): void {\n if (!detectionConfig.rules || detectionConfig.rules.length === 0) {\n throw new KontextError(\n KontextErrorCode.ANOMALY_CONFIG_ERROR,\n 'At least one detection rule must be specified',\n );\n }\n\n this.detectionConfig = detectionConfig;\n this.thresholds = {\n ...DEFAULT_THRESHOLDS,\n ...detectionConfig.thresholds,\n };\n this.enabled = true;\n\n if (this.config.debug) {\n console.debug(\n `[Kontext] Anomaly detection enabled with rules: ${detectionConfig.rules.join(', ')}`,\n );\n }\n }\n\n /**\n * Disable anomaly detection.\n */\n disableAnomalyDetection(): void {\n this.enabled = false;\n this.detectionConfig = null;\n\n if (this.config.debug) {\n console.debug('[Kontext] Anomaly detection disabled');\n }\n }\n\n /**\n * Register a callback for anomaly events.\n *\n * @param callback - Function to call when an anomaly is detected\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsub = detector.onAnomaly((anomaly) => {\n * console.log(`Anomaly: ${anomaly.type} [${anomaly.severity}]`);\n * });\n * // Later: unsub();\n * ```\n */\n onAnomaly(callback: AnomalyCallback): () => void {\n this.callbacks.push(callback);\n\n return () => {\n const index = this.callbacks.indexOf(callback);\n if (index !== -1) {\n this.callbacks.splice(index, 1);\n }\n };\n }\n\n /**\n * Evaluate a transaction against all enabled detection rules.\n * Called automatically when transactions are logged (via the client).\n *\n * @param tx - The transaction record to evaluate\n * @returns Array of detected anomalies (empty if none)\n */\n evaluateTransaction(tx: TransactionRecord): AnomalyEvent[] {\n if (!this.enabled || !this.detectionConfig) return [];\n\n const anomalies: AnomalyEvent[] = [];\n\n for (const rule of this.detectionConfig.rules) {\n const anomaly = this.runRule(rule, tx);\n if (anomaly) {\n anomalies.push(anomaly);\n this.store.addAnomaly(anomaly);\n this.notifyCallbacks(anomaly);\n }\n }\n\n return anomalies;\n }\n\n /**\n * Evaluate a generic action against all enabled detection rules.\n *\n * @param action - The action log to evaluate\n * @returns Array of detected anomalies (empty if none)\n */\n evaluateAction(action: ActionLog): AnomalyEvent[] {\n if (!this.enabled || !this.detectionConfig) return [];\n\n const anomalies: AnomalyEvent[] = [];\n\n // Only offHoursActivity and frequencySpike apply to generic actions\n const applicableRules: AnomalyRuleType[] = ['offHoursActivity', 'frequencySpike'];\n\n for (const rule of this.detectionConfig.rules) {\n if (!applicableRules.includes(rule)) continue;\n\n const anomaly = this.runActionRule(rule, action);\n if (anomaly) {\n anomalies.push(anomaly);\n this.store.addAnomaly(anomaly);\n this.notifyCallbacks(anomaly);\n }\n }\n\n return anomalies;\n }\n\n /**\n * Check whether anomaly detection is currently enabled.\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Get the current detection configuration.\n */\n getConfig(): AnomalyDetectionConfig | null {\n return this.detectionConfig;\n }\n\n // --------------------------------------------------------------------------\n // Rule execution\n // --------------------------------------------------------------------------\n\n private runRule(rule: AnomalyRuleType, tx: TransactionRecord): AnomalyEvent | null {\n switch (rule) {\n case 'unusualAmount':\n return this.checkUnusualAmount(tx);\n case 'frequencySpike':\n return this.checkFrequencySpike(tx);\n case 'newDestination':\n return this.checkNewDestination(tx);\n case 'offHoursActivity':\n return this.checkOffHours(tx);\n case 'rapidSuccession':\n return this.checkRapidSuccession(tx);\n case 'roundAmount':\n return this.checkRoundAmount(tx);\n default:\n return null;\n }\n }\n\n private runActionRule(rule: AnomalyRuleType, action: ActionLog): AnomalyEvent | null {\n switch (rule) {\n case 'offHoursActivity':\n return this.checkOffHoursAction(action);\n case 'frequencySpike':\n return this.checkActionFrequencySpike(action);\n default:\n return null;\n }\n }\n\n // --------------------------------------------------------------------------\n // Individual rule implementations\n // --------------------------------------------------------------------------\n\n private checkUnusualAmount(tx: TransactionRecord): AnomalyEvent | null {\n const amount = parseAmount(tx.amount);\n if (isNaN(amount)) return null;\n\n const threshold = parseAmount(this.thresholds.maxAmount);\n\n // Check against absolute threshold\n if (amount > threshold) {\n return this.createAnomaly(\n 'unusualAmount',\n amount > threshold * 5 ? 'critical' : amount > threshold * 2 ? 'high' : 'medium',\n `Transaction amount ${tx.amount} ${tx.token ?? tx.currency ?? ''} exceeds threshold of ${this.thresholds.maxAmount}`,\n tx.agentId,\n tx.id,\n { amount: tx.amount, threshold: this.thresholds.maxAmount, token: tx.token ?? tx.currency },\n );\n }\n\n // Check against agent's historical average\n const history = this.store.getTransactionsByAgent(tx.agentId);\n if (history.length >= 3) {\n const amounts = history.map((t) => parseAmount(t.amount)).filter((a) => !isNaN(a));\n if (amounts.length >= 3) {\n const avg = amounts.reduce((s, a) => s + a, 0) / amounts.length;\n if (avg > 0 && amount > avg * 5) {\n return this.createAnomaly(\n 'unusualAmount',\n amount > avg * 10 ? 'high' : 'medium',\n `Transaction amount ${tx.amount} is ${(amount / avg).toFixed(1)}x the agent's average of ${avg.toFixed(2)}`,\n tx.agentId,\n tx.id,\n { amount: tx.amount, average: avg.toFixed(2), multiplier: (amount / avg).toFixed(1) },\n );\n }\n }\n }\n\n return null;\n }\n\n private checkFrequencySpike(tx: TransactionRecord): AnomalyEvent | null {\n const oneHourAgo = new Date(Date.now() - 3600000);\n const recentTxs = this.store.queryTransactions(\n (t) => t.agentId === tx.agentId && new Date(t.timestamp) >= oneHourAgo,\n );\n\n const count = recentTxs.length;\n const maxFrequency = this.thresholds.maxFrequency;\n\n if (count > maxFrequency) {\n return this.createAnomaly(\n 'frequencySpike',\n count > maxFrequency * 3 ? 'critical' : count > maxFrequency * 2 ? 'high' : 'medium',\n `Agent ${tx.agentId} has ${count} transactions in the last hour (threshold: ${maxFrequency})`,\n tx.agentId,\n tx.id,\n { count, threshold: maxFrequency },\n );\n }\n\n return null;\n }\n\n private checkNewDestination(tx: TransactionRecord): AnomalyEvent | null {\n const history = this.store.getTransactionsByAgent(tx.agentId);\n\n // Only flag if agent has some history (new agents get a pass)\n if (history.length < 3) return null;\n\n const knownDestinations = new Set(\n history.filter((t) => t.id !== tx.id).map((t) => t.to.toLowerCase()),\n );\n\n if (!knownDestinations.has(tx.to.toLowerCase())) {\n const amount = parseAmount(tx.amount);\n const severity: AnomalySeverity =\n !isNaN(amount) && amount > parseAmount(this.thresholds.maxAmount) * 0.5\n ? 'high'\n : 'low';\n\n return this.createAnomaly(\n 'newDestination',\n severity,\n `Transaction to new destination ${tx.to} (agent has ${knownDestinations.size} known destinations)`,\n tx.agentId,\n tx.id,\n { destination: tx.to, knownDestinationCount: knownDestinations.size },\n );\n }\n\n return null;\n }\n\n private checkOffHours(tx: TransactionRecord): AnomalyEvent | null {\n const txHour = new Date(tx.timestamp).getUTCHours();\n\n if (this.thresholds.offHours.includes(txHour)) {\n return this.createAnomaly(\n 'offHoursActivity',\n 'low',\n `Transaction at ${txHour}:00 UTC falls within off-hours window`,\n tx.agentId,\n tx.id,\n { hour: txHour, offHours: this.thresholds.offHours },\n );\n }\n\n return null;\n }\n\n private checkRapidSuccession(tx: TransactionRecord): AnomalyEvent | null {\n const recentTxs = this.store\n .getTransactionsByAgent(tx.agentId)\n .filter((t) => t.id !== tx.id);\n\n if (recentTxs.length === 0) return null;\n\n const lastTx = recentTxs[recentTxs.length - 1];\n if (!lastTx) return null;\n\n const timeDiffMs =\n new Date(tx.timestamp).getTime() - new Date(lastTx.timestamp).getTime();\n const timeDiffSeconds = timeDiffMs / 1000;\n\n if (timeDiffSeconds >= 0 && timeDiffSeconds < this.thresholds.minIntervalSeconds) {\n return this.createAnomaly(\n 'rapidSuccession',\n timeDiffSeconds < 2 ? 'high' : 'medium',\n `Transaction occurred ${timeDiffSeconds.toFixed(1)}s after previous transaction (minimum: ${this.thresholds.minIntervalSeconds}s)`,\n tx.agentId,\n tx.id,\n {\n intervalSeconds: timeDiffSeconds,\n threshold: this.thresholds.minIntervalSeconds,\n previousTxId: lastTx.id,\n },\n );\n }\n\n return null;\n }\n\n private checkRoundAmount(tx: TransactionRecord): AnomalyEvent | null {\n const amount = parseAmount(tx.amount);\n if (isNaN(amount)) return null;\n\n // Check for structuring indicators: amounts just under common thresholds\n const structuringThresholds = [10000, 5000, 3000, 1000];\n for (const threshold of structuringThresholds) {\n const diff = threshold - amount;\n if (diff > 0 && diff <= threshold * 0.05) {\n // Within 5% below a threshold\n return this.createAnomaly(\n 'roundAmount',\n threshold >= 10000 ? 'high' : 'medium',\n `Transaction amount ${tx.amount} is just below the ${threshold} threshold (potential structuring)`,\n tx.agentId,\n tx.id,\n { amount: tx.amount, nearThreshold: threshold, difference: diff },\n );\n }\n }\n\n // Check for exact round amounts above 5000\n if (amount >= 5000 && amount % 1000 === 0) {\n return this.createAnomaly(\n 'roundAmount',\n 'low',\n `Transaction amount ${tx.amount} is a round number`,\n tx.agentId,\n tx.id,\n { amount: tx.amount },\n );\n }\n\n return null;\n }\n\n private checkOffHoursAction(action: ActionLog): AnomalyEvent | null {\n const actionHour = new Date(action.timestamp).getUTCHours();\n\n if (this.thresholds.offHours.includes(actionHour)) {\n return this.createAnomaly(\n 'offHoursActivity',\n 'low',\n `Action at ${actionHour}:00 UTC falls within off-hours window`,\n action.agentId,\n action.id,\n { hour: actionHour, offHours: this.thresholds.offHours },\n );\n }\n\n return null;\n }\n\n private checkActionFrequencySpike(action: ActionLog): AnomalyEvent | null {\n const oneHourAgo = new Date(Date.now() - 3600000);\n const recentActions = this.store.queryActions(\n (a) => a.agentId === action.agentId && new Date(a.timestamp) >= oneHourAgo,\n );\n\n const count = recentActions.length;\n // Use 3x the transaction frequency threshold for general actions\n const maxFrequency = this.thresholds.maxFrequency * 3;\n\n if (count > maxFrequency) {\n return this.createAnomaly(\n 'frequencySpike',\n count > maxFrequency * 2 ? 'high' : 'medium',\n `Agent ${action.agentId} has ${count} actions in the last hour (threshold: ${maxFrequency})`,\n action.agentId,\n action.id,\n { count, threshold: maxFrequency },\n );\n }\n\n return null;\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n private createAnomaly(\n type: AnomalyRuleType,\n severity: AnomalySeverity,\n description: string,\n agentId: string,\n actionId: string,\n data: Record<string, unknown>,\n ): AnomalyEvent {\n return {\n id: generateId(),\n type,\n severity,\n description,\n agentId,\n actionId,\n detectedAt: now(),\n data,\n reviewed: false,\n };\n }\n\n private notifyCallbacks(anomaly: AnomalyEvent): void {\n for (const cb of this.callbacks) {\n try {\n cb(anomaly);\n } catch (error) {\n console.warn(\n `[Kontext] Anomaly callback error for ${anomaly.type} (${anomaly.id}):`,\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n}\n","// ============================================================================\n// Kontext SDK - In-Memory Data Store with Pluggable Persistence\n// ============================================================================\n// This module provides the core data store used by the SDK. By default data\n// lives in memory (no breaking change). When a StorageAdapter is provided,\n// data can be flushed to and restored from persistent storage.\n\nimport type {\n ActionLog,\n TransactionRecord,\n Task,\n AnomalyEvent,\n} from './types.js';\nimport type { StorageAdapter } from './storage.js';\n\n/** Maximum number of entries per collection before eviction kicks in */\nexport const DEFAULT_MAX_ENTRIES = 10_000;\n\n/** Percentage of oldest entries to evict when the limit is exceeded */\nconst EVICTION_RATIO = 0.1;\n\n/** Storage keys used for persisting store data */\nconst STORAGE_KEYS = {\n actions: 'kontext:actions',\n transactions: 'kontext:transactions',\n tasks: 'kontext:tasks',\n anomalies: 'kontext:anomalies',\n} as const;\n\n/**\n * In-memory data store for the Kontext SDK.\n * Holds all action logs, transactions, tasks, and anomaly events.\n *\n * When a StorageAdapter is provided, call `flush()` to persist state\n * and `restore()` to reload from storage.\n */\nexport class KontextStore {\n private actions: ActionLog[] = [];\n private transactions: TransactionRecord[] = [];\n private tasks: Map<string, Task> = new Map();\n private anomalies: AnomalyEvent[] = [];\n private storageAdapter: StorageAdapter | null = null;\n private readonly maxEntries: number;\n\n constructor(maxEntries: number = DEFAULT_MAX_ENTRIES) {\n this.maxEntries = maxEntries;\n }\n\n /**\n * Attach a storage adapter for persistence.\n *\n * @param adapter - The storage backend to use\n */\n setStorageAdapter(adapter: StorageAdapter): void {\n this.storageAdapter = adapter;\n }\n\n /**\n * Get the currently attached storage adapter (if any).\n */\n getStorageAdapter(): StorageAdapter | null {\n return this.storageAdapter;\n }\n\n // --------------------------------------------------------------------------\n // Persistence: flush & restore\n // --------------------------------------------------------------------------\n\n /**\n * Persist all current in-memory state to the attached storage adapter.\n * No-op if no adapter is attached.\n */\n async flush(): Promise<void> {\n if (!this.storageAdapter) return;\n\n // Snapshot all collections before async save to prevent data inconsistency\n // if addAction/addTransaction/addAnomaly mutates arrays during the flush.\n const actionsSnapshot = [...this.actions];\n const transactionsSnapshot = [...this.transactions];\n const tasksSnapshot = Array.from(this.tasks.entries());\n const anomaliesSnapshot = [...this.anomalies];\n\n await Promise.all([\n this.storageAdapter.save(STORAGE_KEYS.actions, actionsSnapshot),\n this.storageAdapter.save(STORAGE_KEYS.transactions, transactionsSnapshot),\n this.storageAdapter.save(STORAGE_KEYS.tasks, tasksSnapshot),\n this.storageAdapter.save(STORAGE_KEYS.anomalies, anomaliesSnapshot),\n ]);\n }\n\n /**\n * Restore in-memory state from the attached storage adapter.\n * Merges loaded data with any existing in-memory data.\n * No-op if no adapter is attached.\n */\n async restore(): Promise<void> {\n if (!this.storageAdapter) return;\n\n const [actions, transactions, tasksEntries, anomalies] = await Promise.all([\n this.storageAdapter.load(STORAGE_KEYS.actions),\n this.storageAdapter.load(STORAGE_KEYS.transactions),\n this.storageAdapter.load(STORAGE_KEYS.tasks),\n this.storageAdapter.load(STORAGE_KEYS.anomalies),\n ]);\n\n if (Array.isArray(actions)) {\n this.actions = actions;\n }\n if (Array.isArray(transactions)) {\n this.transactions = transactions;\n }\n if (Array.isArray(tasksEntries)) {\n this.tasks = new Map(tasksEntries as [string, Task][]);\n }\n if (Array.isArray(anomalies)) {\n this.anomalies = anomalies;\n }\n }\n\n // --------------------------------------------------------------------------\n // Actions\n // --------------------------------------------------------------------------\n\n /** Append an action log entry. Evicts oldest 10% when maxEntries is exceeded. */\n addAction(action: ActionLog): void {\n this.actions.push(action);\n if (this.actions.length > this.maxEntries) {\n this.actions.splice(0, Math.ceil(this.maxEntries * EVICTION_RATIO));\n }\n }\n\n /** Retrieve all action log entries. */\n getActions(): ActionLog[] {\n return [...this.actions];\n }\n\n /** Retrieve actions filtered by a predicate. */\n queryActions(predicate: (action: ActionLog) => boolean): ActionLog[] {\n return this.actions.filter(predicate);\n }\n\n /** Get actions for a specific agent. */\n getActionsByAgent(agentId: string): ActionLog[] {\n return this.actions.filter((a) => a.agentId === agentId);\n }\n\n /** Get actions for a specific session (across all agents). */\n getActionsBySession(sessionId: string): ActionLog[] {\n return this.actions.filter((a) => a.sessionId === sessionId);\n }\n\n // --------------------------------------------------------------------------\n // Transactions\n // --------------------------------------------------------------------------\n\n /** Append a transaction record. Evicts oldest 10% when maxEntries is exceeded. */\n addTransaction(tx: TransactionRecord): void {\n this.transactions.push(tx);\n if (this.transactions.length > this.maxEntries) {\n this.transactions.splice(0, Math.ceil(this.maxEntries * EVICTION_RATIO));\n }\n }\n\n /** Retrieve all transaction records. */\n getTransactions(): TransactionRecord[] {\n return [...this.transactions];\n }\n\n /** Retrieve transactions filtered by a predicate. */\n queryTransactions(predicate: (tx: TransactionRecord) => boolean): TransactionRecord[] {\n return this.transactions.filter(predicate);\n }\n\n /** Get transactions for a specific agent. */\n getTransactionsByAgent(agentId: string): TransactionRecord[] {\n return this.transactions.filter((t) => t.agentId === agentId);\n }\n\n /** Get the most recent N transactions for an agent. */\n getRecentTransactions(agentId: string, limit: number): TransactionRecord[] {\n return this.transactions\n .filter((t) => t.agentId === agentId)\n .slice(-limit);\n }\n\n // --------------------------------------------------------------------------\n // Tasks\n // --------------------------------------------------------------------------\n\n /** Store a task. */\n addTask(task: Task): void {\n this.tasks.set(task.id, task);\n }\n\n /** Retrieve a task by ID. */\n getTask(taskId: string): Task | undefined {\n return this.tasks.get(taskId);\n }\n\n /** Update a task. */\n updateTask(taskId: string, updates: Partial<Task>): Task | undefined {\n const existing = this.tasks.get(taskId);\n if (!existing) return undefined;\n const updated: Task = { ...existing, ...updates };\n this.tasks.set(taskId, updated);\n return updated;\n }\n\n /** Retrieve all tasks. */\n getTasks(): Task[] {\n return Array.from(this.tasks.values());\n }\n\n /** Retrieve tasks filtered by a predicate. */\n queryTasks(predicate: (task: Task) => boolean): Task[] {\n return Array.from(this.tasks.values()).filter(predicate);\n }\n\n // --------------------------------------------------------------------------\n // Anomalies\n // --------------------------------------------------------------------------\n\n /** Append an anomaly event. Evicts oldest 10% when maxEntries is exceeded. */\n addAnomaly(anomaly: AnomalyEvent): void {\n this.anomalies.push(anomaly);\n if (this.anomalies.length > this.maxEntries) {\n this.anomalies.splice(0, Math.ceil(this.maxEntries * EVICTION_RATIO));\n }\n }\n\n /** Retrieve all anomaly events. */\n getAnomalies(): AnomalyEvent[] {\n return [...this.anomalies];\n }\n\n /** Retrieve anomalies filtered by a predicate. */\n queryAnomalies(predicate: (anomaly: AnomalyEvent) => boolean): AnomalyEvent[] {\n return this.anomalies.filter(predicate);\n }\n\n // --------------------------------------------------------------------------\n // Utilities\n // --------------------------------------------------------------------------\n\n /** Get total record counts across all stores. */\n getCounts(): { actions: number; transactions: number; tasks: number; anomalies: number } {\n return {\n actions: this.actions.length,\n transactions: this.transactions.length,\n tasks: this.tasks.size,\n anomalies: this.anomalies.length,\n };\n }\n\n /** Clear all stored data. Useful for testing. */\n clear(): void {\n this.actions = [];\n this.transactions = [];\n this.tasks.clear();\n this.anomalies = [];\n }\n}\n","// ============================================================================\n// Kontext SDK - Cryptographic Digest Chain\n// ============================================================================\n//\n// Implements rolling SHA-256 digest chain for tamper-evident audit trails.\n// Each event digest incorporates the prior digest, serialized event data,\n// and a salt derived from the event's high-precision timestamp.\n//\n// Formula: HD = SHA-256(HD-1 || Serialize(ED) || SD)\n// HD = current digest\n// HD-1 = prior digest (genesis hash for first event)\n// ED = event data (serialized action/transaction)\n// SD = salt derived from microsecond-precision timestamp\n// ============================================================================\n\nimport { createHash } from 'crypto';\nimport type { ActionLog } from './types.js';\n\n/** Fields excluded from digest computation (they are derived from the digest) */\nconst DIGEST_EXCLUDED_FIELDS = new Set(['digest', 'priorDigest']);\n\n/**\n * Deterministically serialize an action for digest computation.\n * Excludes digest/priorDigest fields and sorts keys for consistency.\n */\nfunction serializeForDigest(action: ActionLog): string {\n const keys = Object.keys(action).filter((k) => !DIGEST_EXCLUDED_FIELDS.has(k)).sort();\n return JSON.stringify(action, keys);\n}\n\n/** Genesis hash used as HD-1 for the first event in a chain */\nconst GENESIS_HASH = '0'.repeat(64);\n\n/** Microsecond precision timestamp */\nexport interface PrecisionTimestamp {\n /** ISO 8601 timestamp */\n iso: string;\n /** High-resolution time in nanoseconds (from process.hrtime.bigint) */\n hrtime: bigint;\n /** Microsecond component derived from hrtime */\n microseconds: number;\n}\n\n/** A single link in the digest chain */\nexport interface DigestLink {\n /** The computed SHA-256 digest for this event */\n digest: string;\n /** The prior digest (HD-1) */\n priorDigest: string;\n /** The salt derived from the timestamp */\n salt: string;\n /** The high-precision timestamp of this event */\n timestamp: PrecisionTimestamp;\n /** Sequence number in the chain (0-indexed) */\n sequence: number;\n /** The action ID this digest covers */\n actionId: string;\n}\n\n/** Result of verifying a digest chain */\nexport interface DigestVerification {\n /** Whether the entire chain is valid */\n valid: boolean;\n /** Number of links verified */\n linksVerified: number;\n /** Index of the first invalid link (-1 if all valid) */\n firstInvalidIndex: number;\n /** Verification time in milliseconds */\n verificationTimeMs: number;\n /** The terminal digest (last digest in the chain) */\n terminalDigest: string;\n}\n\n/**\n * DigestChain implements a rolling SHA-256 digest chain for tamper-evident audit trails.\n *\n * Each action logged through Kontext gets a cryptographic digest that chains\n * to all prior actions, creating a tamper-evident audit trail without\n * blockchain overhead.\n *\n * Properties:\n * - Tamper-evident: altering any past event breaks the chain\n * - Independently verifiable: any party can recompute and verify\n * - Energy efficient: <0.00001 kWh per event (99.97% less than PoS)\n * - Fast: <10ms verification at p95\n *\n * @example\n * ```typescript\n * const chain = new DigestChain();\n *\n * // Each action gets a digest link\n * const link = chain.append(action);\n * console.log(link.digest); // SHA-256 hash\n *\n * // Verify the entire chain\n * const result = chain.verify();\n * console.log(result.valid); // true if untampered\n * ```\n */\nexport class DigestChain {\n private links: DigestLink[] = [];\n private currentDigest: string = GENESIS_HASH;\n private readonly hrtimeBase: bigint;\n\n constructor() {\n this.hrtimeBase = process.hrtime.bigint();\n }\n\n /**\n * Append an action to the digest chain.\n *\n * Computes: HD = SHA-256(HD-1 || Serialize(ED) || SD)\n *\n * @param action - The action log entry to chain\n * @returns The digest link for this event\n */\n append(action: ActionLog): DigestLink {\n const timestamp = this.getPrecisionTimestamp();\n const serialized = this.serialize(action);\n const salt = this.deriveSalt(timestamp);\n\n const priorDigest = this.currentDigest;\n const digest = this.computeDigest(priorDigest, serialized, salt);\n\n const link: DigestLink = {\n digest,\n priorDigest,\n salt,\n timestamp,\n sequence: this.links.length,\n actionId: action.id,\n };\n\n this.links.push(link);\n this.currentDigest = digest;\n\n return link;\n }\n\n /**\n * Get the terminal digest — the latest digest in the chain.\n * This can be embedded in outgoing messages as proof of the entire action history.\n */\n getTerminalDigest(): string {\n return this.currentDigest;\n }\n\n /**\n * Restore the terminal digest from persisted state.\n * Called after loading actions from storage so that new actions\n * chain correctly from the last stored digest instead of genesis.\n *\n * Does NOT reconstruct the links array — in-memory verification\n * via verify() will not work after restore. Use the stored action\n * digest/priorDigest fields for cross-process chain verification.\n */\n restoreTerminalDigest(digest: string): void {\n this.currentDigest = digest;\n }\n\n /**\n * Get the number of links in the chain.\n */\n getChainLength(): number {\n return this.links.length;\n }\n\n /**\n * Get all digest links in the chain.\n */\n getLinks(): ReadonlyArray<DigestLink> {\n return this.links;\n }\n\n /**\n * Get a specific digest link by sequence number.\n */\n getLink(sequence: number): DigestLink | undefined {\n return this.links[sequence];\n }\n\n /**\n * Verify the integrity of the entire digest chain.\n *\n * Recomputes every digest from the genesis hash and compares.\n * Any tampering (modified, inserted, deleted, or reordered events)\n * will cause verification to fail.\n *\n * @param actions - The original action logs to verify against\n * @returns Verification result with timing data\n */\n verify(actions: ActionLog[]): DigestVerification {\n const start = performance.now();\n\n if (actions.length !== this.links.length) {\n return {\n valid: false,\n linksVerified: 0,\n firstInvalidIndex: 0,\n verificationTimeMs: performance.now() - start,\n terminalDigest: this.currentDigest,\n };\n }\n\n let computedDigest = GENESIS_HASH;\n\n for (let i = 0; i < this.links.length; i++) {\n const link = this.links[i]!;\n const action = actions[i]!;\n\n const serialized = this.serialize(action);\n const expectedDigest = this.computeDigest(computedDigest, serialized, link.salt);\n\n if (expectedDigest !== link.digest) {\n return {\n valid: false,\n linksVerified: i,\n firstInvalidIndex: i,\n verificationTimeMs: performance.now() - start,\n terminalDigest: this.currentDigest,\n };\n }\n\n computedDigest = expectedDigest;\n }\n\n return {\n valid: true,\n linksVerified: this.links.length,\n firstInvalidIndex: -1,\n verificationTimeMs: performance.now() - start,\n terminalDigest: this.currentDigest,\n };\n }\n\n /**\n * Verify a single link in isolation (given the expected prior digest).\n *\n * @param link - The digest link to verify\n * @param action - The action data for this link\n * @param expectedPriorDigest - The expected prior digest\n * @returns Whether the link is valid\n */\n verifyLink(link: DigestLink, action: ActionLog, expectedPriorDigest: string): boolean {\n const serialized = this.serialize(action);\n const expectedDigest = this.computeDigest(expectedPriorDigest, serialized, link.salt);\n return expectedDigest === link.digest;\n }\n\n /**\n * Export the chain data for independent verification by a third party.\n * Includes all links and enough data for recomputation.\n */\n exportChain(): { genesisHash: string; links: DigestLink[]; terminalDigest: string } {\n return {\n genesisHash: GENESIS_HASH,\n links: [...this.links],\n terminalDigest: this.currentDigest,\n };\n }\n\n // --------------------------------------------------------------------------\n // Core cryptographic operations\n // --------------------------------------------------------------------------\n\n /**\n * Compute: HD = SHA-256(HD-1 || Serialize(ED) || SD)\n */\n private computeDigest(priorDigest: string, serializedEvent: string, salt: string): string {\n const hash = createHash('sha256');\n hash.update(priorDigest);\n hash.update(serializedEvent);\n hash.update(salt);\n return hash.digest('hex');\n }\n\n /**\n * Deterministically serialize an action log for digest computation.\n * Uses sorted keys to ensure consistent serialization regardless of\n * property insertion order. Excludes digest/priorDigest fields since\n * those are computed from this serialization.\n */\n private serialize(action: ActionLog): string {\n return serializeForDigest(action);\n }\n\n /**\n * Derive a salt from the event's high-precision timestamp.\n * SD = SHA-256(microsecond_timestamp)\n */\n private deriveSalt(timestamp: PrecisionTimestamp): string {\n const hash = createHash('sha256');\n hash.update(timestamp.hrtime.toString());\n return hash.digest('hex');\n }\n\n /**\n * Get a microsecond-precision timestamp.\n * Combines wall clock time with high-resolution timer for sub-millisecond precision.\n */\n private getPrecisionTimestamp(): PrecisionTimestamp {\n const hrtime = process.hrtime.bigint();\n const delta = hrtime >= this.hrtimeBase ? hrtime - this.hrtimeBase : 0n;\n const microseconds = Number(delta % 1000000n);\n\n return {\n iso: new Date().toISOString(),\n hrtime,\n microseconds,\n };\n }\n}\n\n/**\n * Independently verify a digest chain exported from another Kontext instance.\n * This enables third-party verification without access to the original SDK.\n *\n * @param chain - The exported chain data\n * @param actions - The original action logs\n * @returns Whether the chain is valid\n */\nexport function verifyExportedChain(\n chain: { genesisHash: string; links: DigestLink[]; terminalDigest: string },\n actions: ActionLog[],\n): DigestVerification {\n const start = performance.now();\n\n if (actions.length !== chain.links.length) {\n return {\n valid: false,\n linksVerified: 0,\n firstInvalidIndex: 0,\n verificationTimeMs: performance.now() - start,\n terminalDigest: chain.terminalDigest,\n };\n }\n\n let computedDigest = chain.genesisHash;\n\n for (let i = 0; i < chain.links.length; i++) {\n const link = chain.links[i]!;\n const action = actions[i]!;\n\n const serialized = serializeForDigest(action);\n\n const hash = createHash('sha256');\n hash.update(computedDigest);\n hash.update(serialized);\n hash.update(link.salt);\n const expectedDigest = hash.digest('hex');\n\n if (expectedDigest !== link.digest) {\n return {\n valid: false,\n linksVerified: i,\n firstInvalidIndex: i,\n verificationTimeMs: performance.now() - start,\n terminalDigest: chain.terminalDigest,\n };\n }\n\n computedDigest = expectedDigest;\n }\n\n // Verify terminal digest matches\n const valid = computedDigest === chain.terminalDigest;\n\n return {\n valid,\n linksVerified: chain.links.length,\n firstInvalidIndex: valid ? -1 : chain.links.length,\n verificationTimeMs: performance.now() - start,\n terminalDigest: chain.terminalDigest,\n };\n}\n","// ============================================================================\n// Kontext SDK - Action Logger\n// ============================================================================\n\nimport type {\n ActionLog,\n TransactionRecord,\n LogActionInput,\n LogTransactionInput,\n KontextConfig,\n Chain,\n Token,\n LogLevel,\n} from './types.js';\nimport { KontextError, KontextErrorCode } from './types.js';\nimport { KontextStore } from './store.js';\nimport { DigestChain } from './digest.js';\nimport { generateId, now, isValidAddress, isValidTxHash, parseAmount } from './utils.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/** Numeric severity map for log level comparison */\nconst LOG_LEVEL_SEVERITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * ActionLogger handles structured logging of all agent actions.\n *\n * Supports two output modes:\n * - **Local mode** (no API key): Writes structured JSON logs to the local filesystem.\n * - **Cloud mode** (with API key): Batches and sends logs to the Kontext API.\n *\n * Logs include timestamps, agent IDs, correlation IDs, and arbitrary metadata\n * for full audit traceability.\n */\nexport class ActionLogger {\n private readonly config: KontextConfig;\n private readonly store: KontextStore;\n private readonly digestChain: DigestChain;\n private batch: ActionLog[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private readonly batchSize: number;\n private readonly flushIntervalMs: number;\n private readonly isCloudMode: boolean;\n private readonly logLevel: LogLevel;\n\n constructor(config: KontextConfig, store: KontextStore) {\n this.config = config;\n this.store = store;\n this.digestChain = new DigestChain();\n this.batchSize = config.batchSize ?? 50;\n this.flushIntervalMs = config.flushIntervalMs ?? 5000;\n this.isCloudMode = !!config.apiKey;\n this.logLevel = config.logLevel ?? (config.debug ? 'debug' : 'warn');\n\n // Start the periodic flush timer\n this.flushTimer = setInterval(() => {\n void this.flush();\n }, this.flushIntervalMs);\n\n // Prevent the timer from keeping the process alive\n if (this.flushTimer && typeof this.flushTimer === 'object' && 'unref' in this.flushTimer) {\n this.flushTimer.unref();\n }\n }\n\n /**\n * Log a generic agent action.\n *\n * @param input - Action details including type, description, agentId, and metadata\n * @returns The created ActionLog entry\n *\n * @example\n * ```typescript\n * const action = await logger.log({\n * type: 'approval',\n * description: 'Agent approved USDC spending',\n * agentId: 'agent-1',\n * metadata: { spender: '0x...', amount: '1000' },\n * });\n * ```\n */\n async log(input: LogActionInput): Promise<ActionLog> {\n const action: ActionLog = {\n id: generateId(),\n timestamp: now(),\n projectId: this.config.projectId,\n agentId: input.agentId,\n ...(input.sessionId ? { sessionId: input.sessionId } : {}),\n correlationId: input.correlationId ?? generateId(),\n type: input.type,\n description: input.description,\n metadata: input.metadata ?? {},\n };\n\n // Compute rolling SHA-256 digest\n const link = this.digestChain.append(action);\n action.digest = link.digest;\n action.priorDigest = link.priorDigest;\n\n this.store.addAction(action);\n this.batch.push(action);\n\n if (this.batch.length >= this.batchSize) {\n await this.flush();\n }\n\n this.emitLog('debug', 'Action logged', action);\n\n return action;\n }\n\n /**\n * Log a cryptocurrency transaction with full chain details.\n *\n * @param input - Transaction details including txHash, chain, amount, token, from, to\n * @returns The created TransactionRecord\n *\n * @example\n * ```typescript\n * const tx = await logger.logTransaction({\n * txHash: '0xabc123...',\n * chain: 'base',\n * amount: '100.00',\n * token: 'USDC',\n * from: '0xSender...',\n * to: '0xReceiver...',\n * agentId: 'payment-agent-1',\n * });\n * ```\n */\n async logTransaction(input: LogTransactionInput): Promise<TransactionRecord> {\n this.validateTransactionInput(input);\n\n const correlationId = input.correlationId ?? generateId();\n\n const description = input.token && input.chain\n ? `${input.token} transfer of ${input.amount} on ${input.chain}`\n : `${input.currency ?? 'USD'} payment of ${input.amount}${input.paymentMethod ? ` via ${input.paymentMethod}` : ''}`;\n\n const record: TransactionRecord = {\n id: generateId(),\n timestamp: now(),\n projectId: this.config.projectId,\n agentId: input.agentId,\n ...(input.sessionId ? { sessionId: input.sessionId } : {}),\n correlationId,\n type: 'transaction',\n description,\n metadata: {\n ...input.metadata,\n },\n amount: input.amount,\n from: input.from,\n to: input.to,\n ...(input.txHash ? { txHash: input.txHash } : {}),\n ...(input.chain ? { chain: input.chain } : {}),\n ...(input.token ? { token: input.token } : {}),\n ...(input.currency ? { currency: input.currency } : {}),\n ...(input.paymentMethod ? { paymentMethod: input.paymentMethod } : {}),\n ...(input.paymentReference ? { paymentReference: input.paymentReference } : {}),\n };\n\n // Compute rolling SHA-256 digest\n const link = this.digestChain.append(record);\n record.digest = link.digest;\n record.priorDigest = link.priorDigest;\n\n this.store.addTransaction(record);\n this.store.addAction(record);\n this.batch.push(record);\n\n if (this.batch.length >= this.batchSize) {\n await this.flush();\n }\n\n this.emitLog('debug', 'Transaction logged', record);\n\n return record;\n }\n\n /**\n * Flush the current batch of logs.\n * In local mode, writes to a JSON file.\n * In cloud mode, sends to the Kontext API.\n */\n async flush(): Promise<void> {\n if (this.batch.length === 0) return;\n\n const toFlush = [...this.batch];\n this.batch = [];\n\n if (this.isCloudMode) {\n await this.flushToApi(toFlush);\n } else {\n this.flushToFile(toFlush);\n }\n }\n\n /**\n * Stop the logger and flush any remaining logs.\n */\n async destroy(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n\n // --------------------------------------------------------------------------\n // Digest Chain Access\n // --------------------------------------------------------------------------\n\n /**\n * Get the terminal digest — the latest SHA-256 digest in the chain.\n * Can be embedded in outgoing messages as tamper-evident proof.\n */\n getTerminalDigest(): string {\n return this.digestChain.getTerminalDigest();\n }\n\n /**\n * Get the full digest chain for export or verification.\n */\n getDigestChain(): DigestChain {\n return this.digestChain;\n }\n\n /**\n * Verify the integrity of the digest chain against stored actions.\n */\n verifyChain(actions: ActionLog[]): ReturnType<DigestChain['verify']> {\n return this.digestChain.verify(actions);\n }\n\n /**\n * Restore chain state from persisted actions so that new actions\n * chain correctly across process boundaries.\n */\n restoreChainState(terminalDigest: string): void {\n this.digestChain.restoreTerminalDigest(terminalDigest);\n }\n\n // --------------------------------------------------------------------------\n // Private helpers\n // --------------------------------------------------------------------------\n\n private validateTransactionInput(input: LogTransactionInput): void {\n const amount = parseAmount(input.amount);\n if (isNaN(amount) || amount < 0) {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n `Invalid transaction amount: ${input.amount}`,\n { field: 'amount', value: input.amount },\n );\n }\n\n if (!input.from || input.from.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Sender (from) is required',\n { field: 'from' },\n );\n }\n\n if (!input.to || input.to.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Recipient (to) is required',\n { field: 'to' },\n );\n }\n\n // Crypto-specific validation: if any blockchain field is present, all must be\n const hasCryptoFields = input.txHash !== undefined || input.chain !== undefined || input.token !== undefined;\n if (hasCryptoFields) {\n if (!input.txHash || input.txHash.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Transaction hash is required for crypto transactions',\n { field: 'txHash' },\n );\n }\n\n const validChains: Chain[] = ['ethereum', 'base', 'polygon', 'arbitrum', 'optimism', 'arc', 'avalanche', 'solana'];\n if (!input.chain || !validChains.includes(input.chain)) {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n `Invalid chain: ${input.chain}. Must be one of: ${validChains.join(', ')}`,\n { field: 'chain', value: input.chain },\n );\n }\n\n const validTokens: Token[] = ['USDC', 'USDT', 'DAI', 'EURC', 'USDP', 'USDG'];\n if (!input.token || !validTokens.includes(input.token)) {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n `Invalid token: ${input.token}. Must be one of: ${validTokens.join(', ')}`,\n { field: 'token', value: input.token },\n );\n }\n }\n }\n\n private flushToFile(actions: ActionLog[]): void {\n const outputDir = this.config.localOutputDir ?? '.kontext';\n const logDir = path.join(outputDir, 'logs');\n\n try {\n fs.mkdirSync(logDir, { recursive: true });\n\n const filename = `actions-${new Date().toISOString().split('T')[0]}.jsonl`;\n const filePath = path.join(logDir, filename);\n\n const lines = actions.map((a) => JSON.stringify(a)).join('\\n') + '\\n';\n fs.appendFileSync(filePath, lines, 'utf-8');\n } catch (error) {\n this.emitLog('warn', 'Failed to write log file', { error });\n }\n }\n\n private async flushToApi(actions: ActionLog[]): Promise<void> {\n const apiUrl = this.config.apiUrl ?? process.env['KONTEXT_API_URL'] ?? 'https://api.kontext.so';\n\n try {\n const response = await fetch(`${apiUrl}/v1/actions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n 'X-Project-Id': this.config.projectId,\n },\n body: JSON.stringify({ actions }),\n });\n\n if (!response.ok) {\n throw new KontextError(\n KontextErrorCode.API_ERROR,\n `API request failed with status ${response.status}`,\n { status: response.status },\n );\n }\n } catch (error) {\n if (error instanceof KontextError) throw error;\n\n // On API failure, fall back to local file storage\n this.emitLog('warn', 'API flush failed, falling back to local file', { error });\n this.flushToFile(actions);\n }\n }\n\n /**\n * Emit a log message at the specified severity level.\n * Only outputs if the message level meets or exceeds the configured logLevel.\n */\n emitLog(level: LogLevel, message: string, data?: unknown): void {\n if (LOG_LEVEL_SEVERITY[level] < LOG_LEVEL_SEVERITY[this.logLevel]) {\n return;\n }\n\n const timestamp = now();\n const formatted = `[Kontext ${timestamp}] ${message}`;\n const payload = data ? JSON.stringify(data, null, 2) : '';\n\n switch (level) {\n case 'debug':\n console.debug(formatted, payload);\n break;\n case 'info':\n console.info(formatted, payload);\n break;\n case 'warn':\n console.warn(formatted, payload);\n break;\n case 'error':\n console.error(formatted, payload);\n break;\n }\n }\n}\n","// ============================================================================\n// Kontext SDK - Task Confirmation\n// ============================================================================\n\nimport type {\n Task,\n CreateTaskInput,\n ConfirmTaskInput,\n TaskStatus,\n KontextConfig,\n} from './types.js';\nimport { KontextError, KontextErrorCode } from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now } from './utils.js';\n\n/** Default task expiration: 24 hours */\nconst DEFAULT_EXPIRATION_MS = 24 * 60 * 60 * 1000;\n\n/**\n * TaskManager handles creation, confirmation, and lifecycle tracking of\n * agent tasks that require evidence to be marked complete.\n *\n * Tasks follow this lifecycle:\n * 1. **pending** -- Created, awaiting agent action.\n * 2. **in_progress** -- Agent has started work (optional).\n * 3. **confirmed** -- Evidence provided and validated.\n * 4. **failed** -- Confirmation failed or was rejected.\n * 5. **expired** -- Task exceeded its expiration window.\n *\n * Evidence-based confirmation ensures that agent claims are backed by\n * verifiable on-chain data (transaction hashes, receipts, proofs).\n */\nexport class TaskManager {\n private readonly config: KontextConfig;\n private readonly store: KontextStore;\n\n constructor(config: KontextConfig, store: KontextStore) {\n this.config = config;\n this.store = store;\n }\n\n /**\n * Create a new tracked task.\n *\n * @param input - Task details including description, agentId, and required evidence types\n * @returns The created Task\n *\n * @example\n * ```typescript\n * const task = await taskManager.createTask({\n * description: 'Transfer 100 USDC to vendor wallet',\n * agentId: 'payment-agent-1',\n * requiredEvidence: ['txHash', 'receipt'],\n * });\n * ```\n */\n async createTask(input: CreateTaskInput): Promise<Task> {\n this.validateCreateInput(input);\n\n const id = generateId();\n const timestamp = now();\n const expiresInMs = input.expiresInMs ?? DEFAULT_EXPIRATION_MS;\n\n const task: Task = {\n id,\n projectId: this.config.projectId,\n description: input.description,\n agentId: input.agentId,\n status: 'pending',\n requiredEvidence: input.requiredEvidence,\n providedEvidence: null,\n correlationId: input.correlationId ?? generateId(),\n createdAt: timestamp,\n updatedAt: timestamp,\n confirmedAt: null,\n expiresAt: new Date(Date.now() + expiresInMs).toISOString(),\n metadata: input.metadata ?? {},\n };\n\n this.store.addTask(task);\n\n if (this.config.debug) {\n console.debug(`[Kontext] Task created: ${id} - ${input.description}`);\n }\n\n return task;\n }\n\n /**\n * Confirm a task by providing evidence.\n * Validates that all required evidence types are present.\n *\n * @param input - Task ID and evidence data\n * @returns The updated Task\n *\n * @example\n * ```typescript\n * const confirmed = await taskManager.confirmTask({\n * taskId: 'task-123',\n * evidence: {\n * txHash: '0xabc123...',\n * receipt: { status: 'confirmed', blockNumber: 12345 },\n * },\n * });\n * ```\n */\n async confirmTask(input: ConfirmTaskInput): Promise<Task> {\n const task = this.store.getTask(input.taskId);\n\n if (!task) {\n throw new KontextError(\n KontextErrorCode.TASK_NOT_FOUND,\n `Task not found: ${input.taskId}`,\n { taskId: input.taskId },\n );\n }\n\n // Check task hasn't already been confirmed\n if (task.status === 'confirmed') {\n throw new KontextError(\n KontextErrorCode.TASK_ALREADY_CONFIRMED,\n `Task already confirmed: ${input.taskId}`,\n { taskId: input.taskId, confirmedAt: task.confirmedAt },\n );\n }\n\n // Check task hasn't expired\n if (task.expiresAt && new Date(task.expiresAt) < new Date()) {\n this.store.updateTask(input.taskId, {\n status: 'expired',\n updatedAt: now(),\n });\n throw new KontextError(\n KontextErrorCode.TASK_EXPIRED,\n `Task has expired: ${input.taskId}`,\n { taskId: input.taskId, expiresAt: task.expiresAt },\n );\n }\n\n // Validate that all required evidence is present\n const missingEvidence = this.findMissingEvidence(task.requiredEvidence, input.evidence);\n if (missingEvidence.length > 0) {\n throw new KontextError(\n KontextErrorCode.INSUFFICIENT_EVIDENCE,\n `Missing required evidence: ${missingEvidence.join(', ')}`,\n { taskId: input.taskId, missingEvidence },\n );\n }\n\n const timestamp = now();\n const updated = this.store.updateTask(input.taskId, {\n status: 'confirmed',\n providedEvidence: input.evidence,\n confirmedAt: timestamp,\n updatedAt: timestamp,\n });\n\n if (!updated) {\n throw new KontextError(\n KontextErrorCode.TASK_NOT_FOUND,\n `Failed to update task: ${input.taskId}`,\n { taskId: input.taskId },\n );\n }\n\n if (this.config.debug) {\n console.debug(`[Kontext] Task confirmed: ${input.taskId}`);\n }\n\n return updated;\n }\n\n /**\n * Get the current status and details of a task.\n *\n * @param taskId - The task identifier\n * @returns The task, or undefined if not found\n */\n async getTaskStatus(taskId: string): Promise<Task | undefined> {\n const task = this.store.getTask(taskId);\n\n if (!task) return undefined;\n\n // Auto-expire tasks that have passed their expiration\n if (task.expiresAt && task.status === 'pending' && new Date(task.expiresAt) < new Date()) {\n const updated = this.store.updateTask(taskId, {\n status: 'expired',\n updatedAt: now(),\n });\n return updated;\n }\n\n return task;\n }\n\n /**\n * Mark a task as in-progress.\n *\n * @param taskId - The task identifier\n * @returns The updated Task\n */\n async startTask(taskId: string): Promise<Task> {\n const task = this.store.getTask(taskId);\n\n if (!task) {\n throw new KontextError(\n KontextErrorCode.TASK_NOT_FOUND,\n `Task not found: ${taskId}`,\n { taskId },\n );\n }\n\n if (task.status !== 'pending') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n `Task cannot be started from status: ${task.status}`,\n { taskId, currentStatus: task.status },\n );\n }\n\n const updated = this.store.updateTask(taskId, {\n status: 'in_progress',\n updatedAt: now(),\n });\n\n if (!updated) {\n throw new KontextError(\n KontextErrorCode.TASK_NOT_FOUND,\n `Failed to update task: ${taskId}`,\n { taskId },\n );\n }\n\n return updated;\n }\n\n /**\n * Mark a task as failed.\n *\n * @param taskId - The task identifier\n * @param reason - Reason for failure\n * @returns The updated Task\n */\n async failTask(taskId: string, reason: string): Promise<Task> {\n const task = this.store.getTask(taskId);\n\n if (!task) {\n throw new KontextError(\n KontextErrorCode.TASK_NOT_FOUND,\n `Task not found: ${taskId}`,\n { taskId },\n );\n }\n\n const updated = this.store.updateTask(taskId, {\n status: 'failed',\n updatedAt: now(),\n metadata: { ...task.metadata, failureReason: reason },\n });\n\n if (!updated) {\n throw new KontextError(\n KontextErrorCode.TASK_NOT_FOUND,\n `Failed to update task: ${taskId}`,\n { taskId },\n );\n }\n\n return updated;\n }\n\n /**\n * Get all tasks, optionally filtered by status.\n *\n * @param status - Optional status filter\n * @returns Array of matching tasks\n */\n getTasks(status?: TaskStatus): Task[] {\n if (status) {\n return this.store.queryTasks((t) => t.status === status);\n }\n return this.store.getTasks();\n }\n\n // --------------------------------------------------------------------------\n // Private helpers\n // --------------------------------------------------------------------------\n\n private validateCreateInput(input: CreateTaskInput): void {\n if (!input.description || input.description.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Task description is required',\n { field: 'description' },\n );\n }\n\n if (!input.agentId || input.agentId.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Agent ID is required',\n { field: 'agentId' },\n );\n }\n\n if (!input.requiredEvidence || input.requiredEvidence.length === 0) {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'At least one required evidence type must be specified',\n { field: 'requiredEvidence' },\n );\n }\n }\n\n private findMissingEvidence(\n required: string[],\n provided: Record<string, unknown>,\n ): string[] {\n return required.filter((key) => {\n const value = provided[key];\n return value === undefined || value === null;\n });\n }\n}\n","// ============================================================================\n// Kontext SDK - Audit Export & Reporting\n// ============================================================================\n\nimport type {\n ActionLog,\n TransactionRecord,\n Task,\n AnomalyEvent,\n ExportOptions,\n ExportResult,\n ReportOptions,\n ComplianceReport,\n KontextConfig,\n} from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now, isWithinDateRange, toCsv } from './utils.js';\n\n/**\n * AuditExporter handles compliance data export and report generation.\n *\n * Supports exporting action logs, transaction records, tasks, and anomaly\n * events in JSON or CSV format with flexible date range and entity filters.\n *\n * Reports aggregate data into compliance-ready summaries with statistics,\n * suitable for regulatory submission and internal auditing.\n */\nexport class AuditExporter {\n private readonly config: KontextConfig;\n private readonly store: KontextStore;\n\n constructor(config: KontextConfig, store: KontextStore) {\n this.config = config;\n this.store = store;\n }\n\n /**\n * Export audit data in the specified format.\n *\n * @param options - Export configuration including format, date range, and filters\n * @returns ExportResult containing the formatted data\n *\n * @example\n * ```typescript\n * const result = await exporter.export({\n * format: 'json',\n * dateRange: { start: new Date('2026-01-01'), end: new Date() },\n * agentIds: ['payment-agent-1'],\n * includeTasks: true,\n * includeAnomalies: true,\n * });\n * ```\n */\n async export(options: ExportOptions): Promise<ExportResult> {\n const actions = this.filterActions(options);\n const transactions = this.filterTransactions(options);\n const tasks = options.includeTasks ? this.filterTasks(options) : [];\n const anomalies = options.includeAnomalies ? this.filterAnomalies(options) : [];\n\n const records: Record<string, unknown> = {\n actions,\n transactions,\n tasks,\n anomalies,\n exportMetadata: {\n projectId: this.config.projectId,\n exportedAt: now(),\n filters: {\n dateRange: options.dateRange\n ? { start: options.dateRange.start.toISOString(), end: options.dateRange.end.toISOString() }\n : null,\n agentIds: options.agentIds ?? null,\n types: options.types ?? null,\n chains: options.chains ?? null,\n },\n },\n };\n\n const totalCount =\n actions.length + transactions.length + tasks.length + anomalies.length;\n\n let data: string;\n\n if (options.format === 'csv') {\n data = this.formatAsCsv(actions, transactions, tasks, anomalies);\n } else {\n data = JSON.stringify(records, null, 2);\n }\n\n return {\n format: options.format,\n exportedAt: now(),\n recordCount: totalCount,\n data,\n };\n }\n\n /**\n * Generate a compliance report for a given period.\n *\n * @param options - Report configuration including type, period, and filters\n * @returns ComplianceReport with summary statistics and detailed records\n *\n * @example\n * ```typescript\n * const report = await exporter.generateReport({\n * type: 'compliance',\n * period: { start: new Date('2026-01-01'), end: new Date() },\n * });\n * ```\n */\n async generateReport(options: ReportOptions): Promise<ComplianceReport> {\n const exportOptions: ExportOptions = {\n format: 'json',\n dateRange: options.period,\n agentIds: options.agentIds,\n includeTasks: true,\n includeAnomalies: true,\n };\n\n const actions = this.filterActions(exportOptions);\n const transactions = this.filterTransactions(exportOptions);\n const tasks = this.filterTasks(exportOptions);\n const anomalies = this.filterAnomalies(exportOptions);\n\n const confirmedTasks = tasks.filter((t) => t.status === 'confirmed').length;\n const failedTasks = tasks.filter((t) => t.status === 'failed').length;\n\n // Compute average trust score from actions\n // For the report, we approximate based on confirmed vs total tasks\n const taskCompletionRate = tasks.length > 0 ? confirmedTasks / tasks.length : 1;\n const anomalyRate = actions.length > 0 ? 1 - anomalies.length / actions.length : 1;\n const averageTrustScore = Math.round(\n (taskCompletionRate * 50 + anomalyRate * 50) * 100,\n ) / 100;\n\n const report: ComplianceReport = {\n id: generateId(),\n type: options.type,\n generatedAt: now(),\n period: options.period,\n projectId: this.config.projectId,\n summary: {\n totalActions: actions.length,\n totalTransactions: transactions.length,\n totalTasks: tasks.length,\n confirmedTasks,\n failedTasks,\n totalAnomalies: anomalies.length,\n averageTrustScore,\n },\n actions,\n transactions,\n tasks,\n anomalies,\n };\n\n return report;\n }\n\n // --------------------------------------------------------------------------\n // Private filtering\n // --------------------------------------------------------------------------\n\n private filterActions(options: ExportOptions): ActionLog[] {\n return this.store.queryActions((action) => {\n if (options.dateRange && !isWithinDateRange(action.timestamp, options.dateRange.start, options.dateRange.end)) {\n return false;\n }\n if (options.agentIds && !options.agentIds.includes(action.agentId)) {\n return false;\n }\n if (options.types && !options.types.includes(action.type)) {\n return false;\n }\n return true;\n });\n }\n\n private filterTransactions(options: ExportOptions): TransactionRecord[] {\n return this.store.queryTransactions((tx) => {\n if (options.dateRange && !isWithinDateRange(tx.timestamp, options.dateRange.start, options.dateRange.end)) {\n return false;\n }\n if (options.agentIds && !options.agentIds.includes(tx.agentId)) {\n return false;\n }\n if (options.chains && (!tx.chain || !options.chains.includes(tx.chain))) {\n return false;\n }\n return true;\n });\n }\n\n private filterTasks(options: ExportOptions): Task[] {\n return this.store.queryTasks((task) => {\n if (options.dateRange && !isWithinDateRange(task.createdAt, options.dateRange.start, options.dateRange.end)) {\n return false;\n }\n if (options.agentIds && !options.agentIds.includes(task.agentId)) {\n return false;\n }\n return true;\n });\n }\n\n private filterAnomalies(options: ExportOptions): AnomalyEvent[] {\n return this.store.queryAnomalies((anomaly) => {\n if (options.dateRange && !isWithinDateRange(anomaly.detectedAt, options.dateRange.start, options.dateRange.end)) {\n return false;\n }\n if (options.agentIds && !options.agentIds.includes(anomaly.agentId)) {\n return false;\n }\n return true;\n });\n }\n\n // --------------------------------------------------------------------------\n // CSV formatting\n // --------------------------------------------------------------------------\n\n private formatAsCsv(\n actions: ActionLog[],\n transactions: TransactionRecord[],\n tasks: Task[],\n anomalies: AnomalyEvent[],\n ): string {\n const sections: string[] = [];\n\n if (actions.length > 0) {\n const actionRecords = actions.map((a) => ({\n section: 'action',\n id: a.id,\n timestamp: a.timestamp,\n projectId: a.projectId,\n agentId: a.agentId,\n correlationId: a.correlationId,\n type: a.type,\n description: a.description,\n metadata: JSON.stringify(a.metadata),\n }));\n sections.push('# Actions\\n' + toCsv(actionRecords));\n }\n\n if (transactions.length > 0) {\n const txRecords = transactions.map((t) => ({\n section: 'transaction',\n id: t.id,\n timestamp: t.timestamp,\n txHash: t.txHash,\n chain: t.chain,\n amount: t.amount,\n token: t.token,\n from: t.from,\n to: t.to,\n agentId: t.agentId,\n }));\n sections.push('# Transactions\\n' + toCsv(txRecords));\n }\n\n if (tasks.length > 0) {\n const taskRecords = tasks.map((t) => ({\n section: 'task',\n id: t.id,\n description: t.description,\n agentId: t.agentId,\n status: t.status,\n createdAt: t.createdAt,\n confirmedAt: t.confirmedAt ?? '',\n requiredEvidence: t.requiredEvidence.join(';'),\n }));\n sections.push('# Tasks\\n' + toCsv(taskRecords));\n }\n\n if (anomalies.length > 0) {\n const anomalyRecords = anomalies.map((a) => ({\n section: 'anomaly',\n id: a.id,\n type: a.type,\n severity: a.severity,\n description: a.description,\n agentId: a.agentId,\n detectedAt: a.detectedAt,\n reviewed: String(a.reviewed),\n }));\n sections.push('# Anomalies\\n' + toCsv(anomalyRecords));\n }\n\n return sections.join('\\n\\n');\n }\n}\n","// ============================================================================\n// Kontext SDK - General Payment Compliance\n// ============================================================================\n//\n// Compliance checks for general (non-crypto) payments: wire transfers, ACH,\n// card payments, and any USD/EUR/GBP flow. Performs name-based OFAC entity\n// screening using the full SDN list (18,664 entities from `kontext sync --full`).\n//\n// Mirrors UsdcCompliance.checkTransaction() pattern and returns the same\n// UsdcComplianceCheck type for consistency.\n//\n\nimport type {\n LogTransactionInput,\n UsdcComplianceCheck,\n ComplianceCheckResult,\n AnomalySeverity,\n} from '../types.js';\nimport { parseAmount } from '../utils.js';\nimport { UsdcCompliance } from './usdc.js';\n\n/** Threshold amounts aligned with GENIUS Act / BSA requirements */\nconst ENHANCED_DUE_DILIGENCE_THRESHOLD = 3000;\nconst REPORTING_THRESHOLD = 10000;\nconst LARGE_TRANSACTION_THRESHOLD = 50000;\n\n/** Similarity threshold for name-based OFAC screening (higher = fewer false positives) */\nconst NAME_MATCH_THRESHOLD = 0.85;\n\n/**\n * General payment compliance checks.\n *\n * Runs OFAC entity name screening (when from/to are names) or address\n * screening (when from/to are blockchain addresses), plus BSA threshold checks.\n *\n * @example\n * ```typescript\n * const check = PaymentCompliance.checkPayment({\n * amount: '15000',\n * currency: 'USD',\n * from: 'Acme Corporation',\n * to: 'Global Payments Inc',\n * agentId: 'ap-system',\n * paymentMethod: 'wire',\n * });\n * if (!check.compliant) {\n * console.log('Non-compliant:', check.recommendations);\n * }\n * ```\n */\n/** Lazy-loaded screener — ofac-sanctions.ts is an optional paid-tier module */\ninterface EntityScreenResult {\n entity: { list: string };\n similarity: number;\n matchedOn: string;\n}\ninterface EntityScreener {\n searchEntityName(query: string, threshold: number): EntityScreenResult[];\n}\n\nlet _screener: EntityScreener | null = null;\nlet _screenerLoaded = false;\n\nfunction getScreener(): EntityScreener | null {\n if (!_screenerLoaded) {\n _screenerLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const mod = require('./ofac-sanctions.js');\n if (mod.OFACSanctionsScreener) {\n _screener = new mod.OFACSanctionsScreener();\n }\n } catch {\n // ofac-sanctions module not available (free-tier build) — name screening disabled\n }\n }\n return _screener;\n}\n\nexport class PaymentCompliance {\n\n /**\n * Run compliance checks on a general payment.\n *\n * @param input - Payment to evaluate\n * @returns UsdcComplianceCheck with pass/fail results and recommendations\n */\n static checkPayment(input: LogTransactionInput): UsdcComplianceCheck {\n const checks: ComplianceCheckResult[] = [];\n\n checks.push(PaymentCompliance.checkAmountValid(input.amount));\n checks.push(PaymentCompliance.checkEntityScreening(input.from, 'sender'));\n checks.push(PaymentCompliance.checkEntityScreening(input.to, 'recipient'));\n checks.push(PaymentCompliance.checkEnhancedDueDiligence(input.amount));\n checks.push(PaymentCompliance.checkReportingThreshold(input.amount));\n\n const failedChecks = checks.filter((c) => !c.passed);\n const compliant = failedChecks.every((c) => c.severity === 'low');\n\n const highestSeverity = failedChecks.reduce<AnomalySeverity>(\n (max, c) => {\n const order: AnomalySeverity[] = ['low', 'medium', 'high', 'critical'];\n return order.indexOf(c.severity) > order.indexOf(max) ? c.severity : max;\n },\n 'low',\n );\n\n const recommendations = PaymentCompliance.generateRecommendations(checks, input);\n\n return {\n compliant,\n checks,\n riskLevel: highestSeverity,\n recommendations,\n };\n }\n\n // --------------------------------------------------------------------------\n // Individual checks\n // --------------------------------------------------------------------------\n\n private static checkAmountValid(amount: string): ComplianceCheckResult {\n const parsed = parseAmount(amount);\n const isValid = !isNaN(parsed) && parsed > 0;\n return {\n name: 'amount_valid',\n passed: isValid,\n description: isValid\n ? `Payment amount ${amount} is valid`\n : `Payment amount ${amount} is invalid`,\n severity: isValid ? 'low' : 'critical',\n };\n }\n\n private static checkEntityScreening(\n entity: string,\n label: string,\n ): ComplianceCheckResult {\n // If it looks like a blockchain address, delegate to address screening\n if (/^0x[a-fA-F0-9]{40}$/.test(entity)) {\n const sanctioned = UsdcCompliance.isSanctioned(entity);\n return {\n name: `entity_screening_${label}`,\n passed: !sanctioned,\n description: sanctioned\n ? `${label} address ${entity} matches OFAC SDN sanctioned address`\n : `${label} address passed sanctions screening`,\n severity: sanctioned ? 'critical' : 'low',\n };\n }\n\n // Name-based screening via OFACSanctionsScreener fuzzy matching.\n // The screener is optional — when ofac-sanctions module isn't available\n // (free-tier CI build), name screening is skipped (addresses still checked above).\n const screener = getScreener();\n if (!screener) {\n return {\n name: `entity_screening_${label}`,\n passed: true,\n description: `${label} \"${entity}\" — name-based OFAC screening not available (address screening active)`,\n severity: 'low',\n };\n }\n\n // Filter results: (1) enforce threshold (searchEntityName's substring check can\n // bypass it), (2) require matched name is at least 4 chars to avoid tiny aliases\n // like \"SE\" or \"TIO\" matching common business names.\n const rawMatches = screener.searchEntityName(entity, NAME_MATCH_THRESHOLD);\n const matches = rawMatches.filter(\n (m) => m.similarity >= NAME_MATCH_THRESHOLD && m.matchedOn.length >= 4,\n );\n\n if (matches.length > 0) {\n const topMatch = matches[0]!;\n const isActive = topMatch.entity.list !== 'DELISTED';\n\n if (isActive) {\n return {\n name: `entity_screening_${label}`,\n passed: false,\n description: `${label} \"${entity}\" matches OFAC SDN entity \"${topMatch.matchedOn}\" (${Math.round(topMatch.similarity * 100)}% match)`,\n severity: 'critical',\n };\n }\n\n // Delisted entity — flag but don't block\n return {\n name: `entity_screening_${label}`,\n passed: true,\n description: `${label} \"${entity}\" matches delisted entity \"${topMatch.matchedOn}\" — enhanced due diligence recommended`,\n severity: 'medium',\n };\n }\n\n return {\n name: `entity_screening_${label}`,\n passed: true,\n description: `${label} \"${entity}\" passed OFAC entity screening`,\n severity: 'low',\n };\n }\n\n private static checkEnhancedDueDiligence(amount: string): ComplianceCheckResult {\n const parsed = parseAmount(amount);\n const requiresEdd = !isNaN(parsed) && parsed >= ENHANCED_DUE_DILIGENCE_THRESHOLD;\n\n return {\n name: 'enhanced_due_diligence',\n passed: true,\n description: requiresEdd\n ? `Amount ${amount} requires enhanced due diligence (threshold: ${ENHANCED_DUE_DILIGENCE_THRESHOLD})`\n : `Amount ${amount} is below enhanced due diligence threshold`,\n severity: requiresEdd ? 'medium' : 'low',\n };\n }\n\n private static checkReportingThreshold(amount: string): ComplianceCheckResult {\n const parsed = parseAmount(amount);\n const requiresReporting = !isNaN(parsed) && parsed >= REPORTING_THRESHOLD;\n const isLarge = !isNaN(parsed) && parsed >= LARGE_TRANSACTION_THRESHOLD;\n\n let description: string;\n let severity: AnomalySeverity;\n\n if (isLarge) {\n description = `Amount ${amount} is a large payment (>= ${LARGE_TRANSACTION_THRESHOLD}) — requires enhanced monitoring`;\n severity = 'high';\n } else if (requiresReporting) {\n description = `Amount ${amount} meets reporting threshold (>= ${REPORTING_THRESHOLD})`;\n severity = 'medium';\n } else {\n description = `Amount ${amount} is below reporting threshold`;\n severity = 'low';\n }\n\n return {\n name: 'reporting_threshold',\n passed: true,\n description,\n severity,\n };\n }\n\n // --------------------------------------------------------------------------\n // Recommendations\n // --------------------------------------------------------------------------\n\n private static generateRecommendations(\n checks: ComplianceCheckResult[],\n input: LogTransactionInput,\n ): string[] {\n const recommendations: string[] = [];\n const amount = parseAmount(input.amount);\n\n for (const check of checks) {\n if (!check.passed && check.name.startsWith('entity_screening_')) {\n recommendations.push(\n `BLOCK: ${check.description}. Payment is prohibited under OFAC regulations.`,\n );\n }\n }\n\n if (!isNaN(amount) && amount >= LARGE_TRANSACTION_THRESHOLD) {\n recommendations.push(\n `Enhanced monitoring required for payment of ${input.amount} ${input.currency ?? 'USD'} (above ${LARGE_TRANSACTION_THRESHOLD} threshold).`,\n );\n }\n\n if (!isNaN(amount) && amount >= REPORTING_THRESHOLD) {\n recommendations.push(\n `CTR reporting may be required for payment of ${input.amount} ${input.currency ?? 'USD'} (meets ${REPORTING_THRESHOLD} reporting threshold).`,\n );\n }\n\n if (!isNaN(amount) && amount >= ENHANCED_DUE_DILIGENCE_THRESHOLD) {\n recommendations.push(\n `Enhanced due diligence recommended for payment of ${input.amount} ${input.currency ?? 'USD'} (Travel Rule threshold: ${ENHANCED_DUE_DILIGENCE_THRESHOLD}).`,\n );\n }\n\n return recommendations;\n }\n}\n","// ============================================================================\n// Kontext SDK - Plan/Tier System & Event Metering\n// ============================================================================\n\n/** Pricing tier identifiers */\nexport type PlanTier = 'free' | 'pro' | 'enterprise';\n\n/** Configuration for a pricing plan */\nexport interface PlanConfig {\n /** Tier identifier */\n tier: PlanTier;\n /** Maximum events allowed per billing period */\n eventLimit: number;\n /** Warning threshold as a fraction (0-1), default 0.8 */\n warningThreshold: number;\n}\n\n/** Current usage statistics for a plan */\nexport interface PlanUsage {\n /** Current plan tier */\n plan: PlanTier;\n /** Number of seats (users) on the plan */\n seats: number;\n /** Number of events logged in the current billing period */\n eventCount: number;\n /** Maximum events allowed (Pro: seats x 100K) */\n limit: number;\n /** Remaining events before limit */\n remainingEvents: number;\n /** Usage as a percentage (0-100) */\n usagePercentage: number;\n /** Whether the event limit has been exceeded */\n limitExceeded: boolean;\n}\n\n/** Event emitted when a usage threshold is reached */\nexport interface LimitEvent {\n /** Type of limit event */\n type: 'warning' | 'limit_reached';\n /** Current plan tier */\n plan: PlanTier;\n /** Current event count */\n eventCount: number;\n /** Event limit for the plan */\n limit: number;\n /** Usage percentage */\n usagePercentage: number;\n /** ISO timestamp of the event */\n timestamp: string;\n /** Human-readable message */\n message: string;\n}\n\n/** Base plan definitions with their event limits (per seat for Pro) */\nexport const PLAN_LIMITS: Record<PlanTier, number> = {\n free: 20_000,\n pro: 100_000, // per user/seat\n enterprise: Infinity,\n};\n\n/** Default warning threshold (80%) */\nconst DEFAULT_WARNING_THRESHOLD = 0.8;\n\n/** Number of events between throttled warning messages after limit exceeded */\nconst THROTTLE_INTERVAL = 100;\n\n/**\n * PlanManager handles event metering and plan limit enforcement.\n *\n * Tracks event counts per billing period and emits warnings/limit events\n * when thresholds are reached. Does NOT hard-block events after the limit --\n * instead it sets a `limitExceeded` flag and emits throttled warnings.\n */\nexport class PlanManager {\n private tier: PlanTier;\n private seats: number;\n private eventCount: number;\n private billingPeriodStart: Date;\n private warningThreshold: number;\n\n private warningEmitted: boolean = false;\n private limitEmitted: boolean = false;\n private eventsSinceLimitWarning: number = 0;\n\n private usageWarningCallbacks: Array<(event: LimitEvent) => void> = [];\n private limitReachedCallbacks: Array<(event: LimitEvent) => void> = [];\n\n /** Custom upgrade URL, configurable via init */\n upgradeUrl: string = 'https://kontext.so/upgrade';\n /** Enterprise contact URL */\n enterpriseContactUrl: string = 'https://cal.com/vinnaray';\n\n constructor(tier: PlanTier = 'free', billingPeriodStart?: Date, seats: number = 1) {\n this.tier = tier;\n this.seats = Math.max(1, Math.floor(seats));\n this.eventCount = 0;\n this.warningThreshold = DEFAULT_WARNING_THRESHOLD;\n this.billingPeriodStart = billingPeriodStart ?? PlanManager.defaultBillingPeriodStart();\n }\n\n /**\n * Returns the 1st of the current month at midnight UTC.\n */\n static defaultBillingPeriodStart(): Date {\n const now = new Date();\n return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1));\n }\n\n // --------------------------------------------------------------------------\n // Plan Info\n // --------------------------------------------------------------------------\n\n /** Get limits for a specific tier */\n static getPlanLimits(tier: PlanTier): { tier: PlanTier; eventLimit: number } {\n return { tier, eventLimit: PLAN_LIMITS[tier] };\n }\n\n /** Get the current plan tier */\n getTier(): PlanTier {\n return this.tier;\n }\n\n /** Get the event limit for the current plan (Pro is multiplied by seats) */\n getLimit(): number {\n const base = PLAN_LIMITS[this.tier];\n if (base === Infinity) return Infinity;\n // Pro plan: 100K events per user/seat\n if (this.tier === 'pro') return base * this.seats;\n return base;\n }\n\n /** Get the current number of seats */\n getSeats(): number {\n return this.seats;\n }\n\n /** Update the number of seats (e.g., after Stripe subscription update) */\n setSeats(seats: number): void {\n this.seats = Math.max(1, Math.floor(seats));\n // Reset warning state since effective limits changed\n this.warningEmitted = false;\n this.limitEmitted = false;\n this.eventsSinceLimitWarning = 0;\n }\n\n /** Get the current event count */\n getEventCount(): number {\n return this.eventCount;\n }\n\n /** Get the number of remaining events before the limit */\n getRemainingEvents(): number {\n const limit = this.getLimit();\n if (limit === Infinity) return Infinity;\n return Math.max(0, limit - this.eventCount);\n }\n\n /** Get the current usage as a percentage (0-100) */\n getUsagePercentage(): number {\n const limit = this.getLimit();\n if (limit === Infinity) return 0;\n return Math.min(100, (this.eventCount / limit) * 100);\n }\n\n /** Whether the event limit has been exceeded */\n isLimitExceeded(): boolean {\n const limit = this.getLimit();\n if (limit === Infinity) return false;\n return this.eventCount >= limit;\n }\n\n /** Get full usage object */\n getUsage(): PlanUsage {\n return {\n plan: this.tier,\n seats: this.seats,\n eventCount: this.eventCount,\n limit: this.getLimit(),\n remainingEvents: this.getRemainingEvents(),\n usagePercentage: this.getUsagePercentage(),\n limitExceeded: this.isLimitExceeded(),\n };\n }\n\n /** Get the billing period start date */\n getBillingPeriodStart(): Date {\n return new Date(this.billingPeriodStart.getTime());\n }\n\n // --------------------------------------------------------------------------\n // Plan Management\n // --------------------------------------------------------------------------\n\n /**\n * Change the plan tier at runtime (e.g., after Stripe checkout succeeds).\n * This resets limit-related warning state since the new tier has different limits.\n */\n setPlan(tier: PlanTier): void {\n this.tier = tier;\n // Reset warning state since limits changed\n this.warningEmitted = false;\n this.limitEmitted = false;\n this.eventsSinceLimitWarning = 0;\n }\n\n /**\n * Reset the event count for a new billing period.\n * Updates the billing period start to the given date or 1st of current month.\n */\n resetBillingPeriod(newStart?: Date): void {\n this.eventCount = 0;\n this.billingPeriodStart = newStart ?? PlanManager.defaultBillingPeriodStart();\n this.warningEmitted = false;\n this.limitEmitted = false;\n this.eventsSinceLimitWarning = 0;\n }\n\n /**\n * Check if the billing period should be reset (i.e., current date is past\n * the start of the next billing period). If so, auto-reset.\n */\n checkBillingPeriodReset(): boolean {\n const now = new Date();\n const nextPeriodStart = new Date(\n Date.UTC(\n this.billingPeriodStart.getUTCFullYear(),\n this.billingPeriodStart.getUTCMonth() + 1,\n 1,\n ),\n );\n\n if (now >= nextPeriodStart) {\n this.resetBillingPeriod(\n new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1)),\n );\n return true;\n }\n return false;\n }\n\n // --------------------------------------------------------------------------\n // Event Tracking\n // --------------------------------------------------------------------------\n\n /**\n * Record an event and check thresholds.\n * Returns true if the event limit has been exceeded (soft limit).\n */\n recordEvent(): boolean {\n // Check if billing period needs reset\n this.checkBillingPeriodReset();\n\n this.eventCount++;\n\n const limit = this.getLimit();\n\n // Enterprise has no limits\n if (limit === Infinity) return false;\n\n const usagePercentage = this.getUsagePercentage();\n\n // Check 80% warning threshold\n if (\n !this.warningEmitted &&\n usagePercentage >= this.warningThreshold * 100\n ) {\n this.warningEmitted = true;\n const event = this.createLimitEvent('warning');\n for (const cb of this.usageWarningCallbacks) {\n cb(event);\n }\n }\n\n // Check 100% limit threshold\n if (this.eventCount >= limit) {\n if (!this.limitEmitted) {\n this.limitEmitted = true;\n this.eventsSinceLimitWarning = 0;\n const event = this.createLimitEvent('limit_reached');\n for (const cb of this.limitReachedCallbacks) {\n cb(event);\n }\n this.logLimitMessage();\n } else {\n // Throttled warning: emit once per THROTTLE_INTERVAL events after limit\n this.eventsSinceLimitWarning++;\n if (this.eventsSinceLimitWarning >= THROTTLE_INTERVAL) {\n this.eventsSinceLimitWarning = 0;\n const event = this.createLimitEvent('limit_reached');\n for (const cb of this.limitReachedCallbacks) {\n cb(event);\n }\n this.logLimitMessage();\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n // --------------------------------------------------------------------------\n // Callbacks\n // --------------------------------------------------------------------------\n\n /**\n * Register a callback for the 80% usage warning.\n * @returns Unsubscribe function\n */\n onUsageWarning(callback: (event: LimitEvent) => void): () => void {\n this.usageWarningCallbacks.push(callback);\n return () => {\n const idx = this.usageWarningCallbacks.indexOf(callback);\n if (idx >= 0) this.usageWarningCallbacks.splice(idx, 1);\n };\n }\n\n /**\n * Register a callback for the limit reached event.\n * @returns Unsubscribe function\n */\n onLimitReached(callback: (event: LimitEvent) => void): () => void {\n this.limitReachedCallbacks.push(callback);\n return () => {\n const idx = this.limitReachedCallbacks.indexOf(callback);\n if (idx >= 0) this.limitReachedCallbacks.splice(idx, 1);\n };\n }\n\n // --------------------------------------------------------------------------\n // Persistence\n // --------------------------------------------------------------------------\n\n /** Serialize state for storage */\n toJSON(): {\n tier: PlanTier;\n seats: number;\n eventCount: number;\n billingPeriodStart: string;\n } {\n return {\n tier: this.tier,\n seats: this.seats,\n eventCount: this.eventCount,\n billingPeriodStart: this.billingPeriodStart.toISOString(),\n };\n }\n\n /** Restore state from storage */\n static fromJSON(data: {\n tier: PlanTier;\n seats?: number;\n eventCount: number;\n billingPeriodStart: string;\n }): PlanManager {\n const manager = new PlanManager(data.tier, new Date(data.billingPeriodStart), data.seats ?? 1);\n manager.eventCount = data.eventCount;\n return manager;\n }\n\n /** Set the event count directly (for restoring from storage) */\n setEventCount(count: number): void {\n this.eventCount = count;\n }\n\n // --------------------------------------------------------------------------\n // Private\n // --------------------------------------------------------------------------\n\n private createLimitEvent(type: 'warning' | 'limit_reached'): LimitEvent {\n const message =\n type === 'warning'\n ? `You've used ${this.getUsagePercentage().toFixed(0)}% of your ${this.tier} plan event limit (${this.eventCount}/${this.getLimit()}).`\n : `You've reached the ${this.getLimit().toLocaleString()} event limit on the ${this.tier === 'free' ? 'Free' : 'Pro'} plan.`;\n\n return {\n type,\n plan: this.tier,\n eventCount: this.eventCount,\n limit: this.getLimit(),\n usagePercentage: this.getUsagePercentage(),\n timestamp: new Date().toISOString(),\n message,\n };\n }\n\n private logLimitMessage(): void {\n if (this.tier === 'free') {\n console.warn(\n `You've reached the 20,000 event limit on the Free plan. Upgrade to Pro for 100K events/user/mo and full compliance features → ${this.upgradeUrl}`,\n );\n } else if (this.tier === 'pro') {\n const effectiveLimit = (100_000 * this.seats).toLocaleString();\n console.warn(\n `You've reached the ${effectiveLimit} event limit on Pro (${this.seats} seat${this.seats !== 1 ? 's' : ''}). Add seats or contact us for Enterprise pricing → ${this.enterpriseContactUrl}`,\n );\n }\n }\n}\n","// ============================================================================\n// Kontext SDK - Plan Gating Utility\n// ============================================================================\n\nimport { KontextError, KontextErrorCode } from './types.js';\nimport type { PlanTier } from './plans.js';\n\n/** Features gated by plan tier */\nexport type GatedFeature =\n | 'advanced-anomaly-rules'\n | 'sar-ctr-reports'\n | 'webhooks'\n | 'ofac-screening'\n | 'csv-export'\n | 'multi-chain'\n | 'cftc-compliance'\n | 'circle-wallets'\n | 'circle-compliance'\n | 'gas-station'\n | 'cctp-transfers'\n | 'approval-policies'\n | 'unified-screening'\n | 'blocklist-manager'\n | 'kya-identity'\n | 'kya-behavioral';\n\nconst FEATURE_MIN_PLAN: Record<GatedFeature, PlanTier> = {\n 'advanced-anomaly-rules': 'pro',\n 'sar-ctr-reports': 'pro',\n 'webhooks': 'pro',\n 'ofac-screening': 'pro',\n 'csv-export': 'pro',\n 'multi-chain': 'pro',\n 'cftc-compliance': 'enterprise',\n 'circle-wallets': 'enterprise',\n 'circle-compliance': 'enterprise',\n 'gas-station': 'enterprise',\n 'cctp-transfers': 'enterprise',\n 'approval-policies': 'pro',\n 'unified-screening': 'pro',\n 'blocklist-manager': 'pro',\n 'kya-identity': 'pro',\n 'kya-behavioral': 'enterprise',\n};\n\nconst PLAN_RANK: Record<PlanTier, number> = { free: 0, pro: 1, enterprise: 2 };\n\nconst FEATURE_LABELS: Record<GatedFeature, string> = {\n 'advanced-anomaly-rules': 'Advanced anomaly detection rules',\n 'sar-ctr-reports': 'SAR/CTR report generation',\n 'webhooks': 'Webhook alerts',\n 'ofac-screening': 'OFAC sanctions screening',\n 'csv-export': 'CSV export',\n 'multi-chain': 'Multi-chain support',\n 'cftc-compliance': 'CFTC compliance module',\n 'circle-wallets': 'Circle Programmable Wallets',\n 'circle-compliance': 'Circle Compliance Engine',\n 'gas-station': 'Gas Station integration',\n 'cctp-transfers': 'CCTP cross-chain transfers',\n 'approval-policies': 'Approval policies',\n 'unified-screening': 'Unified screening (OFAC, Chainalysis, OpenSanctions)',\n 'blocklist-manager': 'Custom blocklist/allowlist manager',\n 'kya-identity': 'KYA identity resolution (declared identity, wallet clustering)',\n 'kya-behavioral': 'KYA behavioral fingerprinting (cross-session linking, confidence scoring)',\n};\n\n/**\n * Check if a feature is available on the given plan.\n * Returns true if allowed, false if not.\n */\nexport function isFeatureAvailable(feature: GatedFeature, currentPlan: PlanTier): boolean {\n const requiredPlan = FEATURE_MIN_PLAN[feature];\n return PLAN_RANK[currentPlan] >= PLAN_RANK[requiredPlan];\n}\n\n/**\n * Require a minimum plan for a feature. Throws KontextError if not met.\n */\nexport function requirePlan(feature: GatedFeature, currentPlan: PlanTier): void {\n if (!isFeatureAvailable(feature, currentPlan)) {\n const requiredPlan = FEATURE_MIN_PLAN[feature];\n const label = FEATURE_LABELS[feature];\n throw new KontextError(\n KontextErrorCode.PLAN_REQUIRED,\n `${label} requires the ${requiredPlan.charAt(0).toUpperCase() + requiredPlan.slice(1)} plan. Current plan: ${currentPlan}. Upgrade at https://getkontext.com/pricing`,\n );\n }\n}\n","// ============================================================================\n// Kontext SDK - Pluggable Event Exporters\n// ============================================================================\n// Provides an EventExporter interface and built-in implementations for\n// shipping events to external systems. Follows the OpenTelemetry exporter\n// pattern: export() → flush() → shutdown().\n//\n// Built-in exporters:\n// NoopExporter – Default, discards events (current SDK behavior)\n// ConsoleExporter – Prints events to stdout\n// JsonFileExporter – Writes events to JSONL files on disk\n//\n// Developers can implement their own exporters by conforming to the\n// EventExporter interface.\n\nimport type { ActionLog } from './types.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// ============================================================================\n// EventExporter Interface\n// ============================================================================\n\n/**\n * Result of an export operation.\n */\nexport interface ExporterResult {\n /** Whether the export succeeded */\n success: boolean;\n /** Number of events exported */\n exportedCount: number;\n /** Error message if the export failed */\n error?: string;\n}\n\n/**\n * Interface for pluggable event exporters.\n * Implement this to ship Kontext events to any external system\n * (HTTP endpoint, message queue, cloud storage, etc.).\n *\n * Follows the OpenTelemetry SpanExporter pattern:\n * - `export()` receives a batch of events to export\n * - `flush()` forces any buffered events to be sent\n * - `shutdown()` performs cleanup and final flush\n *\n * @example\n * ```typescript\n * class DatadogExporter implements EventExporter {\n * async export(events: ActionLog[]): Promise<ExporterResult> {\n * await fetch('https://api.datadoghq.com/v1/input', {\n * method: 'POST',\n * headers: { 'DD-API-KEY': process.env.DD_API_KEY },\n * body: JSON.stringify(events),\n * });\n * return { success: true, exportedCount: events.length };\n * }\n * async flush(): Promise<void> {}\n * async shutdown(): Promise<void> {}\n * }\n * ```\n */\nexport interface EventExporter {\n /** Export a batch of action log events. */\n export(events: ActionLog[]): Promise<ExporterResult>;\n /** Force any buffered events to be sent immediately. */\n flush(): Promise<void>;\n /** Gracefully shut down the exporter, flushing remaining events. */\n shutdown(): Promise<void>;\n}\n\n// ============================================================================\n// NoopExporter\n// ============================================================================\n\n/**\n * No-op exporter that discards all events.\n * This is the default exporter, preserving the SDK's original behavior\n * where events are only stored in-memory (or via StorageAdapter).\n */\nexport class NoopExporter implements EventExporter {\n async export(_events: ActionLog[]): Promise<ExporterResult> {\n return { success: true, exportedCount: 0 };\n }\n\n async flush(): Promise<void> {}\n\n async shutdown(): Promise<void> {}\n}\n\n// ============================================================================\n// ConsoleExporter\n// ============================================================================\n\n/**\n * Console exporter that prints events to stdout as JSON.\n * Useful for development and debugging.\n *\n * @example\n * ```typescript\n * const kontext = Kontext.init({\n * projectId: 'my-project',\n * environment: 'development',\n * exporter: new ConsoleExporter(),\n * });\n * ```\n */\nexport class ConsoleExporter implements EventExporter {\n private readonly prefix: string;\n\n constructor(options?: { prefix?: string }) {\n this.prefix = options?.prefix ?? '[Kontext Export]';\n }\n\n async export(events: ActionLog[]): Promise<ExporterResult> {\n for (const event of events) {\n console.log(`${this.prefix} ${JSON.stringify(event)}`);\n }\n return { success: true, exportedCount: events.length };\n }\n\n async flush(): Promise<void> {}\n\n async shutdown(): Promise<void> {}\n}\n\n// ============================================================================\n// JsonFileExporter\n// ============================================================================\n\n/**\n * File-based exporter that writes events as JSONL (one JSON object per line).\n * Each day gets its own file: `events-2025-01-15.jsonl`.\n *\n * @example\n * ```typescript\n * const kontext = Kontext.init({\n * projectId: 'my-project',\n * environment: 'production',\n * exporter: new JsonFileExporter({ outputDir: './audit-logs' }),\n * });\n * ```\n */\nexport class JsonFileExporter implements EventExporter {\n private readonly outputDir: string;\n private buffer: ActionLog[] = [];\n private readonly bufferSize: number;\n\n constructor(options?: { outputDir?: string; bufferSize?: number }) {\n this.outputDir = path.resolve(options?.outputDir ?? '.kontext/exports');\n this.bufferSize = options?.bufferSize ?? 1;\n }\n\n async export(events: ActionLog[]): Promise<ExporterResult> {\n this.buffer.push(...events);\n\n if (this.buffer.length >= this.bufferSize) {\n await this.flush();\n }\n\n return { success: true, exportedCount: events.length };\n }\n\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n\n const toWrite = [...this.buffer];\n this.buffer = [];\n\n try {\n fs.mkdirSync(this.outputDir, { recursive: true });\n\n const date = new Date().toISOString().split('T')[0];\n const filePath = path.join(this.outputDir, `events-${date}.jsonl`);\n const lines = toWrite.map((e) => JSON.stringify(e)).join('\\n') + '\\n';\n fs.appendFileSync(filePath, lines, 'utf-8');\n } catch (error) {\n console.warn('[Kontext JsonFileExporter] Failed to write events:', error);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.flush();\n }\n\n /** Get the output directory path. */\n getOutputDir(): string {\n return this.outputDir;\n }\n}\n\n","// ============================================================================\n// Kontext SDK - Feature Flag Manager (Firestore REST API)\n// ============================================================================\n\nimport type {\n FeatureFlag,\n FeatureFlagConfig,\n FlagTargeting,\n FlagPlanTargeting,\n FlagScope,\n Environment,\n} from './types.js';\n\n/** Cached flag entry with expiry timestamp */\ninterface CachedFlag {\n flag: FeatureFlag;\n expiresAt: number;\n}\n\n/** Firestore REST API document shape */\ninterface FirestoreDocument {\n name: string;\n fields: Record<string, FirestoreValue>;\n createTime: string;\n updateTime: string;\n}\n\n/** Firestore value types we handle */\ninterface FirestoreValue {\n stringValue?: string;\n booleanValue?: boolean;\n mapValue?: { fields: Record<string, FirestoreValue> };\n}\n\n/** Firestore list response */\ninterface FirestoreListResponse {\n documents?: FirestoreDocument[];\n}\n\nconst DEFAULT_CACHE_TTL_MS = 300_000; // 5 minutes\n\n/**\n * Feature flag manager backed by Firestore REST API.\n *\n * Uses a stale-while-revalidate caching strategy:\n * - `isEnabled()` is synchronous — reads from cache, never blocks\n * - Background refresh fires when cache entries expire on read\n * - Falls back to `defaultValue` (false) when flag is unknown\n */\nexport class FeatureFlagManager {\n private readonly config: FeatureFlagConfig;\n private readonly cacheTtlMs: number;\n private readonly defaultValue: boolean;\n private readonly cache = new Map<string, CachedFlag>();\n private refreshInFlight = false;\n\n constructor(config: FeatureFlagConfig) {\n this.config = config;\n this.cacheTtlMs = config.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n this.defaultValue = config.defaultValue ?? false;\n }\n\n // --------------------------------------------------------------------------\n // Public API\n // --------------------------------------------------------------------------\n\n /**\n * Initialize the manager by fetching all flags from Firestore.\n * Call this once at startup to warm the cache.\n */\n async init(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Check if a flag is enabled for the given environment and plan.\n * Always synchronous — reads from cache.\n * Triggers a background refresh when the cached entry is stale.\n */\n isEnabled(\n flagName: string,\n environment?: Environment,\n plan?: 'free' | 'pro' | 'enterprise',\n ): boolean {\n const env = environment ?? this.config.environment;\n const tier = plan ?? this.config.plan;\n\n const entry = this.cache.get(flagName);\n if (!entry) {\n this.triggerBackgroundRefresh();\n return this.defaultValue;\n }\n\n // Stale-while-revalidate: return cached value but refresh in background\n if (Date.now() > entry.expiresAt) {\n this.triggerBackgroundRefresh();\n }\n\n const envTargeting = entry.flag.targeting[env];\n if (!envTargeting) return this.defaultValue;\n\n return envTargeting[tier] ?? this.defaultValue;\n }\n\n /**\n * Get a single flag by name (from cache).\n */\n getFlag(flagName: string): FeatureFlag | undefined {\n return this.cache.get(flagName)?.flag;\n }\n\n /**\n * Get all cached flags.\n */\n getAllFlags(): FeatureFlag[] {\n return Array.from(this.cache.values()).map((e) => e.flag);\n }\n\n /**\n * Force-refresh all flags from Firestore.\n */\n async refresh(): Promise<void> {\n try {\n const docs = await this.fetchAllFromFirestore();\n const now = Date.now();\n\n for (const doc of docs) {\n const flag = parseFirestoreDocument(doc);\n if (!flag) continue;\n\n // Filter by scope if configured\n if (this.config.scope && flag.scope !== 'all' && flag.scope !== this.config.scope) {\n continue;\n }\n\n this.cache.set(flag.name, {\n flag,\n expiresAt: now + this.cacheTtlMs,\n });\n }\n } catch {\n // Silent failure — stale cache is better than no cache\n }\n }\n\n // --------------------------------------------------------------------------\n // Firestore REST API\n // --------------------------------------------------------------------------\n\n private get firestoreBaseUrl(): string {\n return `https://firestore.googleapis.com/v1/projects/${this.config.gcpProjectId}/databases/(default)/documents`;\n }\n\n private async fetchAllFromFirestore(): Promise<FirestoreDocument[]> {\n const url = `${this.firestoreBaseUrl}/feature-flags`;\n const headers: Record<string, string> = {};\n\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const res = await fetch(url, { headers });\n if (!res.ok) {\n throw new Error(`Firestore fetch failed: ${res.status} ${res.statusText}`);\n }\n\n const body = (await res.json()) as FirestoreListResponse;\n return body.documents ?? [];\n }\n\n async fetchOneFromFirestore(flagName: string): Promise<FirestoreDocument | null> {\n const url = `${this.firestoreBaseUrl}/feature-flags/${flagName}`;\n const headers: Record<string, string> = {};\n\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const res = await fetch(url, { headers });\n if (res.status === 404) return null;\n if (!res.ok) {\n throw new Error(`Firestore fetch failed: ${res.status} ${res.statusText}`);\n }\n\n return (await res.json()) as FirestoreDocument;\n }\n\n // --------------------------------------------------------------------------\n // Background Refresh\n // --------------------------------------------------------------------------\n\n private triggerBackgroundRefresh(): void {\n if (this.refreshInFlight) return;\n this.refreshInFlight = true;\n this.refresh().finally(() => {\n this.refreshInFlight = false;\n });\n }\n}\n\n// ============================================================================\n// Firestore Document Parsing\n// ============================================================================\n\n/**\n * Parse a Firestore REST API document into a flat FeatureFlag.\n * Returns null if the document is malformed.\n */\nexport function parseFirestoreDocument(doc: FirestoreDocument): FeatureFlag | null {\n try {\n const fields = doc.fields;\n const name = extractDocumentId(doc.name);\n\n const description = fields['description']?.stringValue ?? '';\n const scope = (fields['scope']?.stringValue ?? 'all') as FlagScope;\n const createdBy = fields['createdBy']?.stringValue ?? '';\n const createdAt = fields['createdAt']?.stringValue ?? doc.createTime;\n const updatedAt = fields['updatedAt']?.stringValue ?? doc.updateTime;\n\n const targetingMap = fields['targeting']?.mapValue?.fields;\n if (!targetingMap) return null;\n\n const targeting = parseTargeting(targetingMap);\n if (!targeting) return null;\n\n return { name, description, scope, targeting, createdAt, updatedAt, createdBy };\n } catch {\n return null;\n }\n}\n\nfunction parseTargeting(\n fields: Record<string, FirestoreValue>,\n): FlagTargeting | null {\n const dev = parsePlanTargeting(fields['development']?.mapValue?.fields);\n const staging = parsePlanTargeting(fields['staging']?.mapValue?.fields);\n const prod = parsePlanTargeting(fields['production']?.mapValue?.fields);\n\n if (!dev || !staging || !prod) return null;\n\n return { development: dev, staging, production: prod };\n}\n\nfunction parsePlanTargeting(\n fields: Record<string, FirestoreValue> | undefined,\n): FlagPlanTargeting | null {\n if (!fields) return null;\n return {\n free: fields['free']?.booleanValue ?? false,\n pro: fields['pro']?.booleanValue ?? false,\n enterprise: fields['enterprise']?.booleanValue ?? false,\n };\n}\n\n/** Extract the document ID from a Firestore resource name */\nfunction extractDocumentId(resourceName: string): string {\n const parts = resourceName.split('/');\n return parts[parts.length - 1] ?? resourceName;\n}\n","// ============================================================================\n// Kontext SDK - Core Client\n// ============================================================================\n\nimport type {\n KontextConfig,\n KontextMode,\n LogActionInput,\n LogTransactionInput,\n ActionLog,\n TransactionRecord,\n CreateTaskInput,\n ConfirmTaskInput,\n Task,\n TaskStatus,\n ExportOptions,\n ExportResult,\n ReportOptions,\n ComplianceReport,\n UsdcComplianceCheck,\n Environment,\n VerifyInput,\n VerifyResult,\n LogReasoningInput,\n ReasoningEntry,\n TrustScore,\n TransactionEvaluation,\n AnomalyDetectionConfig,\n AnomalyCallback,\n GenerateComplianceCertificateInput,\n ComplianceCertificate,\n} from './types.js';\nimport { TrustScorer } from './trust.js';\nimport { AnomalyDetector } from './anomaly.js';\nimport { createHash } from 'crypto';\nimport type { DigestVerification, DigestLink } from './digest.js';\nimport type { PlanTier, PlanUsage, LimitEvent } from './plans.js';\nimport { KontextError, KontextErrorCode } from './types.js';\nimport { KontextStore } from './store.js';\nimport { ActionLogger } from './logger.js';\nimport { TaskManager } from './tasks.js';\nimport { AuditExporter } from './audit.js';\nimport { UsdcCompliance } from './integrations/usdc.js';\nimport { PaymentCompliance } from './integrations/payment-compliance.js';\nimport { isCryptoTransaction } from './types.js';\nimport { PlanManager } from './plans.js';\nimport { requirePlan } from './plan-gate.js';\nimport type { EventExporter } from './exporters.js';\nimport { NoopExporter } from './exporters.js';\nimport { FeatureFlagManager } from './feature-flags.js';\nimport { generateId, now, parseAmount } from './utils.js';\n\n/** Storage key for plan metering data */\nconst PLAN_STORAGE_KEY = 'kontext:plan';\n\n/**\n * Main Kontext SDK client. Provides a unified interface to all SDK features:\n * action logging, task confirmation, audit export, trust scoring, and\n * anomaly detection.\n *\n * Supports two operating modes:\n * - **Local mode** (no API key): All data stored locally, suitable for\n * open-source usage and development.\n * - **Cloud mode** (with API key): Data synced to Kontext API for\n * persistent storage and advanced features.\n *\n * @example\n * ```typescript\n * import { Kontext } from '@kontext/sdk';\n *\n * const kontext = Kontext.init({\n * projectId: 'my-project',\n * environment: 'development',\n * });\n *\n * await kontext.logTransaction({\n * txHash: '0x...',\n * chain: 'base',\n * amount: '100',\n * token: 'USDC',\n * from: '0xSender',\n * to: '0xReceiver',\n * agentId: 'agent-1',\n * });\n * ```\n */\nexport class Kontext {\n private readonly config: KontextConfig;\n private readonly store: KontextStore;\n private readonly logger: ActionLogger;\n private readonly taskManager: TaskManager;\n private readonly auditExporter: AuditExporter;\n private readonly mode: KontextMode;\n private readonly planManager: PlanManager;\n private readonly exporter: EventExporter;\n private readonly featureFlagManager: FeatureFlagManager | null;\n private readonly trustScorer: TrustScorer;\n private readonly anomalyDetector: AnomalyDetector;\n\n private constructor(config: KontextConfig) {\n this.config = config;\n this.mode = config.apiKey ? 'cloud' : 'local';\n this.store = new KontextStore();\n\n // Validate metadataSchema eagerly — if provided, it must have a parse() method\n if (config.metadataSchema && typeof config.metadataSchema.parse !== 'function') {\n throw new KontextError(\n KontextErrorCode.INITIALIZATION_ERROR,\n 'metadataSchema must have a parse() method',\n );\n }\n\n // Attach storage adapter if provided\n if (config.storage) {\n this.store.setStorageAdapter(config.storage);\n }\n\n // Initialize plan manager\n const planTier: PlanTier = config.plan ?? 'free';\n this.planManager = new PlanManager(planTier, undefined, config.seats ?? 1);\n\n // Configure upgrade URLs\n if (config.upgradeUrl) {\n this.planManager.upgradeUrl = config.upgradeUrl;\n }\n\n // Initialize event exporter (default: NoopExporter)\n this.exporter = config.exporter ?? new NoopExporter();\n\n this.logger = new ActionLogger(config, this.store);\n this.taskManager = new TaskManager(config, this.store);\n this.auditExporter = new AuditExporter(config, this.store);\n this.trustScorer = new TrustScorer(config, this.store);\n this.anomalyDetector = new AnomalyDetector(config, this.store);\n\n // Initialize feature flag manager if configured\n this.featureFlagManager = config.featureFlags\n ? new FeatureFlagManager(config.featureFlags)\n : null;\n\n // Auto-enable anomaly detection if rules provided in config\n if (config.anomalyRules && config.anomalyRules.length > 0) {\n const advancedRules = ['newDestination', 'offHoursActivity', 'rapidSuccession', 'roundAmount'];\n const hasAdvanced = config.anomalyRules.some((r) => advancedRules.includes(r));\n if (hasAdvanced) {\n requirePlan('advanced-anomaly-rules', planTier);\n }\n this.anomalyDetector.enableAnomalyDetection({\n rules: config.anomalyRules,\n thresholds: config.anomalyThresholds,\n });\n }\n }\n\n /**\n * Initialize the Kontext SDK.\n *\n * @param config - Configuration options\n * @returns Initialized Kontext client instance\n *\n * @example\n * ```typescript\n * // Local/OSS mode (no API key)\n * const kontext = Kontext.init({\n * projectId: 'my-project',\n * environment: 'development',\n * });\n *\n * // Cloud mode (with API key)\n * const kontext = Kontext.init({\n * apiKey: 'sk_live_...',\n * projectId: 'my-project',\n * environment: 'production',\n * });\n *\n * // With persistent file storage\n * const kontext = Kontext.init({\n * projectId: 'my-project',\n * environment: 'development',\n * storage: new FileStorage('./kontext-data'),\n * });\n * ```\n */\n static init(config: KontextConfig): Kontext {\n if (!config.projectId || config.projectId.trim() === '') {\n throw new KontextError(\n KontextErrorCode.INITIALIZATION_ERROR,\n 'projectId is required',\n );\n }\n\n const validEnvironments = ['development', 'staging', 'production'];\n if (!validEnvironments.includes(config.environment)) {\n throw new KontextError(\n KontextErrorCode.INITIALIZATION_ERROR,\n `Invalid environment: ${config.environment}. Must be one of: ${validEnvironments.join(', ')}`,\n );\n }\n\n if (config.debug) {\n const mode = config.apiKey ? 'cloud' : 'local';\n console.debug(\n `[Kontext] Initializing in ${mode} mode for project ${config.projectId} (${config.environment})`,\n );\n }\n\n return new Kontext(config);\n }\n\n // --------------------------------------------------------------------------\n // Mode & Config\n // --------------------------------------------------------------------------\n\n /**\n * Get the current operating mode.\n */\n getMode(): KontextMode {\n return this.mode;\n }\n\n /**\n * Get the current configuration (API key is masked).\n */\n getConfig(): Omit<KontextConfig, 'apiKey'> & { apiKey?: string } {\n return {\n ...this.config,\n apiKey: this.config.apiKey ? `${this.config.apiKey.slice(0, 8)}...` : undefined,\n };\n }\n\n // --------------------------------------------------------------------------\n // Internal Helpers\n // --------------------------------------------------------------------------\n\n /**\n * Validate metadata against the configured schema, if any.\n * No-op when metadataSchema is not configured.\n */\n private validateMetadata(metadata: Record<string, unknown> | undefined): void {\n if (!metadata || !this.config.metadataSchema) return;\n try {\n this.config.metadataSchema.parse(metadata);\n } catch (err) {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n `Metadata validation failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // --------------------------------------------------------------------------\n // Action Logging\n // --------------------------------------------------------------------------\n\n /**\n * Log a generic agent action.\n *\n * @param input - Action details\n * @returns The created action log entry\n */\n async log(input: LogActionInput): Promise<ActionLog> {\n this.validateMetadata(input.metadata);\n const action = await this.logger.log(input);\n\n // Track event for plan metering\n const limitExceeded = this.planManager.recordEvent();\n if (limitExceeded) {\n action.metadata = { ...action.metadata, limitExceeded: true };\n }\n\n // Run anomaly detection if enabled\n if (this.anomalyDetector.isEnabled()) {\n this.anomalyDetector.evaluateAction(action);\n }\n\n // Ship to exporter (fire-and-forget to avoid blocking the caller)\n this.exporter.export([action]).catch(() => {});\n\n return action;\n }\n\n /**\n * Log a cryptocurrency transaction with full chain details.\n *\n * @param input - Transaction details\n * @returns The created transaction record\n */\n async logTransaction(input: LogTransactionInput): Promise<TransactionRecord> {\n // Multi-chain support requires Pro plan\n if (input.chain && input.chain !== 'base') {\n requirePlan('multi-chain', this.planManager.getTier());\n }\n\n this.validateMetadata(input.metadata);\n const record = await this.logger.logTransaction(input);\n\n // Track event for plan metering\n const limitExceeded = this.planManager.recordEvent();\n if (limitExceeded) {\n record.metadata = { ...record.metadata, limitExceeded: true };\n }\n\n // Run anomaly detection if enabled\n if (this.anomalyDetector.isEnabled()) {\n this.anomalyDetector.evaluateTransaction(record);\n }\n\n // Ship to exporter (fire-and-forget to avoid blocking the caller)\n this.exporter.export([record]).catch(() => {});\n\n return record;\n }\n\n /**\n * Flush any pending log batches.\n */\n async flushLogs(): Promise<void> {\n await this.logger.flush();\n }\n\n // --------------------------------------------------------------------------\n // Persistence\n // --------------------------------------------------------------------------\n\n /**\n * Persist all current in-memory state to the attached storage adapter.\n * No-op if no storage adapter is configured.\n */\n async flush(): Promise<void> {\n await this.logger.flush();\n await this.store.flush();\n await this.exporter.flush();\n }\n\n /**\n * Restore state from the attached storage adapter.\n * Loads previously persisted actions, transactions, tasks, and anomalies.\n * Also restores the digest chain's terminal digest so that new actions\n * chain correctly across process boundaries.\n * No-op if no storage adapter is configured.\n */\n async restore(): Promise<void> {\n await this.store.restore();\n\n // Restore digest chain continuity: set terminal digest from last stored action\n const actions = this.store.getActions();\n if (actions.length > 0) {\n const sorted = [...actions].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n const lastAction = sorted[sorted.length - 1]!;\n if (lastAction.digest) {\n this.logger.restoreChainState(lastAction.digest);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Task Confirmation\n // --------------------------------------------------------------------------\n\n /**\n * Create a new tracked task that requires evidence for confirmation.\n *\n * @param input - Task details including required evidence types\n * @returns The created task\n */\n async createTask(input: CreateTaskInput): Promise<Task> {\n this.validateMetadata(input.metadata);\n return this.taskManager.createTask(input);\n }\n\n /**\n * Confirm a task by providing evidence.\n *\n * @param input - Task ID and evidence data\n * @returns The confirmed task\n */\n async confirmTask(input: ConfirmTaskInput): Promise<Task> {\n return this.taskManager.confirmTask(input);\n }\n\n /**\n * Get the current status of a task.\n *\n * @param taskId - Task identifier\n * @returns The task or undefined if not found\n */\n async getTaskStatus(taskId: string): Promise<Task | undefined> {\n return this.taskManager.getTaskStatus(taskId);\n }\n\n /**\n * Mark a task as in-progress.\n *\n * @param taskId - Task identifier\n * @returns The updated task\n */\n async startTask(taskId: string): Promise<Task> {\n return this.taskManager.startTask(taskId);\n }\n\n /**\n * Mark a task as failed.\n *\n * @param taskId - Task identifier\n * @param reason - Reason for failure\n * @returns The updated task\n */\n async failTask(taskId: string, reason: string): Promise<Task> {\n return this.taskManager.failTask(taskId, reason);\n }\n\n /**\n * Get all tasks, optionally filtered by status.\n *\n * @param status - Optional status filter\n * @returns Array of tasks\n */\n getTasks(status?: TaskStatus): Task[] {\n return this.taskManager.getTasks(status);\n }\n\n // --------------------------------------------------------------------------\n // Audit Export\n // --------------------------------------------------------------------------\n\n /**\n * Export audit data in JSON or CSV format.\n *\n * @param options - Export configuration\n * @returns Export result with formatted data\n */\n async export(options: ExportOptions): Promise<ExportResult> {\n // CSV export requires Pro plan\n if (options.format === 'csv') {\n requirePlan('csv-export', this.planManager.getTier());\n }\n\n return this.auditExporter.export(options);\n }\n\n /**\n * Generate a compliance report for a given period.\n *\n * @param options - Report configuration\n * @returns Compliance report with summary and detailed records\n */\n async generateReport(options: ReportOptions): Promise<ComplianceReport> {\n return this.auditExporter.generateReport(options);\n }\n\n // --------------------------------------------------------------------------\n // Digest Chain\n // --------------------------------------------------------------------------\n\n /**\n * Get the terminal digest — the latest SHA-256 hash in the rolling digest chain.\n * Embed this in outgoing messages as tamper-evident proof of the entire action history.\n *\n * @returns The terminal SHA-256 digest hex string\n */\n getTerminalDigest(): string {\n return this.logger.getTerminalDigest();\n }\n\n /**\n * Verify the integrity of the digest chain.\n * Recomputes every digest from genesis and compares against stored values.\n * Any tampering will cause verification to fail.\n *\n * @returns Verification result with timing and validity data\n */\n verifyDigestChain(): DigestVerification {\n const actions = this.store.getActions();\n return this.logger.verifyChain(actions);\n }\n\n /**\n * Export the digest chain for independent third-party verification.\n *\n * @returns Chain data including genesis hash, all links, and terminal digest\n */\n exportDigestChain(): { genesisHash: string; links: DigestLink[]; terminalDigest: string } {\n return this.logger.getDigestChain().exportChain();\n }\n\n /**\n * Get all action log entries. Required for independent third-party\n * verification via `verifyExportedChain(chain, actions)`.\n *\n * @returns A copy of the action log array\n */\n getActions(): ActionLog[] {\n return this.store.getActions();\n }\n\n // --------------------------------------------------------------------------\n // Agent Reasoning & Session Tracing\n // --------------------------------------------------------------------------\n\n /**\n * Generate a unique session ID for a single agent run.\n * Pass this as `sessionId` to logReasoning(), log(), logTransaction(),\n * and verify() calls within the same run to group them in the audit trail.\n *\n * Compatible with framework run IDs: pass LangGraph thread_id,\n * Vercel AI id, or OpenAI run_id directly instead if you prefer.\n *\n * @returns A short unique session identifier\n */\n static generateSessionId(): string {\n return generateId();\n }\n\n /**\n * Log an agent's reasoning step into the tamper-evident digest chain.\n *\n * Each entry records why the agent took an action, optionally linked\n * to a tool call. All entries for a sessionId can be replayed in\n * order via step numbering to reconstruct the full decision trace.\n *\n * @param input - Reasoning details including agentId, action, reasoning text\n * @returns The created reasoning entry\n *\n * @example\n * ```typescript\n * const sessionId = Kontext.generateSessionId();\n *\n * await ctx.logReasoning({\n * agentId: 'payment-agent-v1',\n * sessionId,\n * step: 1,\n * action: 'evaluate-transfer',\n * reasoning: 'User requested $5K USDC to 0xabc. Running compliance check first.',\n * confidence: 0.95,\n * toolCall: 'verify',\n * });\n *\n * const result = await ctx.verify({ ..., sessionId });\n *\n * await ctx.logReasoning({\n * agentId: 'payment-agent-v1',\n * sessionId,\n * step: 2,\n * parentStep: 1,\n * action: 'compliance-passed',\n * reasoning: 'verify() returned compliant=true, riskLevel=low. Proceeding.',\n * confidence: 0.99,\n * context: { riskLevel: result.riskLevel },\n * });\n * ```\n */\n async logReasoning(input: LogReasoningInput): Promise<ReasoningEntry> {\n if (!input.agentId || input.agentId.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'agentId is required for reasoning entries',\n );\n }\n if (!input.action || input.action.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'action is required for reasoning entries',\n );\n }\n if (!input.reasoning || input.reasoning.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'reasoning is required for reasoning entries',\n );\n }\n if (input.confidence !== undefined && (input.confidence < 0 || input.confidence > 1)) {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'confidence must be between 0 and 1',\n );\n }\n\n const entry: ReasoningEntry = {\n id: generateId(),\n timestamp: now(),\n agentId: input.agentId,\n ...(input.sessionId ? { sessionId: input.sessionId } : {}),\n ...(input.step !== undefined ? { step: input.step } : {}),\n ...(input.parentStep !== undefined ? { parentStep: input.parentStep } : {}),\n action: input.action,\n reasoning: input.reasoning,\n confidence: input.confidence ?? 1.0,\n ...(input.toolCall ? { toolCall: input.toolCall } : {}),\n ...(input.toolResult !== undefined ? { toolResult: input.toolResult } : {}),\n context: input.context ?? {},\n };\n\n // Log into the digest chain as a 'reasoning' action\n await this.log({\n type: 'reasoning',\n description: `[${input.agentId}${input.sessionId ? `/${input.sessionId}` : ''}] step ${input.step ?? '?'}: ${input.action}`,\n agentId: input.agentId,\n sessionId: input.sessionId,\n metadata: {\n reasoningId: entry.id,\n action: entry.action,\n reasoning: entry.reasoning,\n confidence: entry.confidence,\n ...(entry.step !== undefined ? { step: entry.step } : {}),\n ...(entry.parentStep !== undefined ? { parentStep: entry.parentStep } : {}),\n ...(entry.toolCall ? { toolCall: entry.toolCall } : {}),\n ...(entry.toolResult !== undefined ? { toolResult: entry.toolResult } : {}),\n context: entry.context,\n },\n });\n\n return entry;\n }\n\n /**\n * Get all reasoning entries for a specific agent, optionally filtered\n * by session ID to retrieve a single run's decision trace.\n *\n * @param agentId - Agent identifier\n * @param sessionId - Optional: filter to a single run\n * @returns Array of reasoning entries in chronological order\n */\n getReasoningEntries(agentId: string, sessionId?: string): ReasoningEntry[] {\n const reasoningActions = this.store.queryActions((a) => {\n if (a.agentId !== agentId || a.type !== 'reasoning') return false;\n if (sessionId && a.sessionId !== sessionId) return false;\n return true;\n });\n\n return reasoningActions.map((action) => ({\n id: action.metadata['reasoningId'] as string,\n timestamp: action.timestamp,\n agentId: action.agentId,\n ...(action.sessionId ? { sessionId: action.sessionId } : {}),\n ...(action.metadata['step'] !== undefined ? { step: action.metadata['step'] as number } : {}),\n ...(action.metadata['parentStep'] !== undefined ? { parentStep: action.metadata['parentStep'] as number } : {}),\n action: action.metadata['action'] as string,\n reasoning: action.metadata['reasoning'] as string,\n confidence: action.metadata['confidence'] as number,\n ...(action.metadata['toolCall'] ? { toolCall: action.metadata['toolCall'] as string } : {}),\n ...(action.metadata['toolResult'] !== undefined ? { toolResult: action.metadata['toolResult'] } : {}),\n context: (action.metadata['context'] as Record<string, unknown>) ?? {},\n }));\n }\n\n // --------------------------------------------------------------------------\n // USDC Integration\n // --------------------------------------------------------------------------\n\n /**\n * Run USDC-specific compliance checks on a transaction.\n *\n * @param tx - Transaction to check\n * @returns Compliance check result\n */\n checkUsdcCompliance(tx: LogTransactionInput): UsdcComplianceCheck {\n return UsdcCompliance.checkTransaction(tx);\n }\n\n /**\n * Verify a transaction: compliance check, transaction log, trust score,\n * anomaly detection, reasoning, and digest proof — all in one call.\n *\n * @param input - Transaction details with optional reasoning\n * @returns Full verification result including compliance, trust, anomalies, and digest proof\n *\n * @example\n * ```typescript\n * const result = await ctx.verify({\n * txHash: '0xabc...', chain: 'base', amount: '5000', token: 'USDC',\n * from: '0xsender', to: '0xrecipient', agentId: 'agent-v1',\n * reasoning: 'Transfer within daily limit. Recipient in allowlist.',\n * confidence: 0.95,\n * });\n *\n * // result.compliant — boolean\n * // result.trustScore — { score: 87, level: 'high', factors: [...] }\n * // result.anomalies — any flags triggered\n * // result.digestProof — { terminalDigest, chainLength, valid }\n * // result.reasoningId — ID of the reasoning entry (if reasoning provided)\n * ```\n */\n async verify(input: VerifyInput): Promise<VerifyResult> {\n // 1. Log the transaction (includes anomaly eval via logTransaction)\n const transaction = await this.logTransaction(input);\n\n // 2. Run compliance checks (crypto vs general payment)\n const compliance = isCryptoTransaction(input)\n ? UsdcCompliance.checkTransaction(input)\n : PaymentCompliance.checkPayment(input);\n\n // 3. Log reasoning if provided\n let reasoningId: string | undefined;\n if (input.reasoning) {\n const entry = await this.logReasoning({\n agentId: input.agentId,\n sessionId: input.sessionId,\n action: 'verify',\n reasoning: input.reasoning,\n confidence: input.confidence,\n toolCall: 'verify',\n toolResult: { compliant: compliance.compliant, riskLevel: compliance.riskLevel },\n context: input.context,\n });\n reasoningId = entry.id;\n }\n\n // 4. Auto-compute trust score\n const trustScore = await this.trustScorer.getTrustScore(input.agentId);\n\n // 5. Collect anomalies for this transaction\n const anomalies = this.store.queryAnomalies(\n (a) => a.actionId === transaction.id,\n );\n\n // 6. Digest proof\n const verification = this.verifyDigestChain();\n const chainLength = this.logger.getDigestChain().getChainLength();\n const terminalDigest = this.getTerminalDigest();\n\n // 7. Auto-create approval task if amount exceeds threshold\n let requiresApproval: boolean | undefined;\n let task: Task | undefined;\n if (this.config.approvalThreshold) {\n const amount = parseAmount(input.amount);\n const threshold = parseAmount(this.config.approvalThreshold);\n if (amount > threshold) {\n requiresApproval = true;\n const label = input.token\n ? `${input.token} ${input.amount} transfer`\n : `${input.currency ?? 'USD'} ${input.amount} payment`;\n task = await this.createTask({\n description: `Approve ${label} from ${input.from} to ${input.to}`,\n agentId: input.agentId,\n requiredEvidence: input.txHash ? ['txHash'] : ['paymentReference'],\n metadata: {\n amount: input.amount,\n from: input.from,\n to: input.to,\n approvalThreshold: this.config.approvalThreshold,\n ...(input.txHash ? { txHash: input.txHash } : {}),\n ...(input.chain ? { chain: input.chain } : {}),\n ...(input.token ? { token: input.token } : {}),\n ...(input.currency ? { currency: input.currency } : {}),\n ...(input.paymentMethod ? { paymentMethod: input.paymentMethod } : {}),\n ...(input.paymentReference ? { paymentReference: input.paymentReference } : {}),\n },\n });\n }\n }\n\n return {\n compliant: compliance.compliant,\n checks: compliance.checks,\n riskLevel: compliance.riskLevel,\n recommendations: compliance.recommendations,\n transaction,\n trustScore,\n anomalies,\n digestProof: {\n terminalDigest,\n chainLength,\n valid: verification.valid,\n },\n ...(reasoningId ? { reasoningId } : {}),\n ...(requiresApproval ? { requiresApproval, task } : {}),\n };\n }\n\n // --------------------------------------------------------------------------\n // Trust Scoring\n // --------------------------------------------------------------------------\n\n /**\n * Get the trust score for an agent based on historical behavioral signals.\n *\n * Computes a 0–100 score across 5 factors: history depth, task completion\n * rate, anomaly frequency, transaction consistency, and compliance adherence.\n *\n * @param agentId - Agent identifier\n * @returns Trust score with factor breakdown and level ('untrusted'|'low'|'medium'|'high'|'verified')\n */\n async getTrustScore(agentId: string): Promise<TrustScore> {\n return this.trustScorer.getTrustScore(agentId);\n }\n\n /**\n * Evaluate the risk of a specific transaction before or after executing it.\n *\n * @param tx - Transaction to evaluate\n * @returns Risk evaluation with score, factors, and recommendation (approve/review/block)\n */\n async evaluateTransaction(tx: LogTransactionInput): Promise<TransactionEvaluation> {\n return this.trustScorer.evaluateTransaction(tx);\n }\n\n // --------------------------------------------------------------------------\n // Anomaly Detection\n // --------------------------------------------------------------------------\n\n /**\n * Enable anomaly detection with the specified rules and thresholds.\n *\n * Free-tier rules: `unusualAmount`, `frequencySpike`\n * Pay as you go rules: `newDestination`, `offHoursActivity`, `rapidSuccession`, `roundAmount`\n *\n * @param config - Detection configuration with rules and optional thresholds\n *\n * @example\n * ```typescript\n * ctx.enableAnomalyDetection({\n * rules: ['unusualAmount', 'frequencySpike'],\n * thresholds: { maxAmount: '10000', maxFrequency: 30 },\n * });\n * ctx.onAnomaly((event) => {\n * console.log(`Anomaly: ${event.type} [${event.severity}]`);\n * });\n * ```\n */\n enableAnomalyDetection(config: AnomalyDetectionConfig): void {\n // Advanced anomaly rules require Pro plan (Pay as you go)\n const advancedRules = ['newDestination', 'offHoursActivity', 'rapidSuccession', 'roundAmount'];\n const hasAdvanced = config.rules.some((r) => advancedRules.includes(r));\n if (hasAdvanced) {\n requirePlan('advanced-anomaly-rules', this.planManager.getTier());\n }\n this.anomalyDetector.enableAnomalyDetection(config);\n }\n\n /**\n * Disable anomaly detection.\n */\n disableAnomalyDetection(): void {\n this.anomalyDetector.disableAnomalyDetection();\n }\n\n /**\n * Register a callback for anomaly events.\n *\n * @param callback - Function to call when an anomaly is detected\n * @returns Unsubscribe function\n */\n onAnomaly(callback: AnomalyCallback): () => void {\n return this.anomalyDetector.onAnomaly(callback);\n }\n\n // --------------------------------------------------------------------------\n // Compliance Certificates\n // --------------------------------------------------------------------------\n\n /**\n * Generate a compliance certificate that summarizes an agent's actions\n * and cryptographically verifies the digest chain integrity.\n *\n * The certificate includes: action/transaction/reasoning counts, digest chain\n * verification status (patented), the agent's current trust\n * score, and an overall compliance status. A SHA-256 content hash of the\n * certificate itself is included for tamper-evidence.\n *\n * @param input - Certificate generation options (agentId, optional timeRange, includeReasoning)\n * @returns Compliance certificate with digest chain proof and trust score\n *\n * @example\n * ```typescript\n * const cert = await ctx.generateComplianceCertificate({\n * agentId: 'payment-agent-v1',\n * includeReasoning: true,\n * });\n * console.log(cert.complianceStatus); // 'compliant'\n * console.log(cert.digestChain.verified); // true\n * console.log(cert.trustScore); // 87\n * console.log(cert.contentHash); // sha256 of certificate\n * ```\n */\n async generateComplianceCertificate(\n input: GenerateComplianceCertificateInput,\n ): Promise<ComplianceCertificate> {\n const { agentId, timeRange, includeReasoning } = input;\n\n // Get all actions for the agent, optionally filtered by time range\n let agentActions = this.store.getActionsByAgent(agentId);\n if (timeRange) {\n const from = timeRange.from.getTime();\n const to = timeRange.to.getTime();\n agentActions = agentActions.filter((a) => {\n const ts = new Date(a.timestamp).getTime();\n return ts >= from && ts <= to;\n });\n }\n\n const transactions = agentActions.filter((a) => a.type === 'transaction');\n const toolCalls = agentActions.filter((a) => a.type === 'tool_call');\n const reasoningActions = agentActions.filter((a) => a.type === 'reasoning');\n\n // Build action type summary\n const typeCounts = new Map<string, number>();\n for (const action of agentActions) {\n typeCounts.set(action.type, (typeCounts.get(action.type) ?? 0) + 1);\n }\n const actionSummary = Array.from(typeCounts.entries()).map(([type, count]) => ({ type, count }));\n\n // Verify digest chain\n const verification = this.verifyDigestChain();\n const chainLength = this.logger.getDigestChain().getChainLength();\n const terminalDigest = this.getTerminalDigest();\n\n // Get trust score\n const trustScore = await this.trustScorer.getTrustScore(agentId);\n\n // Determine compliance status\n let agentAnomalies = this.store.queryAnomalies((a) => a.agentId === agentId);\n if (timeRange) {\n const from = timeRange.from.getTime();\n const to = timeRange.to.getTime();\n agentAnomalies = agentAnomalies.filter((a) => {\n const ts = new Date(a.detectedAt).getTime();\n return ts >= from && ts <= to;\n });\n }\n\n const criticalAnomalies = agentAnomalies.filter((a) => a.severity === 'critical');\n const highAnomalies = agentAnomalies.filter((a) => a.severity === 'high');\n\n let complianceStatus: ComplianceCertificate['complianceStatus'];\n if (!verification.valid || criticalAnomalies.length > 0) {\n complianceStatus = 'non-compliant';\n } else if (highAnomalies.length > 0 || trustScore.score < 50) {\n complianceStatus = 'review-required';\n } else {\n complianceStatus = 'compliant';\n }\n\n // Build reasoning entries if requested\n let reasoningEntries: ReasoningEntry[] = [];\n if (includeReasoning) {\n reasoningEntries = reasoningActions.map((action) => ({\n id: action.metadata['reasoningId'] as string,\n timestamp: action.timestamp,\n agentId: action.agentId,\n ...(action.sessionId ? { sessionId: action.sessionId } : {}),\n ...(action.metadata['step'] !== undefined ? { step: action.metadata['step'] as number } : {}),\n ...(action.metadata['parentStep'] !== undefined ? { parentStep: action.metadata['parentStep'] as number } : {}),\n action: action.metadata['action'] as string,\n reasoning: action.metadata['reasoning'] as string,\n confidence: action.metadata['confidence'] as number,\n ...(action.metadata['toolCall'] ? { toolCall: action.metadata['toolCall'] as string } : {}),\n ...(action.metadata['toolResult'] !== undefined ? { toolResult: action.metadata['toolResult'] } : {}),\n context: (action.metadata['context'] as Record<string, unknown>) ?? {},\n }));\n }\n\n const certificateId = generateId();\n const issuedAt = now();\n\n const certificateContent = {\n certificateId,\n agentId,\n issuedAt,\n summary: {\n actions: agentActions.length,\n transactions: transactions.length,\n toolCalls: toolCalls.length,\n reasoningEntries: reasoningActions.length,\n },\n digestChain: {\n terminalDigest,\n chainLength,\n verified: verification.valid,\n },\n trustScore: trustScore.score,\n complianceStatus,\n actions: actionSummary,\n reasoning: reasoningEntries,\n };\n\n // Compute SHA-256 hash of the certificate content for integrity verification\n const hash = createHash('sha256');\n hash.update(JSON.stringify(certificateContent));\n const contentHash = hash.digest('hex');\n\n return { ...certificateContent, contentHash };\n }\n\n // --------------------------------------------------------------------------\n // Plan & Usage Metering\n // --------------------------------------------------------------------------\n\n /**\n * Get current usage statistics for the plan.\n *\n * @returns Usage data including plan, event count, limits, and whether the limit is exceeded\n */\n getUsage(): PlanUsage {\n return this.planManager.getUsage();\n }\n\n /**\n * Change the plan tier at runtime (e.g., after Stripe checkout succeeds).\n *\n * @param tier - The new plan tier\n */\n setPlan(tier: PlanTier): void {\n this.planManager.setPlan(tier);\n }\n\n /**\n * Register a callback for when usage reaches 80% of the plan limit.\n *\n * @param callback - Function to call with the limit event\n * @returns Unsubscribe function\n */\n onUsageWarning(callback: (event: LimitEvent) => void): () => void {\n return this.planManager.onUsageWarning(callback);\n }\n\n /**\n * Register a callback for when the plan event limit is reached.\n *\n * @param callback - Function to call with the limit event\n * @returns Unsubscribe function\n */\n onLimitReached(callback: (event: LimitEvent) => void): () => void {\n return this.planManager.onLimitReached(callback);\n }\n\n /**\n * Get the URL for upgrading to the Pro plan.\n *\n * @returns The upgrade URL (configurable via init)\n */\n getUpgradeUrl(): string {\n return this.planManager.upgradeUrl;\n }\n\n /**\n * Get the URL for contacting the team about Enterprise pricing.\n *\n * @returns The enterprise contact URL\n */\n getEnterpriseContactUrl(): string {\n return this.planManager.enterpriseContactUrl;\n }\n\n /**\n * Persist plan metering state to the storage adapter.\n * Call this alongside flush() to persist event counts across restarts.\n */\n async flushPlanState(): Promise<void> {\n const adapter = this.store.getStorageAdapter();\n if (!adapter) return;\n await adapter.save(PLAN_STORAGE_KEY, this.planManager.toJSON());\n }\n\n /**\n * Restore plan metering state from the storage adapter.\n * Call this after restore() to reload event counts.\n */\n async restorePlanState(): Promise<void> {\n const adapter = this.store.getStorageAdapter();\n if (!adapter) return;\n const data = await adapter.load(PLAN_STORAGE_KEY);\n if (data && typeof data === 'object' && data.tier && typeof data.eventCount === 'number') {\n this.planManager.setPlan(data.tier);\n this.planManager.setEventCount(data.eventCount);\n if (data.billingPeriodStart) {\n this.planManager.resetBillingPeriod(new Date(data.billingPeriodStart));\n this.planManager.setEventCount(data.eventCount);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Feature Flags\n // --------------------------------------------------------------------------\n\n /**\n * Check if a feature flag is enabled for the current environment and plan.\n * Returns `false` if feature flags are not configured.\n * Always synchronous — reads from in-memory cache.\n */\n isFeatureEnabled(\n flagName: string,\n environment?: Environment,\n plan?: 'free' | 'pro' | 'enterprise',\n ): boolean {\n if (!this.featureFlagManager) return false;\n return this.featureFlagManager.isEnabled(flagName, environment, plan);\n }\n\n /**\n * Get the underlying FeatureFlagManager (or null if not configured).\n */\n getFeatureFlagManager(): FeatureFlagManager | null {\n return this.featureFlagManager;\n }\n\n // --------------------------------------------------------------------------\n // Lifecycle\n // --------------------------------------------------------------------------\n\n /**\n * Gracefully shut down the SDK, flushing any pending data.\n */\n async destroy(): Promise<void> {\n await this.logger.destroy();\n await this.exporter.shutdown();\n }\n}\n","// ============================================================================\n// Kontext SDK - Pluggable Storage Adapters\n// ============================================================================\n// Provides a StorageAdapter interface and built-in implementations for\n// persistence. The MemoryStorage adapter preserves existing in-memory\n// behavior, while FileStorage writes JSON files to disk.\n// Users can implement their own adapters (Redis, Postgres, etc.) by\n// conforming to the StorageAdapter interface.\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// ============================================================================\n// StorageAdapter Interface\n// ============================================================================\n\n/**\n * Interface for pluggable storage backends.\n * Implement this to persist Kontext data to any backend (Redis, Postgres,\n * Cloud Firestore, S3, etc.).\n *\n * @example\n * ```typescript\n * class RedisStorage implements StorageAdapter {\n * async save(key: string, data: any): Promise<void> {\n * await redis.set(key, JSON.stringify(data));\n * }\n * async load(key: string): Promise<any | null> {\n * const raw = await redis.get(key);\n * return raw ? JSON.parse(raw) : null;\n * }\n * async delete(key: string): Promise<void> {\n * await redis.del(key);\n * }\n * async list(prefix?: string): Promise<string[]> {\n * return redis.keys(prefix ? `${prefix}*` : '*');\n * }\n * }\n * ```\n */\nexport interface StorageAdapter {\n /** Persist data under the given key. */\n save(key: string, data: any): Promise<void>;\n /** Load data for the given key, returning null if not found. */\n load(key: string): Promise<any | null>;\n /** Delete data for the given key. */\n delete(key: string): Promise<void>;\n /** List all keys, optionally filtered by prefix. */\n list(prefix?: string): Promise<string[]>;\n}\n\n// ============================================================================\n// MemoryStorage\n// ============================================================================\n\n/**\n * In-memory storage adapter. Data is lost when the process exits.\n * This is the default adapter and preserves the SDK's original behavior.\n */\nexport class MemoryStorage implements StorageAdapter {\n private data: Map<string, any> = new Map();\n\n async save(key: string, data: any): Promise<void> {\n this.data.set(key, structuredClone(data));\n }\n\n async load(key: string): Promise<any | null> {\n const value = this.data.get(key);\n return value !== undefined ? structuredClone(value) : null;\n }\n\n async delete(key: string): Promise<void> {\n this.data.delete(key);\n }\n\n async list(prefix?: string): Promise<string[]> {\n const keys = Array.from(this.data.keys());\n if (!prefix) return keys;\n return keys.filter((k) => k.startsWith(prefix));\n }\n\n /** Clear all data. Useful for testing. */\n clear(): void {\n this.data.clear();\n }\n}\n\n// ============================================================================\n// FileStorage\n// ============================================================================\n\n/**\n * File-based storage adapter. Persists each key as a separate JSON file\n * inside the configured directory.\n *\n * @example\n * ```typescript\n * const storage = new FileStorage('./kontext-data');\n * await storage.save('actions', [action1, action2]);\n * const actions = await storage.load('actions');\n * ```\n */\nexport class FileStorage implements StorageAdapter {\n private readonly baseDir: string;\n\n constructor(baseDir: string) {\n this.baseDir = path.resolve(baseDir);\n }\n\n async save(key: string, data: any): Promise<void> {\n fs.mkdirSync(this.baseDir, { recursive: true });\n const filePath = this.keyToPath(key);\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n }\n\n async load(key: string): Promise<any | null> {\n const filePath = this.keyToPath(key);\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n\n async delete(key: string): Promise<void> {\n const filePath = this.keyToPath(key);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n\n async list(prefix?: string): Promise<string[]> {\n if (!fs.existsSync(this.baseDir)) return [];\n return this.listRecursive(this.baseDir, prefix);\n }\n\n /** Get the base directory path. */\n getBaseDir(): string {\n return this.baseDir;\n }\n\n // --------------------------------------------------------------------------\n // Helpers\n // --------------------------------------------------------------------------\n\n private keyToPath(key: string): string {\n // Replace colons and slashes with OS path separators for nested keys\n const safeName = key.replace(/[<>\"|?*]/g, '_');\n return path.join(this.baseDir, `${safeName}.json`);\n }\n\n private pathToKey(filePath: string): string {\n const relative = path.relative(this.baseDir, filePath);\n // Remove .json extension\n return relative.replace(/\\.json$/, '');\n }\n\n private listRecursive(dir: string, prefix?: string): string[] {\n const keys: string[] = [];\n if (!fs.existsSync(dir)) return keys;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n keys.push(...this.listRecursive(fullPath, prefix));\n } else if (entry.isFile() && entry.name.endsWith('.json')) {\n const key = this.pathToKey(fullPath);\n if (!prefix || key.startsWith(prefix)) {\n keys.push(key);\n }\n }\n }\n return keys;\n }\n}\n","// ============================================================================\n// kontext verify — log + compliance check + digest proof\n// ============================================================================\n\nimport { Kontext } from '../client.js';\nimport { FileStorage } from '../storage.js';\nimport type { Token, Chain } from '../types.js';\n\ninterface VerifyArgs {\n tx: string;\n amount: string;\n token: Token;\n from: string;\n to: string;\n agent: string;\n session?: string;\n json: boolean;\n}\n\nexport async function runVerify(args: VerifyArgs): Promise<void> {\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const storage = new FileStorage(dataDir);\n const kontext = Kontext.init({\n projectId: 'cli',\n environment: 'production',\n storage,\n });\n\n await kontext.restore();\n\n const result = await kontext.verify({\n txHash: args.tx,\n chain: 'base' as Chain,\n amount: args.amount,\n token: args.token,\n from: args.from,\n to: args.to,\n agentId: args.agent,\n sessionId: args.session,\n });\n\n await kontext.flush();\n\n if (args.json) {\n const output = {\n compliant: result.compliant,\n riskLevel: result.riskLevel,\n checks: result.checks.map((c) => ({\n name: c.name,\n passed: c.passed,\n severity: c.severity,\n })),\n digestProof: result.digestProof,\n transaction: {\n id: result.transaction.id,\n txHash: result.transaction.txHash,\n timestamp: result.transaction.timestamp,\n },\n recommendations: result.recommendations,\n };\n process.stdout.write(JSON.stringify(output, null, 2) + '\\n');\n } else {\n const passed = result.checks.filter((c) => c.passed).length;\n const failed = result.checks.filter((c) => !c.passed).length;\n\n process.stdout.write(`Compliant: ${result.compliant}\\n`);\n process.stdout.write(`Checks: ${passed} passed, ${failed} failed\\n`);\n process.stdout.write(`Risk Level: ${result.riskLevel}\\n`);\n process.stdout.write(`Digest: ${result.digestProof.terminalDigest.slice(0, 16)}...\\n`);\n process.stdout.write(`Persisted to: ${dataDir}/store.json\\n`);\n }\n\n await kontext.destroy();\n\n if (!result.compliant) {\n process.exit(1);\n }\n}\n","// ============================================================================\n// kontext reason — log agent reasoning into digest chain\n// ============================================================================\n\nimport { Kontext } from '../client.js';\nimport { FileStorage } from '../storage.js';\n\ninterface ReasonArgs {\n text: string;\n agent: string;\n session?: string;\n step?: number;\n json: boolean;\n}\n\nexport async function runReason(args: ReasonArgs): Promise<void> {\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const storage = new FileStorage(dataDir);\n const kontext = Kontext.init({\n projectId: 'cli',\n environment: 'production',\n storage,\n });\n\n await kontext.restore();\n\n const entry = await kontext.logReasoning({\n agentId: args.agent,\n sessionId: args.session,\n step: args.step,\n action: 'cli-reason',\n reasoning: args.text,\n });\n\n await kontext.flush();\n\n if (args.json) {\n process.stdout.write(JSON.stringify(entry, null, 2) + '\\n');\n } else {\n const stepStr = args.step !== undefined ? `Step ${args.step}` : 'Step ?';\n const digest = kontext.getTerminalDigest();\n process.stdout.write(`Reasoning logged | ${stepStr} | Digest: ${digest.slice(0, 16)}...\\n`);\n }\n\n await kontext.destroy();\n}\n","// ============================================================================\n// kontext cert — export compliance certificate\n// ============================================================================\n\nimport { Kontext } from '../client.js';\nimport { FileStorage } from '../storage.js';\nimport type { ActionLog } from '../types.js';\nimport * as fs from 'fs';\n\nconst GENESIS_HASH = '0000000000000000000000000000000000000000000000000000000000000000';\n\ninterface CertArgs {\n agent: string;\n output?: string;\n json: boolean;\n}\n\nfunction verifyChainFromActions(actions: ActionLog[]): { valid: boolean; terminalDigest: string; chainLength: number } {\n if (actions.length === 0) {\n return { valid: true, terminalDigest: GENESIS_HASH, chainLength: 0 };\n }\n const sorted = [...actions].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n let expectedPrior = GENESIS_HASH;\n let lastDigest = GENESIS_HASH;\n for (const action of sorted) {\n if (!action.digest || !action.priorDigest) continue;\n if (action.priorDigest !== expectedPrior) {\n return { valid: false, terminalDigest: lastDigest, chainLength: sorted.length };\n }\n expectedPrior = action.digest;\n lastDigest = action.digest;\n }\n return { valid: true, terminalDigest: lastDigest, chainLength: sorted.length };\n}\n\nexport async function runCert(args: CertArgs): Promise<void> {\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const storage = new FileStorage(dataDir);\n const kontext = Kontext.init({\n projectId: 'cli',\n environment: 'production',\n storage,\n });\n\n await kontext.restore();\n\n // Generate certificate (trust score, action counts come from client)\n const cert = await kontext.generateComplianceCertificate({\n agentId: args.agent,\n includeReasoning: true,\n });\n\n // Override digest chain verification with direct action-based verification\n // (the in-memory DigestChain is empty after restore — verify from stored digests)\n const actions = kontext.getActions();\n const chainVerification = verifyChainFromActions(actions);\n\n const fixedCert = {\n ...cert,\n digestChain: {\n terminalDigest: chainVerification.terminalDigest,\n chainLength: chainVerification.chainLength,\n verified: chainVerification.valid,\n },\n disclaimer: 'Regulatory responsibility remains with the operator.',\n };\n\n if (args.output) {\n fs.writeFileSync(args.output, JSON.stringify(fixedCert, null, 2), 'utf-8');\n }\n\n if (args.json) {\n process.stdout.write(JSON.stringify(fixedCert, null, 2) + '\\n');\n } else {\n process.stdout.write(`Certificate generated\\n`);\n process.stdout.write(`Actions: ${cert.summary.actions} | Trust Score: ${cert.trustScore}/100 | Chain: ${chainVerification.valid ? 'VALID' : 'INVALID'}\\n`);\n process.stdout.write(`SHA-256: ${cert.contentHash.slice(0, 16)}...\\n`);\n if (args.output) {\n process.stdout.write(`Saved to: ${args.output}\\n`);\n }\n }\n\n await kontext.destroy();\n}\n","// ============================================================================\n// kontext audit — verify digest chain integrity from persisted actions\n// ============================================================================\n\nimport { FileStorage } from '../storage.js';\nimport type { ActionLog } from '../types.js';\n\nconst GENESIS_HASH = '0000000000000000000000000000000000000000000000000000000000000000';\n\ninterface AuditArgs {\n json: boolean;\n}\n\n/**\n * Verify the digest chain directly from persisted actions.\n * Each action stores its own digest and priorDigest.\n * We walk the chain and verify each link points to the previous digest.\n */\nfunction verifyChainFromActions(actions: ActionLog[]): {\n valid: boolean;\n chainLength: number;\n terminalDigest: string;\n brokenAt?: number;\n} {\n if (actions.length === 0) {\n return { valid: true, chainLength: 0, terminalDigest: GENESIS_HASH };\n }\n\n // Sort by timestamp to ensure correct ordering\n const sorted = [...actions].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n let expectedPrior = GENESIS_HASH;\n let lastDigest = GENESIS_HASH;\n\n for (let i = 0; i < sorted.length; i++) {\n const action = sorted[i]!;\n if (!action.digest || !action.priorDigest) {\n // Action doesn't have chain data — skip (pre-chain actions)\n continue;\n }\n\n if (action.priorDigest !== expectedPrior) {\n return {\n valid: false,\n chainLength: sorted.length,\n terminalDigest: lastDigest,\n brokenAt: i,\n };\n }\n\n expectedPrior = action.digest;\n lastDigest = action.digest;\n }\n\n return {\n valid: true,\n chainLength: sorted.length,\n terminalDigest: lastDigest,\n };\n}\n\nexport async function runAudit(args: AuditArgs): Promise<void> {\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const storage = new FileStorage(dataDir);\n\n // Load actions directly from storage (bypass Kontext client to avoid\n // in-memory DigestChain mismatch after restore)\n const rawActions = await storage.load('kontext:actions');\n const actions: ActionLog[] = Array.isArray(rawActions) ? rawActions : [];\n\n const result = verifyChainFromActions(actions);\n\n if (args.json) {\n const output = {\n valid: result.valid,\n chainLength: result.chainLength,\n terminalDigest: result.terminalDigest,\n ...(result.brokenAt !== undefined ? { brokenAt: result.brokenAt } : {}),\n };\n process.stdout.write(JSON.stringify(output, null, 2) + '\\n');\n } else {\n process.stdout.write(`Chain length: ${result.chainLength} links\\n`);\n process.stdout.write(`All verified: ${result.valid ? 'YES' : 'NO'}\\n`);\n process.stdout.write(`Terminal digest: ${result.terminalDigest.slice(0, 16)}...\\n`);\n if (result.valid) {\n process.stdout.write(`No tampering detected.\\n`);\n } else {\n process.stdout.write(`TAMPERING DETECTED at link ${result.brokenAt}.\\n`);\n }\n }\n\n if (!result.valid) {\n process.exit(1);\n }\n}\n","// ============================================================================\n// kontext sync — fetch latest OFAC SDN list from U.S. Treasury\n// ============================================================================\n//\n// Two modes:\n// --full Download the complete SDN XML (~50MB), parse ALL sanctioned\n// entities (names, programs, identifiers) AND all digital currency\n// addresses. One-time bootstrap to populate GCS as persistent\n// baseline. Covers fiat + crypto sanctions.\n//\n// (default) Fast per-program fetch of ETH addresses from 7 crypto-relevant\n// programs. Diffs against the GCS baseline (or local cache).\n//\n// Persistent storage:\n// 1. Always write to local file cache (.kontext/ofac-sdn-cache.json)\n// 2. If GCP config is set, read/write from Cloud Storage (GCS)\n// ============================================================================\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst SLS_BASE = 'https://sanctionslistservice.ofac.treas.gov';\nconst ETH_REGEX = /0x[a-fA-F0-9]{40}/g;\n\n// Standard SDN XML — has entity names, programs, AND crypto addresses\nconst SDN_XML_URL = 'https://www.treasury.gov/ofac/downloads/sdn.xml';\n\n// Sanctions programs known to contain crypto/ETH addresses.\nconst CRYPTO_PROGRAMS = [\n 'CYBER2', // Ransomware, crypto laundering\n 'DPRK3', // Lazarus Group / DPRK cyber ops\n 'DPRK4', // DPRK additional\n 'SDGT', // Terrorism financing (some use crypto)\n 'ILLICIT-DRUGS-EO14059', // Narcotics (some use crypto)\n 'IRGC', // Iran Revolutionary Guard\n 'RUSSIA-EO14024', // Russia sanctions (Garantex)\n];\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A digital currency address with metadata from the SDN list */\nexport interface SDNAddress {\n address: string;\n currency: string; // ETH, XBT, SOL, USDC, etc.\n entityName: string;\n entityType: string; // individual, entity\n sdnUid: string;\n chains: string[]; // ethereum, base, solana, etc.\n}\n\n/** A non-crypto identifier (passport, national ID, etc.) */\nexport interface SDNIdentifier {\n type: string; // Passport, National Identification Number, etc.\n value: string;\n country: string;\n}\n\n/** A full SDN entity with all metadata */\nexport interface SDNEntity {\n uid: string;\n name: string;\n aliases: string[];\n type: string; // individual, entity, vessel, aircraft\n programs: string[];\n identifiers: SDNIdentifier[];\n digitalCurrencyAddresses: SDNAddress[];\n remarks: string;\n}\n\nexport interface SyncResult {\n addresses: string[];\n count: number;\n syncedAt: string;\n source: string;\n programs: string[];\n}\n\ninterface FullSyncData {\n entities: SDNEntity[];\n addresses: SDNAddress[];\n addressList: string[];\n syncedAt: string;\n source: string;\n stats: {\n totalEntities: number;\n entitiesWithCrypto: number;\n uniqueAddresses: number;\n currencyCounts: Record<string, number>;\n entityTypeCounts: Record<string, number>;\n };\n}\n\ninterface SyncArgs {\n json: boolean;\n full: boolean;\n}\n\n// ============================================================================\n// Address classification and chain mapping\n// ============================================================================\n\nconst EVM_CHAINS = ['ethereum', 'base', 'polygon', 'arbitrum', 'optimism', 'avalanche', 'arc'];\n\nconst CURRENCY_TO_CHAINS: Record<string, string[]> = {\n ETH: EVM_CHAINS,\n ARB: EVM_CHAINS,\n MATIC: EVM_CHAINS,\n OP: EVM_CHAINS,\n AVAX: EVM_CHAINS,\n BASE: EVM_CHAINS,\n SOL: ['solana'],\n USDC: EVM_CHAINS,\n USDT: EVM_CHAINS,\n DAI: EVM_CHAINS,\n EURC: EVM_CHAINS,\n XBT: ['bitcoin'],\n BTC: ['bitcoin'],\n};\n\nconst EVM_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;\nconst SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\nconst BTC_ADDRESS_REGEX = /^(1|3|bc1)[a-zA-HJ-NP-Z0-9]{25,62}$/;\n\nfunction classifyAddress(address: string): 'evm' | 'solana' | 'bitcoin' | null {\n if (EVM_ADDRESS_REGEX.test(address)) return 'evm';\n if (SOLANA_ADDRESS_REGEX.test(address)) return 'solana';\n if (BTC_ADDRESS_REGEX.test(address)) return 'bitcoin';\n return null;\n}\n\nfunction normalizeAddress(address: string, type: string): string {\n if (type === 'evm') return address.toLowerCase();\n return address; // SOL and BTC are case-sensitive\n}\n\n// ============================================================================\n// XML extraction helpers\n// ============================================================================\n\nfunction extractTag(block: string, tag: string): string | null {\n const match = new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`).exec(block);\n return match?.[1]?.trim() ?? null;\n}\n\nfunction extractAllTags(block: string, tag: string): string[] {\n const results: string[] = [];\n const regex = new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`, 'g');\n let m: RegExpExecArray | null;\n while ((m = regex.exec(block)) !== null) {\n const val = m[1]?.trim();\n if (val) results.push(val);\n }\n return results;\n}\n\n// ============================================================================\n// Fast mode — per-program ETH-only fetch\n// ============================================================================\n\nasync function fetchProgramAddresses(program: string): Promise<string[]> {\n const url = `${SLS_BASE}/entities?list=SDN%20List&program=${encodeURIComponent(program)}`;\n const response = await fetch(url, {\n headers: { accept: '*/*' },\n });\n\n if (!response.ok) return [];\n\n const xml = await response.text();\n const matches = xml.match(ETH_REGEX);\n if (!matches) return [];\n\n return matches.map((addr) => addr.toLowerCase());\n}\n\nasync function fetchSDNAddresses(): Promise<{ addresses: string[]; programs: string[] }> {\n const allAddresses = new Set<string>();\n const activePrograms: string[] = [];\n\n const results = await Promise.all(\n CRYPTO_PROGRAMS.map(async (prog) => {\n const addrs = await fetchProgramAddresses(prog);\n return { program: prog, addresses: addrs };\n }),\n );\n\n for (const { program, addresses } of results) {\n if (addresses.length > 0) {\n activePrograms.push(program);\n for (const addr of addresses) {\n allAddresses.add(addr);\n }\n }\n }\n\n return {\n addresses: Array.from(allAddresses).sort(),\n programs: activePrograms,\n };\n}\n\n// ============================================================================\n// Full mode — download standard SDN XML, parse ALL entities + addresses\n// ============================================================================\n\n/**\n * Download the full SDN XML and parse ALL sanctioned entities.\n *\n * The standard SDN XML (~50MB) uses <sdnEntry> blocks with entity names,\n * programs, identifiers, and digital currency addresses:\n *\n * <sdnEntry>\n * <uid>12345</uid>\n * <sdnType>Individual</sdnType>\n * <firstName>JOHN</firstName>\n * <lastName>DOE</lastName>\n * <programList><program>SDGT</program></programList>\n * <idList>\n * <id>\n * <idType>Passport</idType>\n * <idNumber>AB123456</idNumber>\n * <idCountry>Iran</idCountry>\n * </id>\n * <id>\n * <idType>Digital Currency Address - ETH</idType>\n * <idNumber>0x1234...</idNumber>\n * </id>\n * </idList>\n * </sdnEntry>\n */\nasync function fetchFullSDNList(): Promise<FullSyncData> {\n process.stderr.write('Downloading full OFAC SDN list from U.S. Treasury...\\n');\n\n const response = await fetch(SDN_XML_URL, {\n headers: {\n Accept: 'application/xml',\n 'User-Agent': 'Kontext-SDN-Sync/1.0',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Treasury endpoint returned HTTP ${response.status} ${response.statusText}`);\n }\n\n const xml = await response.text();\n process.stderr.write(`Downloaded ${(xml.length / 1024 / 1024).toFixed(1)}MB. Parsing...\\n`);\n\n const entities: SDNEntity[] = [];\n const allAddresses: SDNAddress[] = [];\n const uniqueAddressSet = new Set<string>();\n const currencyCounts: Record<string, number> = {};\n const entityTypeCounts: Record<string, number> = {};\n let entitiesWithCrypto = 0;\n\n // Parse all <sdnEntry> blocks\n const entryRegex = /<sdnEntry>([\\s\\S]*?)<\\/sdnEntry>/g;\n let entryMatch: RegExpExecArray | null;\n\n while ((entryMatch = entryRegex.exec(xml)) !== null) {\n const block = entryMatch[1]!;\n\n // UID\n const uid = extractTag(block, 'uid');\n if (!uid) continue;\n\n // Name\n const firstName = extractTag(block, 'firstName') ?? '';\n const lastName = extractTag(block, 'lastName') ?? '';\n const name = firstName ? `${firstName} ${lastName}`.trim() : lastName;\n\n // Type\n const sdnType = (extractTag(block, 'sdnType') ?? 'unknown').toLowerCase();\n entityTypeCounts[sdnType] = (entityTypeCounts[sdnType] ?? 0) + 1;\n\n // Programs\n const programListBlock = extractTag(block, 'programList');\n const programs = programListBlock ? extractAllTags(programListBlock, 'program') : [];\n\n // Aliases\n const aliases: string[] = [];\n const akaListBlock = extractTag(block, 'akaList');\n if (akaListBlock) {\n const akaRegex = /<aka>([\\s\\S]*?)<\\/aka>/g;\n let akaMatch: RegExpExecArray | null;\n while ((akaMatch = akaRegex.exec(akaListBlock)) !== null) {\n const akaBlock = akaMatch[1]!;\n const akaFirst = extractTag(akaBlock, 'firstName') ?? '';\n const akaLast = extractTag(akaBlock, 'lastName') ?? '';\n const alias = akaFirst ? `${akaFirst} ${akaLast}`.trim() : akaLast;\n if (alias && alias !== name) aliases.push(alias);\n }\n }\n\n // Identifiers and digital currency addresses\n const identifiers: SDNIdentifier[] = [];\n const cryptoAddresses: SDNAddress[] = [];\n const idListBlock = extractTag(block, 'idList');\n\n if (idListBlock) {\n const idRegex = /<id>([\\s\\S]*?)<\\/id>/g;\n let idMatch: RegExpExecArray | null;\n\n while ((idMatch = idRegex.exec(idListBlock)) !== null) {\n const idBlock = idMatch[1]!;\n const idType = extractTag(idBlock, 'idType') ?? '';\n const idNumber = extractTag(idBlock, 'idNumber') ?? '';\n\n if (!idType || !idNumber) continue;\n\n if (idType.startsWith('Digital Currency Address')) {\n // Crypto address\n const currencyMatch = /Digital Currency Address\\s*-\\s*(\\w+)/.exec(idType);\n const currency = currencyMatch?.[1] ?? 'UNKNOWN';\n const addrType = classifyAddress(idNumber);\n if (!addrType) continue;\n\n const address = normalizeAddress(idNumber, addrType);\n const chains = CURRENCY_TO_CHAINS[currency] ??\n (addrType === 'evm' ? EVM_CHAINS : addrType === 'solana' ? ['solana'] : ['bitcoin']);\n\n const sdnAddr: SDNAddress = {\n address,\n currency,\n entityName: name,\n entityType: sdnType,\n sdnUid: uid,\n chains,\n };\n cryptoAddresses.push(sdnAddr);\n allAddresses.push(sdnAddr);\n uniqueAddressSet.add(address);\n currencyCounts[currency] = (currencyCounts[currency] ?? 0) + 1;\n } else {\n // Non-crypto identifier (passport, national ID, etc.)\n const idCountry = extractTag(idBlock, 'idCountry') ?? '';\n identifiers.push({ type: idType, value: idNumber, country: idCountry });\n }\n }\n }\n\n if (cryptoAddresses.length > 0) entitiesWithCrypto++;\n\n // Remarks\n const remarks = extractTag(block, 'remarks') ?? '';\n\n entities.push({\n uid,\n name,\n aliases,\n type: sdnType,\n programs,\n identifiers,\n digitalCurrencyAddresses: cryptoAddresses,\n remarks,\n });\n }\n\n process.stderr.write(\n `Parsed ${entities.length} entities, ${allAddresses.length} crypto addresses (${uniqueAddressSet.size} unique)\\n`,\n );\n\n return {\n entities,\n addresses: allAddresses,\n addressList: Array.from(uniqueAddressSet).sort(),\n syncedAt: new Date().toISOString(),\n source: SDN_XML_URL,\n stats: {\n totalEntities: entities.length,\n entitiesWithCrypto,\n uniqueAddresses: uniqueAddressSet.size,\n currencyCounts,\n entityTypeCounts,\n },\n };\n}\n\n// ============================================================================\n// GCS (Cloud Storage) — persistent baseline storage\n// ============================================================================\n\nconst DEFAULT_GCS_BUCKET = 'kontext-sdn-data';\nconst GCS_BASELINE_PATH = 'ofac-sdn/baseline.json';\nconst GCS_ENTITIES_PATH = 'ofac-sdn/entities.json';\n\ninterface GcsBaseline {\n addresses: string[];\n entityCount: number;\n syncedAt: string;\n isFullSync: boolean;\n}\n\nasync function readGcsBaseline(bucket: string): Promise<GcsBaseline | null> {\n const objectPath = encodeURIComponent(GCS_BASELINE_PATH);\n const url = `https://storage.googleapis.com/storage/v1/b/${bucket}/o/${objectPath}?alt=media`;\n\n try {\n const token = await getGcpAccessToken();\n if (!token) return null;\n const res = await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) return null;\n return await res.json() as GcsBaseline;\n } catch {\n return null;\n }\n}\n\nasync function writeGcsObject(bucket: string, objectPath: string, data: unknown): Promise<boolean> {\n const encodedPath = encodeURIComponent(objectPath);\n const url = `https://storage.googleapis.com/upload/storage/v1/b/${bucket}/o?uploadType=media&name=${encodedPath}`;\n\n try {\n const token = await getGcpAccessToken();\n if (!token) return false;\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// GCP Auth — metadata server (Cloud Run) or env var (local dev)\n// ============================================================================\n\nconst METADATA_TOKEN_URL =\n 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token';\n\nlet cachedToken: { token: string; expiresAt: number } | null = null;\n\nasync function getGcpAccessToken(): Promise<string | null> {\n if (cachedToken && Date.now() < cachedToken.expiresAt) {\n return cachedToken.token;\n }\n\n const envToken = process.env['GOOGLE_ACCESS_TOKEN'];\n if (envToken) {\n cachedToken = { token: envToken, expiresAt: Date.now() + 3_600_000 };\n return envToken;\n }\n\n try {\n const res = await fetch(METADATA_TOKEN_URL, {\n headers: { 'Metadata-Flavor': 'Google' },\n signal: AbortSignal.timeout(2000),\n });\n if (!res.ok) return null;\n const data = await res.json() as { access_token: string; expires_in: number };\n cachedToken = { token: data.access_token, expiresAt: Date.now() + (data.expires_in - 60) * 1000 };\n return cachedToken.token;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// Main sync command\n// ============================================================================\n\nexport async function runSync(args: SyncArgs): Promise<void> {\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const gcsBucket = process.env['KONTEXT_GCS_BUCKET'] || process.env['GCS_BUCKET'] || DEFAULT_GCS_BUCKET;\n const useGcs = !!(process.env['KONTEXT_GCS_BUCKET'] || process.env['GCS_BUCKET'] || process.env['GCP_PROJECT_ID']);\n\n fs.mkdirSync(dataDir, { recursive: true });\n const cachePath = path.join(dataDir, 'ofac-sdn-cache.json');\n\n // -----------------------------------------------------------------------\n // Load previous baseline — GCS first, then local cache fallback\n // -----------------------------------------------------------------------\n let previousAddresses: string[] = [];\n let previousSyncedAt = '';\n let baselineSource = 'none';\n\n if (useGcs) {\n process.stderr.write('Reading baseline from GCS...\\n');\n const gcsBaseline = await readGcsBaseline(gcsBucket);\n if (gcsBaseline && gcsBaseline.addresses.length > 0) {\n previousAddresses = gcsBaseline.addresses;\n previousSyncedAt = gcsBaseline.syncedAt;\n baselineSource = 'gcs';\n }\n }\n\n if (baselineSource === 'none') {\n try {\n const prev = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));\n previousAddresses = Array.isArray(prev.addresses) ? prev.addresses : [];\n previousSyncedAt = prev.syncedAt ?? '';\n if (previousAddresses.length > 0) baselineSource = 'local';\n } catch {\n // No previous cache\n }\n }\n\n // -----------------------------------------------------------------------\n // Fetch — full mode or fast per-program mode\n // -----------------------------------------------------------------------\n if (args.full) {\n await runFullSync(args, dataDir, cachePath, gcsBucket, useGcs, previousAddresses, previousSyncedAt, baselineSource);\n } else {\n await runFastSync(args, cachePath, gcsBucket, useGcs, previousAddresses, previousSyncedAt, baselineSource);\n }\n}\n\n// ============================================================================\n// Full sync — all entities + all crypto addresses\n// ============================================================================\n\nasync function runFullSync(\n args: SyncArgs,\n dataDir: string,\n cachePath: string,\n gcsBucket: string,\n useGcs: boolean,\n previousAddresses: string[],\n previousSyncedAt: string,\n baselineSource: string,\n): Promise<void> {\n process.stderr.write('Full OFAC SDN sync — all sanctioned entities and digital currency addresses\\n');\n\n let fullData: FullSyncData;\n try {\n fullData = await fetchFullSDNList();\n } catch (err) {\n process.stderr.write(`Full sync failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n\n // Compute address diff\n const prevSet = new Set(previousAddresses);\n const newSet = new Set(fullData.addressList);\n const added = fullData.addressList.filter((a) => !prevSet.has(a));\n const removed = previousAddresses.filter((a) => !newSet.has(a));\n\n // Write local cache (slim — just addresses for quick lookup)\n const cacheData: SyncResult = {\n addresses: fullData.addressList,\n count: fullData.addressList.length,\n syncedAt: fullData.syncedAt,\n source: fullData.source,\n programs: [],\n };\n fs.writeFileSync(cachePath, JSON.stringify(cacheData, null, 2), 'utf-8');\n\n // Write full entity data to separate local file\n const fullPath = path.join(dataDir, 'ofac-sdn-full.json');\n fs.writeFileSync(fullPath, JSON.stringify({\n fetchedAt: fullData.syncedAt,\n source: fullData.source,\n stats: fullData.stats,\n entities: fullData.entities,\n }, null, 2), 'utf-8');\n process.stderr.write(`Full entity list saved to ${fullPath}\\n`);\n\n // Upload to GCS\n let gcsUpdated = false;\n if (useGcs) {\n process.stderr.write('Uploading to GCS...\\n');\n\n // Baseline (slim — for diff checking)\n const baselineOk = await writeGcsObject(gcsBucket, GCS_BASELINE_PATH, {\n addresses: fullData.addressList,\n entityCount: fullData.stats.totalEntities,\n syncedAt: fullData.syncedAt,\n isFullSync: true,\n } satisfies GcsBaseline);\n\n // Full entity data\n const entitiesOk = await writeGcsObject(gcsBucket, GCS_ENTITIES_PATH, {\n fetchedAt: fullData.syncedAt,\n source: fullData.source,\n stats: fullData.stats,\n entities: fullData.entities,\n });\n\n gcsUpdated = baselineOk && entitiesOk;\n if (!gcsUpdated) {\n process.stderr.write('GCS upload failed — local cache saved\\n');\n }\n }\n\n // Build currency breakdown for display\n const currencyBreakdown = Object.entries(fullData.stats.currencyCounts)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n\n const entityTypeBreakdown = Object.entries(fullData.stats.entityTypeCounts)\n .sort((a, b) => b[1] - a[1])\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n\n // Output\n if (args.json) {\n process.stdout.write(JSON.stringify({\n ...cacheData,\n stats: fullData.stats,\n diff: { added, removed },\n storage: {\n local: cachePath,\n gcs: gcsUpdated ? `gs://${gcsBucket}/${GCS_ENTITIES_PATH}` : null,\n baselineSource,\n },\n }, null, 2) + '\\n');\n } else {\n process.stdout.write(`OFAC SDN sync complete (FULL)\\n`);\n process.stdout.write(`Total sanctioned entities: ${fullData.stats.totalEntities}\\n`);\n process.stdout.write(`Entity types: ${entityTypeBreakdown}\\n`);\n process.stdout.write(`Crypto addresses: ${fullData.stats.uniqueAddresses} unique`);\n if (previousAddresses.length > 0 && previousAddresses.length !== fullData.stats.uniqueAddresses) {\n const diff = fullData.stats.uniqueAddresses - previousAddresses.length;\n process.stdout.write(` (${diff > 0 ? '+' : ''}${diff} since last sync)`);\n }\n process.stdout.write('\\n');\n if (currencyBreakdown) {\n process.stdout.write(`By currency: ${currencyBreakdown}\\n`);\n }\n if (added.length > 0) {\n process.stdout.write(`Added addresses (${added.length}):\\n`);\n for (const addr of added) {\n process.stdout.write(` + ${addr}\\n`);\n }\n }\n if (removed.length > 0) {\n process.stdout.write(`Removed addresses (${removed.length}):\\n`);\n for (const addr of removed) {\n process.stdout.write(` - ${addr}\\n`);\n }\n }\n if (added.length === 0 && removed.length === 0 && previousAddresses.length > 0) {\n process.stdout.write(`No address changes since last sync`);\n if (previousSyncedAt) process.stdout.write(` (${previousSyncedAt})`);\n process.stdout.write('\\n');\n }\n process.stdout.write(`Cached to: ${cachePath}\\n`);\n process.stdout.write(`Full list: ${path.join(dataDir, 'ofac-sdn-full.json')}\\n`);\n if (useGcs) {\n process.stdout.write(`GCS: ${gcsUpdated ? `gs://${gcsBucket}/${GCS_ENTITIES_PATH}` : 'unavailable'}\\n`);\n process.stdout.write(`Baseline from: ${baselineSource}\\n`);\n }\n process.stdout.write(`Source: ${fullData.source}\\n`);\n process.stdout.write(`Synced at: ${fullData.syncedAt}\\n`);\n }\n}\n\n// ============================================================================\n// Fast sync — per-program ETH addresses only\n// ============================================================================\n\nasync function runFastSync(\n args: SyncArgs,\n cachePath: string,\n gcsBucket: string,\n useGcs: boolean,\n previousAddresses: string[],\n previousSyncedAt: string,\n baselineSource: string,\n): Promise<void> {\n process.stderr.write('Fetching OFAC SDN list from U.S. Treasury...\\n');\n\n let result: { addresses: string[]; programs: string[] };\n try {\n result = await fetchSDNAddresses();\n } catch (err) {\n process.stderr.write(`Sync failed: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n\n const syncData: SyncResult = {\n addresses: result.addresses,\n count: result.addresses.length,\n syncedAt: new Date().toISOString(),\n source: `${SLS_BASE} (programs: ${result.programs.join(', ')})`,\n programs: result.programs,\n };\n\n // Compute diff\n const prevSet = new Set(previousAddresses);\n const newSet = new Set(syncData.addresses);\n const added = syncData.addresses.filter((a) => !prevSet.has(a));\n const removed = previousAddresses.filter((a) => !newSet.has(a));\n const hasChanges = added.length > 0 || removed.length > 0;\n\n // Write local cache\n fs.writeFileSync(cachePath, JSON.stringify(syncData, null, 2), 'utf-8');\n\n // Update GCS baseline if there are changes\n let gcsUpdated = false;\n if (useGcs && (hasChanges || baselineSource !== 'gcs')) {\n process.stderr.write('Updating GCS baseline...\\n');\n gcsUpdated = await writeGcsObject(gcsBucket, GCS_BASELINE_PATH, {\n addresses: syncData.addresses,\n entityCount: 0,\n syncedAt: syncData.syncedAt,\n isFullSync: false,\n } satisfies GcsBaseline);\n if (!gcsUpdated) {\n process.stderr.write('GCS update failed — local cache saved\\n');\n }\n }\n\n // Output\n if (args.json) {\n process.stdout.write(JSON.stringify({\n ...syncData,\n diff: { added, removed },\n storage: {\n local: cachePath,\n gcs: gcsUpdated ? `gs://${gcsBucket}/${GCS_BASELINE_PATH}` : null,\n baselineSource,\n },\n }, null, 2) + '\\n');\n } else {\n process.stdout.write(`OFAC SDN sync complete\\n`);\n process.stdout.write(`Digital currency addresses: ${syncData.count}`);\n if (previousAddresses.length > 0 && previousAddresses.length !== syncData.count) {\n const diff = syncData.count - previousAddresses.length;\n process.stdout.write(` (${diff > 0 ? '+' : ''}${diff} since last sync)`);\n }\n process.stdout.write('\\n');\n if (added.length > 0) {\n process.stdout.write(`Added (${added.length}):\\n`);\n for (const addr of added) {\n process.stdout.write(` + ${addr}\\n`);\n }\n }\n if (removed.length > 0) {\n process.stdout.write(`Removed (${removed.length}):\\n`);\n for (const addr of removed) {\n process.stdout.write(` - ${addr}\\n`);\n }\n }\n if (added.length === 0 && removed.length === 0 && previousAddresses.length > 0) {\n process.stdout.write(`No changes since last sync`);\n if (previousSyncedAt) process.stdout.write(` (${previousSyncedAt})`);\n process.stdout.write('\\n');\n }\n process.stdout.write(`Programs: ${result.programs.join(', ')}\\n`);\n process.stdout.write(`Cached to: ${cachePath}\\n`);\n if (useGcs) {\n process.stdout.write(`GCS: ${gcsUpdated ? 'updated' : 'unavailable'}\\n`);\n process.stdout.write(`Baseline from: ${baselineSource}\\n`);\n }\n process.stdout.write(`Source: U.S. Treasury OFAC SLS API\\n`);\n process.stdout.write(`Synced at: ${syncData.syncedAt}\\n`);\n }\n}\n","// ============================================================================\n// kontext mcp — start MCP server mode for Claude Code / Cursor / Windsurf\n// ============================================================================\n\nexport async function runMcp(): Promise<void> {\n // MCP SDK is an optional peer dependency — only loaded when `kontext mcp` is invoked\n let McpServer: any;\n let StdioServerTransport: any;\n\n try {\n // @ts-ignore — optional peer dependency, loaded only when `kontext mcp` is invoked\n const mcpSdk = await import('@modelcontextprotocol/sdk/server/index.js');\n McpServer = mcpSdk.McpServer;\n // @ts-ignore — optional peer dependency\n const mcpStdio = await import('@modelcontextprotocol/sdk/server/stdio.js');\n StdioServerTransport = mcpStdio.StdioServerTransport;\n } catch {\n process.stderr.write(\n 'MCP mode requires @modelcontextprotocol/sdk. Install with:\\n' +\n ' npm install @modelcontextprotocol/sdk\\n',\n );\n process.exit(2);\n }\n\n const { Kontext } = await import('../client.js');\n const { FileStorage } = await import('../storage.js');\n const { UsdcCompliance } = await import('../integrations/usdc.js');\n // @ts-ignore — zod is an optional dependency used by MCP SDK for tool schemas\n const { z } = await import('zod').catch(() => {\n // zod is used by MCP SDK for tool schemas — if not available, use inline schemas\n return { z: null } as any;\n });\n\n const dataDir = process.env['KONTEXT_DATA_DIR'] || '.kontext';\n const storage = new FileStorage(dataDir);\n const kontext = Kontext.init({\n projectId: 'cli',\n environment: 'production',\n storage,\n });\n\n await kontext.restore();\n\n const server = new McpServer({\n name: 'kontext',\n version: '0.6.0',\n });\n\n // Tool: verify_transaction\n server.tool(\n 'verify_transaction',\n 'Run compliance checks on a stablecoin transaction, log it, and return digest proof',\n {\n txHash: { type: 'string', description: 'Transaction hash' },\n amount: { type: 'string', description: 'Amount in token units' },\n token: { type: 'string', description: 'Token symbol (USDC, USDT, DAI, EURC, USDP, USDG)' },\n from: { type: 'string', description: 'Sender address' },\n to: { type: 'string', description: 'Recipient address' },\n agentId: { type: 'string', description: 'Agent identifier' },\n },\n async (params: Record<string, string>) => {\n const result = await kontext.verify({\n txHash: params['txHash'] ?? '',\n chain: 'base',\n amount: params['amount'] ?? '0',\n token: (params['token'] as any) ?? 'USDC',\n from: params['from'] ?? '',\n to: params['to'] ?? '',\n agentId: params['agentId'] ?? 'mcp',\n });\n await kontext.flush();\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n // Tool: check_sanctions\n server.tool(\n 'check_sanctions',\n 'Check if an address is on the OFAC SDN sanctions list',\n {\n address: { type: 'string', description: 'Ethereum address to check' },\n },\n async (params: Record<string, string>) => {\n const result = UsdcCompliance.checkSanctionsDetailed(params['address'] ?? '');\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n // Tool: log_reasoning\n server.tool(\n 'log_reasoning',\n 'Log agent reasoning into the tamper-evident digest chain',\n {\n agentId: { type: 'string', description: 'Agent identifier' },\n reasoning: { type: 'string', description: 'Reasoning text' },\n action: { type: 'string', description: 'Action being taken' },\n },\n async (params: Record<string, string>) => {\n const entry = await kontext.logReasoning({\n agentId: params['agentId'] ?? 'mcp',\n action: params['action'] ?? 'mcp-reasoning',\n reasoning: params['reasoning'] ?? '',\n });\n await kontext.flush();\n return { content: [{ type: 'text', text: JSON.stringify(entry, null, 2) }] };\n },\n );\n\n // Tool: get_trust_score\n server.tool(\n 'get_trust_score',\n 'Get the trust score for an agent based on historical behavior',\n {\n agentId: { type: 'string', description: 'Agent identifier' },\n },\n async (params: Record<string, string>) => {\n const score = await kontext.getTrustScore(params['agentId'] ?? 'mcp');\n return { content: [{ type: 'text', text: JSON.stringify(score, null, 2) }] };\n },\n );\n\n // Tool: get_compliance_certificate\n server.tool(\n 'get_compliance_certificate',\n 'Generate a compliance certificate for an agent with digest chain proof',\n {\n agentId: { type: 'string', description: 'Agent identifier' },\n },\n async (params: Record<string, string>) => {\n const cert = await kontext.generateComplianceCertificate({\n agentId: params['agentId'] ?? 'mcp',\n includeReasoning: true,\n });\n return { content: [{ type: 'text', text: JSON.stringify(cert, null, 2) }] };\n },\n );\n\n // Tool: verify_audit_trail\n server.tool(\n 'verify_audit_trail',\n 'Verify the integrity of the tamper-evident digest chain',\n {},\n async () => {\n const verification = kontext.verifyDigestChain();\n const chain = kontext.exportDigestChain();\n const result = {\n valid: verification.valid,\n chainLength: chain.links.length,\n terminalDigest: chain.terminalDigest,\n };\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","// ============================================================================\n// kontext CLI — compliance audit trail for AI agent stablecoin payments\n// ============================================================================\n\nimport type { Token } from './types.js';\n\nconst VERSION = '0.6.0';\nconst VALID_TOKENS = ['USDC', 'USDT', 'DAI', 'EURC', 'USDP', 'USDG'];\n\n// ---------------------------------------------------------------------------\n// Argument parser (zero deps)\n// ---------------------------------------------------------------------------\n\nfunction parseArgs(argv: string[]): { command: string; positional: string[]; flags: Record<string, string | boolean> } {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n // Find the command (first non-flag argument)\n let command = '';\n let startIdx = 0;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg.startsWith('-')) {\n // Parse this flag before finding command\n const key = arg.startsWith('--') ? arg.slice(2) : arg.slice(1);\n const next = args[i + 1];\n if (next && !next.startsWith('-')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else {\n command = arg;\n startIdx = i + 1;\n break;\n }\n }\n\n for (let i = startIdx; i < args.length; i++) {\n const arg = args[i]!;\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next && !next.startsWith('--')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else if (arg.startsWith('-')) {\n const key = arg.slice(1);\n const next = args[i + 1];\n if (next && !next.startsWith('-')) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else {\n positional.push(arg);\n }\n }\n\n return { command, positional, flags };\n}\n\nfunction flag(flags: Record<string, string | boolean>, key: string, alias?: string): string | undefined {\n const val = flags[key] ?? (alias ? flags[alias] : undefined);\n if (typeof val === 'string') return val;\n return undefined;\n}\n\nfunction boolFlag(flags: Record<string, string | boolean>, key: string): boolean {\n return flags[key] === true || flags[key] === 'true';\n}\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nfunction printHelp(): void {\n process.stdout.write(`kontext v${VERSION} — compliance audit trail for AI agent stablecoin payments\n\nUsage: kontext <command> [options]\n\nCommands:\n check <addr> [<to>] Stateless OFAC + threshold compliance check\n verify Log transaction + compliance check + digest proof\n reason <text> Log agent reasoning into digest chain\n cert Export compliance certificate\n audit Verify digest chain integrity\n sync [--full] Fetch latest OFAC SDN list from U.S. Treasury\n --full One-time: download entire SDN XML, parse ALL\n sanctioned entities + digital currency addresses\n mcp Start MCP server for Claude Code / Cursor / Windsurf\n\nGlobal flags:\n --json Output structured JSON\n --help, -h Show help\n --version, -v Show version\n\nExamples:\n npx kontext-sdk check 0xAddress --amount 5000 --token USDC\n npx kontext-sdk check 0xSender 0xReceiver --amount 5000 --token USDC\n npx kontext-sdk verify --tx 0xabc --amount 500 --token USDC --from 0xA --to 0xB --agent my-bot\n npx kontext-sdk reason \"Price within budget\" --agent my-bot --step 1\n npx kontext-sdk cert --agent my-bot --output cert.json\n npx kontext-sdk audit --verify\n npx kontext-sdk sync\n npx kontext-sdk mcp\n\nRegulatory responsibility remains with the operator.\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const { command, positional, flags } = parseArgs(process.argv);\n const json = boolFlag(flags, 'json');\n\n if (boolFlag(flags, 'version') || boolFlag(flags, 'v')) {\n process.stdout.write(`kontext v${VERSION}\\n`);\n return;\n }\n\n if (boolFlag(flags, 'help') || boolFlag(flags, 'h') || command === 'help' || command === '') {\n printHelp();\n return;\n }\n\n switch (command) {\n case 'check': {\n const from = positional[0];\n const to = positional[1];\n if (!from) {\n process.stderr.write('Usage: kontext check <address> [<to>] [--amount <number>] [--token <symbol>]\\n');\n process.exit(2);\n }\n const amount = flag(flags, 'amount') ?? '0';\n const token = (flag(flags, 'token') ?? 'USDC').toUpperCase();\n if (!VALID_TOKENS.includes(token)) {\n process.stderr.write(`Invalid token: ${token}. Must be one of: ${VALID_TOKENS.join(', ')}\\n`);\n process.exit(2);\n }\n const { runCheck } = await import('./commands/check.js');\n runCheck({ from, to, amount, token: token as Token, json });\n break;\n }\n\n case 'verify': {\n const tx = flag(flags, 'tx');\n const amount = flag(flags, 'amount');\n const from = flag(flags, 'from');\n const to = flag(flags, 'to');\n const agent = flag(flags, 'agent') ?? 'cli';\n const session = flag(flags, 'session');\n const token = (flag(flags, 'token') ?? 'USDC').toUpperCase();\n if (!tx || !amount || !from || !to) {\n process.stderr.write('Usage: kontext verify --tx <hash> --amount <number> --token <symbol> --from <addr> --to <addr> --agent <id>\\n');\n process.exit(2);\n }\n if (!VALID_TOKENS.includes(token)) {\n process.stderr.write(`Invalid token: ${token}. Must be one of: ${VALID_TOKENS.join(', ')}\\n`);\n process.exit(2);\n }\n const { runVerify } = await import('./commands/verify.js');\n await runVerify({ tx, amount, token: token as Token, from, to, agent, session, json });\n break;\n }\n\n case 'reason': {\n const text = positional[0];\n if (!text) {\n process.stderr.write('Usage: kontext reason \"<text>\" --agent <id> [--session <id>] [--step <n>]\\n');\n process.exit(2);\n }\n const agent = flag(flags, 'agent') ?? 'cli';\n const session = flag(flags, 'session');\n const stepStr = flag(flags, 'step');\n const step = stepStr !== undefined ? parseInt(stepStr, 10) : undefined;\n const { runReason } = await import('./commands/reason.js');\n await runReason({ text, agent, session, step, json });\n break;\n }\n\n case 'cert': {\n const agent = flag(flags, 'agent');\n if (!agent) {\n process.stderr.write('Usage: kontext cert --agent <id> [--output <file>]\\n');\n process.exit(2);\n }\n const output = flag(flags, 'output') ?? flag(flags, 'o');\n const { runCert } = await import('./commands/cert.js');\n await runCert({ agent, output, json });\n break;\n }\n\n case 'audit': {\n const { runAudit } = await import('./commands/audit.js');\n await runAudit({ json });\n break;\n }\n\n case 'sync': {\n const full = boolFlag(flags, 'full');\n const { runSync } = await import('./commands/sync.js');\n await runSync({ json, full });\n break;\n }\n\n case 'mcp': {\n const { runMcp } = await import('./commands/mcp.js');\n await runMcp();\n break;\n }\n\n default:\n process.stderr.write(`Unknown command: ${command}\\nRun 'kontext --help' for usage.\\n`);\n process.exit(2);\n }\n}\n\nmain().catch((err) => {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n"]}
|