kontext-sdk 0.2.0 → 0.2.1
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/dist/index.d.mts +90 -23
- package/dist/index.d.ts +90 -23
- package/dist/index.js +510 -284
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +510 -284
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/store.ts","../src/digest.ts","../src/utils.ts","../src/logger.ts","../src/tasks.ts","../src/audit.ts","../src/trust.ts","../src/anomaly.ts","../src/integrations/usdc.ts","../src/client.ts","../src/storage.ts","../src/integrations/cctp.ts","../src/integrations/circle-wallets.ts","../src/integrations/circle-compliance.ts","../src/integrations/gas-station.ts","../src/webhooks.ts","../src/integrations/vercel-ai.ts"],"names":["KontextErrorCode","createHash","path","fs","REPORTING_THRESHOLD","path2","fs2","relative","resolve"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\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';\n\n/** SDK operating mode */\nexport type KontextMode = 'local' | 'cloud';\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' | 'sar' | 'ctr';\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 (defaults to Kontext cloud API) */\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 /** Pluggable storage adapter for persistence (default: in-memory) */\n storage?: import('./storage.js').StorageAdapter;\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 /** 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 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 cryptocurrency transaction */\nexport interface LogTransactionInput {\n /** On-chain transaction hash */\n txHash: string;\n /** Blockchain network */\n chain: Chain;\n /** Transaction amount (string to preserve decimal precision) */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address */\n from: string;\n /** Recipient address */\n to: string;\n /** ID of the agent initiating the transaction */\n agentId: string;\n /** Optional correlation ID */\n correlationId?: string;\n /** Additional transaction metadata */\n metadata?: Record<string, unknown>;\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}\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// SAR/CTR Report Templates\n// ============================================================================\n\n/** Subject information for SAR/CTR reports */\nexport interface ReportSubject {\n /** Subject name or identifier */\n name: string;\n /** Agent ID (if applicable) */\n agentId?: string;\n /** Wallet addresses associated with the subject */\n addresses: string[];\n /** Additional identifying information */\n identifiers?: Record<string, string>;\n}\n\n/** Suspicious Activity Report template */\nexport interface SARReport {\n /** Report ID */\n id: string;\n /** Report type discriminator */\n type: 'sar';\n /** Generation timestamp */\n generatedAt: string;\n /** Reporting period */\n period: DateRange;\n /** Project ID */\n projectId: string;\n /** Filing institution information */\n filingInstitution: string;\n /** Subject(s) of the report */\n subjects: ReportSubject[];\n /** Narrative summary of suspicious activity */\n narrative: string;\n /** Suspicious activity categories */\n activityCategories: string[];\n /** Total amount involved */\n totalAmount: string;\n /** Currency/token */\n currency: string;\n /** Transactions flagged as suspicious */\n suspiciousTransactions: TransactionRecord[];\n /** Related anomalies */\n anomalies: AnomalyEvent[];\n /** Supporting action logs */\n supportingActions: ActionLog[];\n /** Whether this is a continuing activity report */\n isContinuingActivity: boolean;\n /** Prior report ID if continuing */\n priorReportId: string | null;\n /** Status of the report */\n status: 'draft' | 'review' | 'filed';\n}\n\n/** Currency Transaction Report template */\nexport interface CTRReport {\n /** Report ID */\n id: string;\n /** Report type discriminator */\n type: 'ctr';\n /** Generation timestamp */\n generatedAt: string;\n /** Reporting period */\n period: DateRange;\n /** Project ID */\n projectId: string;\n /** Filing institution information */\n filingInstitution: string;\n /** Person/entity conducting the transactions */\n conductors: ReportSubject[];\n /** Transactions included in the report */\n transactions: TransactionRecord[];\n /** Total cash-in amount */\n totalCashIn: string;\n /** Total cash-out amount */\n totalCashOut: string;\n /** Currency/token */\n currency: string;\n /** Whether multiple transactions are aggregated */\n isAggregated: boolean;\n /** Chains involved */\n chainsInvolved: Chain[];\n /** Supporting action logs */\n supportingActions: ActionLog[];\n /** Status of the report */\n status: 'draft' | 'review' | 'filed';\n}\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 */\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// Anomaly Detection\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/** 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 event callback */\nexport type AnomalyCallback = (anomaly: AnomalyEvent) => void;\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// Agent Reasoning\n// ============================================================================\n\n/** Input for logging agent reasoning */\nexport interface LogReasoningInput {\n /** ID of the agent making the decision */\n agentId: string;\n /** What action was taken or is being considered */\n action: string;\n /** The agent's reasoning/justification */\n reasoning: string;\n /** Optional confidence score (0-1) */\n confidence?: number;\n /** Optional additional context */\n context?: Record<string, unknown>;\n}\n\n/** A reasoning entry stored in the action log */\nexport interface ReasoningEntry {\n /** Unique reasoning entry identifier */\n id: string;\n /** Timestamp of the reasoning entry */\n timestamp: string;\n /** ID of the agent making the decision */\n agentId: string;\n /** What action was taken or is being considered */\n action: string;\n /** The agent's reasoning/justification */\n reasoning: string;\n /** Confidence score (0-1), defaults to 1.0 */\n confidence: number;\n /** Additional context */\n context: Record<string, unknown>;\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 verification */\n signature: string;\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}\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 - 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/** 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\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 await Promise.all([\n this.storageAdapter.save(STORAGE_KEYS.actions, this.actions),\n this.storageAdapter.save(STORAGE_KEYS.transactions, this.transactions),\n this.storageAdapter.save(\n STORAGE_KEYS.tasks,\n Array.from(this.tasks.entries()),\n ),\n this.storageAdapter.save(STORAGE_KEYS.anomalies, this.anomalies),\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. */\n addAction(action: ActionLog): void {\n this.actions.push(action);\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 // --------------------------------------------------------------------------\n // Transactions\n // --------------------------------------------------------------------------\n\n /** Append a transaction record. */\n addTransaction(tx: TransactionRecord): void {\n this.transactions.push(tx);\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. */\n addAnomaly(anomaly: AnomalyEvent): void {\n this.anomalies.push(anomaly);\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 * 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 microseconds = Number((hrtime - this.hrtimeBase) % 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 - 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 - Action Logger\n// ============================================================================\n\nimport type {\n ActionLog,\n TransactionRecord,\n LogActionInput,\n LogTransactionInput,\n KontextConfig,\n Chain,\n Token,\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/**\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\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\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 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 if (this.config.debug) {\n this.debugLog('Action logged', action);\n }\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 record: TransactionRecord = {\n id: generateId(),\n timestamp: now(),\n projectId: this.config.projectId,\n agentId: input.agentId,\n correlationId,\n type: 'transaction',\n description: `${input.token} transfer of ${input.amount} on ${input.chain}`,\n metadata: {\n ...input.metadata,\n },\n txHash: input.txHash,\n chain: input.chain,\n amount: input.amount,\n token: input.token,\n from: input.from,\n to: input.to,\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 if (this.config.debug) {\n this.debugLog('Transaction logged', record);\n }\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 // 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.txHash || input.txHash.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Transaction hash is required',\n { field: 'txHash' },\n );\n }\n\n if (!input.from || input.from.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Sender address (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 address (to) is required',\n { field: 'to' },\n );\n }\n\n const validChains: Chain[] = ['ethereum', 'base', 'polygon', 'arbitrum', 'optimism', 'arc', 'avalanche', 'solana'];\n if (!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'];\n if (!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 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 if (this.config.debug) {\n this.debugLog('Failed to write log file', { error });\n }\n }\n }\n\n private async flushToApi(actions: ActionLog[]): Promise<void> {\n const apiUrl = this.config.apiUrl ?? 'https://kontext-api-421314897784.us-central1.run.app';\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 if (this.config.debug) {\n this.debugLog('API flush failed, falling back to local file', { error });\n }\n this.flushToFile(actions);\n }\n }\n\n private debugLog(message: string, data?: unknown): void {\n const timestamp = now();\n console.debug(`[Kontext ${timestamp}] ${message}`, data ? JSON.stringify(data, null, 2) : '');\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): 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 SARReport,\n CTRReport,\n ReportSubject,\n DateRange,\n Chain,\n} from './types.js';\nimport { KontextError, KontextErrorCode } from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now, isWithinDateRange, toCsv, parseAmount } 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 = {\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 // SAR Report Generation\n // --------------------------------------------------------------------------\n\n /**\n * Generate a Suspicious Activity Report (SAR) template.\n *\n * This produces a structured SAR template populated with data from the SDK.\n * It is a template/structure, not an actual regulatory filing. Organizations\n * should review and supplement this data before formal submission.\n *\n * @param options - Report configuration including period and optional filters\n * @returns SARReport template populated with flagged transactions and anomalies\n *\n * @example\n * ```typescript\n * const sar = await exporter.generateSARReport({\n * type: 'sar',\n * period: { start: new Date('2026-01-01'), end: new Date() },\n * });\n * console.log(`SAR contains ${sar.suspiciousTransactions.length} flagged transactions`);\n * ```\n */\n async generateSARReport(options: ReportOptions): Promise<SARReport> {\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 anomalies = this.filterAnomalies(exportOptions);\n\n // Identify suspicious transactions: those with associated anomalies\n const anomalyActionIds = new Set(anomalies.map((a) => a.actionId));\n const suspiciousTransactions = transactions.filter(\n (tx) => anomalyActionIds.has(tx.id),\n );\n\n // If no directly linked suspicious transactions, include transactions\n // associated with agents who have anomalies\n const anomalyAgentIds = new Set(anomalies.map((a) => a.agentId));\n const additionalSuspicious = suspiciousTransactions.length === 0\n ? transactions.filter((tx) => anomalyAgentIds.has(tx.agentId))\n : [];\n\n const allSuspicious = [...suspiciousTransactions, ...additionalSuspicious];\n\n // Build subjects from agents involved in suspicious activity\n const subjectMap = new Map<string, ReportSubject>();\n for (const tx of allSuspicious) {\n if (!subjectMap.has(tx.agentId)) {\n const agentTxs = transactions.filter((t) => t.agentId === tx.agentId);\n const addresses = new Set<string>();\n for (const t of agentTxs) {\n addresses.add(t.from);\n addresses.add(t.to);\n }\n subjectMap.set(tx.agentId, {\n name: tx.agentId,\n agentId: tx.agentId,\n addresses: Array.from(addresses),\n });\n }\n }\n\n // Compute total amount involved\n const totalAmount = allSuspicious\n .reduce((sum, tx) => sum + (parseAmount(tx.amount) || 0), 0)\n .toFixed(2);\n\n // Determine primary token\n const tokenCounts = new Map<string, number>();\n for (const tx of allSuspicious) {\n tokenCounts.set(tx.token, (tokenCounts.get(tx.token) ?? 0) + 1);\n }\n const currency = tokenCounts.size > 0\n ? Array.from(tokenCounts.entries()).sort((a, b) => b[1] - a[1])[0]![0]\n : 'USDC';\n\n // Build activity categories from anomaly types\n const activityCategories = Array.from(\n new Set(anomalies.map((a) => this.anomalyTypeToCategory(a.type))),\n );\n\n // Generate narrative\n const narrative = this.generateSARNarrative(\n allSuspicious,\n anomalies,\n options.period,\n );\n\n return {\n id: generateId(),\n type: 'sar',\n generatedAt: now(),\n period: options.period,\n projectId: this.config.projectId,\n filingInstitution: this.config.projectId,\n subjects: Array.from(subjectMap.values()),\n narrative,\n activityCategories,\n totalAmount,\n currency,\n suspiciousTransactions: allSuspicious,\n anomalies,\n supportingActions: actions.filter((a) =>\n anomalyAgentIds.has(a.agentId),\n ),\n isContinuingActivity: false,\n priorReportId: null,\n status: 'draft',\n };\n }\n\n // --------------------------------------------------------------------------\n // CTR Report Generation\n // --------------------------------------------------------------------------\n\n /**\n * Generate a Currency Transaction Report (CTR) template.\n *\n * This produces a structured CTR template for transactions that meet or\n * exceed reporting thresholds. It is a template/structure, not an actual\n * regulatory filing. Organizations should review and supplement this data\n * before formal submission.\n *\n * @param options - Report configuration including period and optional filters\n * @returns CTRReport template populated with qualifying transactions\n *\n * @example\n * ```typescript\n * const ctr = await exporter.generateCTRReport({\n * type: 'ctr',\n * period: { start: new Date('2026-01-01'), end: new Date() },\n * });\n * console.log(`CTR covers ${ctr.transactions.length} reportable transactions`);\n * ```\n */\n async generateCTRReport(options: ReportOptions): Promise<CTRReport> {\n const REPORTING_THRESHOLD = 10000;\n\n const exportOptions: ExportOptions = {\n format: 'json',\n dateRange: options.period,\n agentIds: options.agentIds,\n includeTasks: false,\n includeAnomalies: false,\n };\n\n const actions = this.filterActions(exportOptions);\n const transactions = this.filterTransactions(exportOptions);\n\n // Filter transactions at or above the reporting threshold\n const reportableTransactions = transactions.filter((tx) => {\n const amount = parseAmount(tx.amount);\n return !isNaN(amount) && amount >= REPORTING_THRESHOLD;\n });\n\n // Also include aggregated transactions from the same agent/day that\n // together exceed the threshold (structuring detection)\n const agentDailyTotals = new Map<string, number>();\n for (const tx of transactions) {\n const day = tx.timestamp.split('T')[0];\n const key = `${tx.agentId}:${day}`;\n agentDailyTotals.set(key, (agentDailyTotals.get(key) ?? 0) + (parseAmount(tx.amount) || 0));\n }\n\n // Find agents with daily totals above threshold who have individual\n // transactions below threshold (potential structuring)\n const structuringKeys = new Set<string>();\n for (const [key, total] of agentDailyTotals.entries()) {\n if (total >= REPORTING_THRESHOLD) {\n structuringKeys.add(key);\n }\n }\n\n const reportableIds = new Set(reportableTransactions.map((tx) => tx.id));\n const additionalStructuring = transactions.filter((tx) => {\n if (reportableIds.has(tx.id)) return false;\n const day = tx.timestamp.split('T')[0];\n const key = `${tx.agentId}:${day}`;\n return structuringKeys.has(key);\n });\n\n const allReportable = [...reportableTransactions, ...additionalStructuring];\n const isAggregated = additionalStructuring.length > 0;\n\n // Build conductors\n const conductorMap = new Map<string, ReportSubject>();\n for (const tx of allReportable) {\n if (!conductorMap.has(tx.agentId)) {\n const agentTxs = allReportable.filter((t) => t.agentId === tx.agentId);\n const addresses = new Set<string>();\n for (const t of agentTxs) {\n addresses.add(t.from);\n addresses.add(t.to);\n }\n conductorMap.set(tx.agentId, {\n name: tx.agentId,\n agentId: tx.agentId,\n addresses: Array.from(addresses),\n });\n }\n }\n\n // Compute totals\n let cashIn = 0;\n let cashOut = 0;\n for (const tx of allReportable) {\n const amount = parseAmount(tx.amount) || 0;\n cashOut += amount; // Transfers out from the agent's perspective\n cashIn += amount; // Received on the other end\n }\n\n // Collect chains\n const chainsInvolved = Array.from(\n new Set(allReportable.map((tx) => tx.chain)),\n ) as Chain[];\n\n // Determine primary currency\n const tokenCounts = new Map<string, number>();\n for (const tx of allReportable) {\n tokenCounts.set(tx.token, (tokenCounts.get(tx.token) ?? 0) + 1);\n }\n const currency = tokenCounts.size > 0\n ? Array.from(tokenCounts.entries()).sort((a, b) => b[1] - a[1])[0]![0]\n : 'USDC';\n\n return {\n id: generateId(),\n type: 'ctr',\n generatedAt: now(),\n period: options.period,\n projectId: this.config.projectId,\n filingInstitution: this.config.projectId,\n conductors: Array.from(conductorMap.values()),\n transactions: allReportable,\n totalCashIn: cashIn.toFixed(2),\n totalCashOut: cashOut.toFixed(2),\n currency,\n isAggregated,\n chainsInvolved,\n supportingActions: actions.filter((a) =>\n conductorMap.has(a.agentId),\n ),\n status: 'draft',\n };\n }\n\n // --------------------------------------------------------------------------\n // SAR/CTR helpers\n // --------------------------------------------------------------------------\n\n private anomalyTypeToCategory(type: string): string {\n const mapping: Record<string, string> = {\n unusualAmount: 'Unusual transaction amount',\n frequencySpike: 'Unusually high transaction frequency',\n newDestination: 'Transactions to unknown destinations',\n offHoursActivity: 'Activity during unusual hours',\n rapidSuccession: 'Rapid succession of transactions',\n roundAmount: 'Potential structuring (round amounts)',\n };\n return mapping[type] ?? `Other: ${type}`;\n }\n\n private generateSARNarrative(\n transactions: TransactionRecord[],\n anomalies: AnomalyEvent[],\n period: DateRange,\n ): string {\n const startDate = period.start.toISOString().split('T')[0];\n const endDate = period.end.toISOString().split('T')[0];\n\n const parts: string[] = [];\n\n parts.push(\n `During the period from ${startDate} to ${endDate}, ` +\n `${transactions.length} transaction(s) were identified as potentially suspicious.`,\n );\n\n if (anomalies.length > 0) {\n const typeCounts = new Map<string, number>();\n for (const a of anomalies) {\n typeCounts.set(a.type, (typeCounts.get(a.type) ?? 0) + 1);\n }\n const typeDesc = Array.from(typeCounts.entries())\n .map(([type, count]) => `${this.anomalyTypeToCategory(type)} (${count} occurrence(s))`)\n .join('; ');\n\n parts.push(`Anomaly detection identified the following patterns: ${typeDesc}.`);\n }\n\n const totalAmount = transactions\n .reduce((sum, tx) => sum + (parseAmount(tx.amount) || 0), 0)\n .toFixed(2);\n parts.push(`Total amount involved: ${totalAmount}.`);\n\n const agents = new Set(transactions.map((t) => t.agentId));\n parts.push(`Agent(s) involved: ${Array.from(agents).join(', ')}.`);\n\n parts.push(\n 'This report is generated as a template for review. ' +\n 'Additional investigation and supporting documentation should be attached before filing.',\n );\n\n return parts.join(' ');\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 && !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 - Trust Scoring\n// ============================================================================\n\nimport type {\n TrustScore,\n TrustFactor,\n TransactionEvaluation,\n RiskFactor,\n LogTransactionInput,\n KontextConfig,\n} from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now, parseAmount, clamp } from './utils.js';\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 >= 60;\n const recommendation = riskScore >= 80 ? 'block' as const\n : riskScore >= 50 ? 'review' as const\n : 'approve' as const;\n\n return {\n 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 const factors: TrustFactor[] = [];\n\n // Factor 1: History depth\n factors.push(this.computeHistoryDepthFactor(agentId));\n\n // Factor 2: Task completion rate\n factors.push(this.computeTaskCompletionFactor(agentId));\n\n // Factor 3: Anomaly frequency\n factors.push(this.computeAnomalyFrequencyFactor(agentId));\n\n // Factor 4: Transaction consistency\n factors.push(this.computeTransactionConsistencyFactor(agentId));\n\n // Factor 5: Compliance adherence\n factors.push(this.computeComplianceAdherenceFactor(agentId));\n\n return factors;\n }\n\n private computeHistoryDepthFactor(agentId: string): TrustFactor {\n const actions = this.store.getActionsByAgent(agentId);\n const count = actions.length;\n\n // More history = more trust. Max score at 100+ actions.\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: 0.15,\n description: `Agent has ${count} recorded actions`,\n };\n }\n\n private computeTaskCompletionFactor(agentId: string): TrustFactor {\n const tasks = this.store.queryTasks((t) => t.agentId === agentId);\n const totalTasks = tasks.length;\n\n if (totalTasks === 0) {\n return {\n name: 'task_completion',\n score: 50, // Neutral if no tasks\n weight: 0.25,\n description: 'No tasks recorded yet',\n };\n }\n\n const confirmed = tasks.filter((t) => t.status === 'confirmed').length;\n const failed = 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: 0.25,\n description: `${confirmed}/${totalTasks} tasks confirmed (${Math.round(completionRate * 100)}% rate)`,\n };\n }\n\n private computeAnomalyFrequencyFactor(agentId: string): TrustFactor {\n const anomalies = this.store.queryAnomalies((a) => a.agentId === agentId);\n const actions = this.store.getActionsByAgent(agentId);\n const anomalyCount = anomalies.length;\n const actionCount = actions.length;\n\n if (actionCount === 0) {\n return {\n name: 'anomaly_frequency',\n score: 50,\n weight: 0.25,\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 = anomalies.filter((a) => a.severity === 'critical').length;\n const highCount = 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: 0.25,\n description: `${anomalyCount} anomalies across ${actionCount} actions (${Math.round(anomalyRate * 100)}% rate)`,\n };\n }\n\n private computeTransactionConsistencyFactor(agentId: string): TrustFactor {\n const transactions = this.store.getTransactionsByAgent(agentId);\n\n if (transactions.length < 2) {\n return {\n name: 'transaction_consistency',\n score: 50,\n weight: 0.20,\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: 0.20,\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: 0.20,\n description: `CV=${cv.toFixed(2)}, ${destinations.size} unique destinations across ${transactions.length} transactions`,\n };\n }\n\n private computeComplianceAdherenceFactor(agentId: string): TrustFactor {\n const tasks = this.store.queryTasks((t) => t.agentId === agentId);\n const transactions = this.store.getTransactionsByAgent(agentId);\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: 0.15,\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 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}`,\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 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 >= 90) return 'verified';\n if (score >= 70) return 'high';\n if (score >= 50) return 'medium';\n if (score >= 30) return 'low';\n return 'untrusted';\n }\n\n private riskScoreToLevel(score: number): TransactionEvaluation['riskLevel'] {\n if (score >= 80) return 'critical';\n if (score >= 60) return 'high';\n if (score >= 35) return 'medium';\n return 'low';\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} exceeds threshold of ${this.thresholds.maxAmount}`,\n tx.agentId,\n tx.id,\n { amount: tx.amount, threshold: this.thresholds.maxAmount, token: tx.token },\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 if (this.config.debug) {\n console.debug('[Kontext] Anomaly callback error:', error);\n }\n }\n }\n }\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';\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: sourced from publicly known sanctions as of 2024.\n\n/** OFAC-sanctioned Ethereum addresses from the Treasury SDN list */\nconst SANCTIONED_ADDRESSES: string[] = [\n // Tornado Cash contracts (sanctioned August 2022)\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\n // Lazarus Group / North Korea (Ronin Bridge hack)\n '0x098B716B8Aaf21512996dC57EB0615e2383E2f96',\n '0xa0e1c89Ef1a489c9C7dE96311eD5Ce5D32c20E4B',\n '0x3Cffd56B47B7b41c56258D9C7731ABaDc360E460',\n '0x53b6936513e738f44FB50d2b9476730C0Ab3Bfc1',\n // Garantex exchange (sanctioned April 2022)\n '0x6F1cA141A28907F78Ebaa64f83E4AE6038d3cbe7',\n // Blender.io\n '0x23773E65ed146A459791799d01336DB287f25334',\n];\n\n/**\n * Pre-computed set of lowercased sanctioned addresses for O(1) lookups.\n */\nconst SANCTIONED_SET: Set<string> = new Set(\n SANCTIONED_ADDRESSES.map((addr) => addr.toLowerCase()),\n);\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 // 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 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 TrustScore,\n TransactionEvaluation,\n AnomalyDetectionConfig,\n AnomalyCallback,\n AnomalyEvent,\n UsdcComplianceCheck,\n SARReport,\n CTRReport,\n LogReasoningInput,\n ReasoningEntry,\n GenerateComplianceCertificateInput,\n ComplianceCertificate,\n} from './types.js';\nimport type { DigestVerification, DigestLink } from './digest.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 { TrustScorer } from './trust.js';\nimport { AnomalyDetector } from './anomaly.js';\nimport { UsdcCompliance } from './integrations/usdc.js';\nimport { createHash } from 'crypto';\nimport { generateId, now } from './utils.js';\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 trustScorer: TrustScorer;\n private readonly anomalyDetector: AnomalyDetector;\n private readonly mode: KontextMode;\n\n private constructor(config: KontextConfig) {\n this.config = config;\n this.mode = config.apiKey ? 'cloud' : 'local';\n this.store = new KontextStore();\n\n // Attach storage adapter if provided\n if (config.storage) {\n this.store.setStorageAdapter(config.storage);\n }\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\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 // 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 const action = await this.logger.log(input);\n\n // Run anomaly detection if enabled\n if (this.anomalyDetector.isEnabled()) {\n this.anomalyDetector.evaluateAction(action);\n }\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 const record = await this.logger.logTransaction(input);\n\n // Run anomaly detection if enabled\n if (this.anomalyDetector.isEnabled()) {\n this.anomalyDetector.evaluateTransaction(record);\n }\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 }\n\n /**\n * Restore state from the attached storage adapter.\n * Loads previously persisted actions, transactions, tasks, and anomalies.\n * No-op if no storage adapter is configured.\n */\n async restore(): Promise<void> {\n await this.store.restore();\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 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 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 * Generate a Suspicious Activity Report (SAR) template.\n *\n * This produces a structured SAR template populated with data from the SDK.\n * It is a template/structure, not an actual regulatory filing.\n *\n * @param options - Report configuration\n * @returns SAR report template\n */\n async generateSARReport(options: ReportOptions): Promise<SARReport> {\n return this.auditExporter.generateSARReport(options);\n }\n\n /**\n * Generate a Currency Transaction Report (CTR) template.\n *\n * This produces a structured CTR template for transactions that meet or\n * exceed reporting thresholds. It is a template/structure, not an actual\n * regulatory filing.\n *\n * @param options - Report configuration\n * @returns CTR report template\n */\n async generateCTRReport(options: ReportOptions): Promise<CTRReport> {\n return this.auditExporter.generateCTRReport(options);\n }\n\n // --------------------------------------------------------------------------\n // Trust Scoring\n // --------------------------------------------------------------------------\n\n /**\n * Get the trust score for an agent.\n *\n * @param agentId - Agent identifier\n * @returns Trust score with factor breakdown\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.\n *\n * @param tx - Transaction to evaluate\n * @returns Transaction evaluation with risk score and recommendation\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 * @param config - Detection configuration\n */\n enableAnomalyDetection(config: AnomalyDetectionConfig): void {\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 // 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 // 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 // Agent Reasoning\n // --------------------------------------------------------------------------\n\n /**\n * Log an agent's reasoning/justification for an action.\n * The reasoning entry is recorded into the digest chain as a tamper-evident\n * part of the audit trail (type: 'reasoning').\n *\n * @param input - Reasoning details\n * @returns The created reasoning entry\n *\n * @example\n * ```typescript\n * const entry = await kontext.logReasoning({\n * agentId: 'payment-agent-1',\n * action: 'approve_transfer',\n * reasoning: 'Recipient is a verified vendor with 50+ prior transactions',\n * confidence: 0.95,\n * context: { recipientId: 'vendor-42' },\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\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\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\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 reasoningEntry: ReasoningEntry = {\n id: generateId(),\n timestamp: now(),\n agentId: input.agentId,\n action: input.action,\n reasoning: input.reasoning,\n confidence: input.confidence ?? 1.0,\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: `Reasoning for ${input.action}: ${input.reasoning}`,\n agentId: input.agentId,\n metadata: {\n reasoningId: reasoningEntry.id,\n action: input.action,\n reasoning: input.reasoning,\n confidence: reasoningEntry.confidence,\n context: reasoningEntry.context,\n },\n });\n\n return reasoningEntry;\n }\n\n /**\n * Get all reasoning entries for a specific agent.\n *\n * @param agentId - Agent identifier\n * @returns Array of reasoning entries\n */\n getReasoningEntries(agentId: string): ReasoningEntry[] {\n const reasoningActions = this.store.queryActions(\n (a) => a.agentId === agentId && a.type === 'reasoning',\n );\n\n return reasoningActions.map((action) => ({\n id: action.metadata['reasoningId'] as string,\n timestamp: action.timestamp,\n agentId: action.agentId,\n action: action.metadata['action'] as string,\n reasoning: action.metadata['reasoning'] as string,\n confidence: action.metadata['confidence'] as number,\n context: (action.metadata['context'] as Record<string, unknown>) ?? {},\n }));\n }\n\n // --------------------------------------------------------------------------\n // Compliance Certificates\n // --------------------------------------------------------------------------\n\n /**\n * Generate a compliance certificate that summarizes agent actions and\n * verifies the terminal digest.\n *\n * @param input - Certificate generation options\n * @returns A compliance certificate with digest chain verification\n *\n * @example\n * ```typescript\n * const cert = await kontext.generateComplianceCertificate({\n * agentId: 'payment-agent-1',\n * includeReasoning: true,\n * });\n * console.log(cert.complianceStatus); // 'compliant'\n * console.log(cert.digestChain.verified); // true\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 // Count transactions\n const transactions = agentActions.filter((a) => a.type === 'transaction');\n\n // Count tool calls\n const toolCalls = agentActions.filter((a) => a.type === 'tool_call');\n\n // Count reasoning entries\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]) => ({\n type,\n count,\n }));\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 const anomalies = this.store.queryAnomalies((a) => a.agentId === agentId);\n let filteredAnomalies = anomalies;\n if (timeRange) {\n const from = timeRange.from.getTime();\n const to = timeRange.to.getTime();\n filteredAnomalies = anomalies.filter((a) => {\n const ts = new Date(a.detectedAt).getTime();\n return ts >= from && ts <= to;\n });\n }\n\n let complianceStatus: ComplianceCertificate['complianceStatus'];\n const criticalAnomalies = filteredAnomalies.filter((a) => a.severity === 'critical');\n const highAnomalies = filteredAnomalies.filter((a) => a.severity === 'high');\n\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: action.metadata['action'] as string,\n reasoning: action.metadata['reasoning'] as string,\n confidence: action.metadata['confidence'] as number,\n context: (action.metadata['context'] as Record<string, unknown>) ?? {},\n }));\n }\n\n // Build the certificate content (before signature)\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 signature of the certificate content\n const hash = createHash('sha256');\n hash.update(JSON.stringify(certificateContent));\n const signature = hash.digest('hex');\n\n return {\n ...certificateContent,\n signature,\n };\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 }\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 SDK - CCTP (Cross-Chain Transfer Protocol) Integration\n// ============================================================================\n// Supports both CCTP V1 and V2 features:\n// - V1: Standard burn-and-mint with attestation (minutes)\n// - V2: Fast transfers (sub-minute), hooks for post-transfer automation,\n// and expanded domain support\n\nimport type {\n Chain,\n Token,\n LogTransactionInput,\n AnomalySeverity,\n} from '../types.js';\nimport { generateId, now, parseAmount } from '../utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Supported CCTP domain identifiers for each chain (V2 expanded) */\nconst CCTP_DOMAINS: Record<string, number> = {\n ethereum: 0,\n arbitrum: 3,\n optimism: 2,\n base: 6,\n polygon: 7,\n // Arc (Circle's stablecoin-native blockchain) -- placeholder domain ID, update when Arc mainnet launches\n arc: 10,\n // CCTP V2 expanded domains\n avalanche: 1,\n solana: 5,\n};\n\n/** CCTP V2 fast-transfer eligible routes */\nconst FAST_TRANSFER_ROUTES: Set<string> = new Set([\n 'ethereum->base',\n 'base->ethereum',\n 'ethereum->arbitrum',\n 'arbitrum->ethereum',\n 'ethereum->optimism',\n 'optimism->ethereum',\n 'ethereum->polygon',\n 'polygon->ethereum',\n 'base->arbitrum',\n 'arbitrum->base',\n 'base->optimism',\n 'optimism->base',\n 'base->polygon',\n 'polygon->base',\n 'ethereum->avalanche',\n 'avalanche->ethereum',\n]);\n\n/** CCTP protocol version */\nexport type CCTPVersion = 'v1' | 'v2';\n\n/** CCTP message status */\nexport type CCTPMessageStatus =\n | 'pending'\n | 'attested'\n | 'confirmed'\n | 'failed';\n\n/** CCTP V2 hook definition for post-transfer automation */\nexport interface CCTPHook {\n /** Target contract address on the destination chain */\n targetContract: string;\n /** Encoded function call data */\n callData: string;\n /** Maximum gas for hook execution */\n gasLimit: number;\n /** Human-readable description of the hook */\n description?: string;\n}\n\n/** Input for initiating a CCTP V2 fast transfer */\nexport interface InitiateFastTransferInput {\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destinationChain: Chain;\n /** Transfer amount */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address */\n sender: string;\n /** Recipient address */\n recipient: string;\n /** Source chain transaction hash */\n sourceTxHash: string;\n /** Agent initiating the transfer */\n agentId: string;\n /** Maximum finality time the sender will accept (seconds) */\n maxFinalitySeconds?: number;\n /** Optional hooks to execute after transfer completes */\n hooks?: CCTPHook[];\n /** Optional nonce */\n nonce?: number;\n /** Optional correlation ID */\n correlationId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** A cross-chain transfer record */\nexport interface CrossChainTransfer {\n /** Unique transfer identifier */\n id: string;\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destinationChain: Chain;\n /** CCTP domain ID for source */\n sourceDomain: number;\n /** CCTP domain ID for destination */\n destinationDomain: number;\n /** Transfer amount (string to preserve precision) */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address on source chain */\n sender: string;\n /** Recipient address on destination chain */\n recipient: string;\n /** Source chain transaction hash */\n sourceTxHash: string;\n /** Destination chain transaction hash (set after confirmation) */\n destinationTxHash: string | null;\n /** CCTP message hash for attestation tracking */\n messageHash: string | null;\n /** Current status of the transfer */\n status: CCTPMessageStatus;\n /** Nonce from the CCTP MessageSent event */\n nonce: number | null;\n /** Timestamp when the transfer was initiated */\n initiatedAt: string;\n /** Timestamp when attestation was received */\n attestedAt: string | null;\n /** Timestamp when the transfer was confirmed on destination */\n confirmedAt: string | null;\n /** Correlation ID linking source and destination actions */\n correlationId: string;\n /** Agent that initiated the transfer */\n agentId: string;\n /** Additional metadata */\n metadata: Record<string, unknown>;\n /** CCTP protocol version used */\n version?: CCTPVersion;\n /** Whether this is a fast transfer (V2) */\n isFastTransfer?: boolean;\n /** Post-transfer hooks (V2) */\n hooks?: CCTPHook[];\n /** Hook execution results (V2) */\n hookResults?: CCTPHookResult[];\n}\n\n/** Input for initiating a cross-chain transfer record */\nexport interface InitiateCCTPTransferInput {\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destinationChain: Chain;\n /** Transfer amount */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address */\n sender: string;\n /** Recipient address */\n recipient: string;\n /** Source chain transaction hash (from depositForBurn) */\n sourceTxHash: string;\n /** Agent initiating the transfer */\n agentId: string;\n /** Optional nonce from the MessageSent event */\n nonce?: number;\n /** Optional correlation ID */\n correlationId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for recording a CCTP attestation */\nexport interface CCTPAttestationInput {\n /** The cross-chain transfer ID */\n transferId: string;\n /** The message hash from the attestation service */\n messageHash: string;\n /** Optional attestation metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for confirming a cross-chain transfer on destination */\nexport interface ConfirmCCTPTransferInput {\n /** The cross-chain transfer ID */\n transferId: string;\n /** Destination chain transaction hash (from receiveMessage) */\n destinationTxHash: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Validation result for a cross-chain transfer */\nexport interface CCTPValidationResult {\n /** Whether the transfer configuration is valid */\n valid: boolean;\n /** Validation checks performed */\n checks: CCTPValidationCheck[];\n /** Overall risk level */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Recommendations */\n recommendations: string[];\n}\n\n/** Individual validation check */\nexport interface CCTPValidationCheck {\n /** Check name */\n name: string;\n /** Whether the check passed */\n passed: boolean;\n /** Description */\n description: string;\n /** Severity if failed */\n severity: AnomalySeverity;\n}\n\n/** Cross-chain audit trail entry */\nexport interface CrossChainAuditEntry {\n /** The transfer record */\n transfer: CrossChainTransfer;\n /** Source chain action log ID (from logTransaction) */\n sourceActionId: string | null;\n /** Destination chain action log ID (from logTransaction) */\n destinationActionId: string | null;\n /** Whether source and destination are linked */\n linked: boolean;\n /** Duration from initiation to confirmation in milliseconds */\n durationMs: number | null;\n}\n\n/** Result of a CCTP V2 hook execution */\nexport interface CCTPHookResult {\n /** Target contract address */\n targetContract: string;\n /** Whether the hook executed successfully */\n success: boolean;\n /** Transaction hash of the hook execution */\n transactionHash?: string;\n /** Error message if the hook failed */\n error?: string;\n /** Gas used by the hook */\n gasUsed?: number;\n}\n\n/** Validation result for a CCTP V2 fast transfer */\nexport interface FastTransferValidation {\n /** Whether the fast transfer route is supported */\n fastTransferAvailable: boolean;\n /** Estimated finality time in seconds */\n estimatedFinalitySeconds: number;\n /** Whether hooks are valid */\n hooksValid: boolean;\n /** Hook validation details */\n hookValidation: { index: number; valid: boolean; reason?: string }[];\n /** Standard validation result */\n standardValidation: CCTPValidationResult;\n}\n\n// ============================================================================\n// CCTP Transfer Manager\n// ============================================================================\n\n/**\n * CCTPTransferManager handles cross-chain transfer tracking and validation\n * for Circle's Cross-Chain Transfer Protocol.\n *\n * Provides:\n * - Transfer validation (source chain to destination chain)\n * - CCTP message attestation logging\n * - Cross-chain audit trail linking\n * - Transfer lifecycle tracking (pending -> attested -> confirmed)\n */\nexport class CCTPTransferManager {\n private transfers: Map<string, CrossChainTransfer> = new Map();\n private actionLinks: Map<string, { sourceActionId?: string; destinationActionId?: string }> = new Map();\n\n /**\n * Validate a cross-chain transfer before execution.\n *\n * Checks include:\n * - Source and destination chain support\n * - Route validity (different chains)\n * - Token support on both chains\n * - Amount validation\n * - Address format validation\n *\n * @param input - Transfer details to validate\n * @returns Validation result with checks and recommendations\n */\n validateTransfer(input: InitiateCCTPTransferInput): CCTPValidationResult {\n const checks: CCTPValidationCheck[] = [];\n\n // Check source chain CCTP support\n checks.push(this.checkChainSupport(input.sourceChain, 'source'));\n\n // Check destination chain CCTP support\n checks.push(this.checkChainSupport(input.destinationChain, 'destination'));\n\n // Check route validity (source !== destination)\n checks.push(this.checkRouteValidity(input.sourceChain, input.destinationChain));\n\n // Check token support\n checks.push(this.checkTokenSupport(input.token));\n\n // Check amount validity\n checks.push(this.checkAmountValidity(input.amount));\n\n // Check address formats\n checks.push(this.checkAddressFormat(input.sender, 'sender'));\n checks.push(this.checkAddressFormat(input.recipient, 'recipient'));\n\n const failedChecks = checks.filter((c) => !c.passed);\n const valid = failedChecks.length === 0;\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 = this.generateRecommendations(checks, input);\n\n return {\n valid,\n checks,\n riskLevel: valid ? 'low' : highestSeverity,\n recommendations,\n };\n }\n\n /**\n * Record a new cross-chain transfer initiated via CCTP depositForBurn.\n *\n * @param input - Transfer initiation details\n * @returns The created CrossChainTransfer record\n */\n initiateTransfer(input: InitiateCCTPTransferInput): CrossChainTransfer {\n const id = generateId();\n const correlationId = input.correlationId ?? generateId();\n\n const transfer: CrossChainTransfer = {\n id,\n sourceChain: input.sourceChain,\n destinationChain: input.destinationChain,\n sourceDomain: CCTP_DOMAINS[input.sourceChain] ?? -1,\n destinationDomain: CCTP_DOMAINS[input.destinationChain] ?? -1,\n amount: input.amount,\n token: input.token,\n sender: input.sender,\n recipient: input.recipient,\n sourceTxHash: input.sourceTxHash,\n destinationTxHash: null,\n messageHash: null,\n status: 'pending',\n nonce: input.nonce ?? null,\n initiatedAt: now(),\n attestedAt: null,\n confirmedAt: null,\n correlationId,\n agentId: input.agentId,\n metadata: input.metadata ?? {},\n };\n\n this.transfers.set(id, transfer);\n this.actionLinks.set(id, {});\n\n return transfer;\n }\n\n /**\n * Record a CCTP attestation for a pending transfer.\n * Called after the attestation service has signed the burn message.\n *\n * @param input - Attestation details\n * @returns The updated CrossChainTransfer record\n * @throws Error if transfer not found or not in pending status\n */\n recordAttestation(input: CCTPAttestationInput): CrossChainTransfer {\n const transfer = this.transfers.get(input.transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${input.transferId}`);\n }\n\n if (transfer.status !== 'pending') {\n throw new Error(\n `Transfer ${input.transferId} is not in pending status (current: ${transfer.status})`,\n );\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n messageHash: input.messageHash,\n status: 'attested',\n attestedAt: now(),\n metadata: {\n ...transfer.metadata,\n ...input.metadata,\n },\n };\n\n this.transfers.set(input.transferId, updated);\n\n return updated;\n }\n\n /**\n * Confirm a cross-chain transfer has been received on the destination chain.\n * Called after receiveMessage has been executed on the destination.\n *\n * @param input - Confirmation details\n * @returns The updated CrossChainTransfer record\n * @throws Error if transfer not found or not in attested status\n */\n confirmTransfer(input: ConfirmCCTPTransferInput): CrossChainTransfer {\n const transfer = this.transfers.get(input.transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${input.transferId}`);\n }\n\n if (transfer.status !== 'attested') {\n throw new Error(\n `Transfer ${input.transferId} is not in attested status (current: ${transfer.status})`,\n );\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n destinationTxHash: input.destinationTxHash,\n status: 'confirmed',\n confirmedAt: now(),\n metadata: {\n ...transfer.metadata,\n ...input.metadata,\n },\n };\n\n this.transfers.set(input.transferId, updated);\n\n return updated;\n }\n\n /**\n * Mark a transfer as failed.\n *\n * @param transferId - The transfer to mark as failed\n * @param reason - Reason for failure\n * @returns The updated CrossChainTransfer record\n */\n failTransfer(transferId: string, reason: string): CrossChainTransfer {\n const transfer = this.transfers.get(transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${transferId}`);\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n status: 'failed',\n metadata: {\n ...transfer.metadata,\n failureReason: reason,\n failedAt: now(),\n },\n };\n\n this.transfers.set(transferId, updated);\n\n return updated;\n }\n\n /**\n * Link a Kontext action log ID to a cross-chain transfer.\n * Used to correlate source and destination chain actions in the audit trail.\n *\n * @param transferId - The cross-chain transfer ID\n * @param actionId - The action log ID to link\n * @param side - Whether this is the source or destination action\n */\n linkAction(transferId: string, actionId: string, side: 'source' | 'destination'): void {\n const transfer = this.transfers.get(transferId);\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${transferId}`);\n }\n\n const links = this.actionLinks.get(transferId) ?? {};\n if (side === 'source') {\n links.sourceActionId = actionId;\n } else {\n links.destinationActionId = actionId;\n }\n this.actionLinks.set(transferId, links);\n }\n\n /**\n * Get a cross-chain transfer by ID.\n */\n getTransfer(transferId: string): CrossChainTransfer | undefined {\n return this.transfers.get(transferId);\n }\n\n /**\n * Get all cross-chain transfers, optionally filtered by status.\n */\n getTransfers(status?: CCTPMessageStatus): CrossChainTransfer[] {\n const all = Array.from(this.transfers.values());\n if (status) {\n return all.filter((t) => t.status === status);\n }\n return all;\n }\n\n /**\n * Get transfers by correlation ID.\n * Useful for finding all transfers related to a single workflow.\n */\n getTransfersByCorrelation(correlationId: string): CrossChainTransfer[] {\n return Array.from(this.transfers.values()).filter(\n (t) => t.correlationId === correlationId,\n );\n }\n\n /**\n * Build a cross-chain audit trail for a given transfer.\n * Links source and destination chain actions together.\n *\n * @param transferId - The transfer to build an audit trail for\n * @returns CrossChainAuditEntry with linked action references\n */\n getAuditEntry(transferId: string): CrossChainAuditEntry | undefined {\n const transfer = this.transfers.get(transferId);\n if (!transfer) return undefined;\n\n const links = this.actionLinks.get(transferId) ?? {};\n\n let durationMs: number | null = null;\n if (transfer.confirmedAt && transfer.initiatedAt) {\n durationMs =\n new Date(transfer.confirmedAt).getTime() -\n new Date(transfer.initiatedAt).getTime();\n }\n\n return {\n transfer,\n sourceActionId: links.sourceActionId ?? null,\n destinationActionId: links.destinationActionId ?? null,\n linked: !!(links.sourceActionId && links.destinationActionId),\n durationMs,\n };\n }\n\n /**\n * Build audit trail entries for all transfers, optionally filtered.\n *\n * @param agentId - Optional filter by agent\n * @returns Array of CrossChainAuditEntry records\n */\n getAuditTrail(agentId?: string): CrossChainAuditEntry[] {\n let transfers = Array.from(this.transfers.values());\n if (agentId) {\n transfers = transfers.filter((t) => t.agentId === agentId);\n }\n\n return transfers\n .map((t) => this.getAuditEntry(t.id))\n .filter((entry): entry is CrossChainAuditEntry => entry !== undefined);\n }\n\n // --------------------------------------------------------------------------\n // CCTP V2 Features\n // --------------------------------------------------------------------------\n\n /**\n * Validate a fast transfer request (CCTP V2).\n * Checks route eligibility, hook validity, and standard validation.\n *\n * @param input - Fast transfer details\n * @returns FastTransferValidation with availability and hook checks\n */\n validateFastTransfer(input: InitiateFastTransferInput): FastTransferValidation {\n const standardInput: InitiateCCTPTransferInput = {\n sourceChain: input.sourceChain,\n destinationChain: input.destinationChain,\n amount: input.amount,\n token: input.token,\n sender: input.sender,\n recipient: input.recipient,\n sourceTxHash: input.sourceTxHash,\n agentId: input.agentId,\n nonce: input.nonce,\n correlationId: input.correlationId,\n metadata: input.metadata,\n };\n\n const standardValidation = this.validateTransfer(standardInput);\n\n // Check if fast transfer route is available\n const routeKey = `${input.sourceChain}->${input.destinationChain}`;\n const fastTransferAvailable = FAST_TRANSFER_ROUTES.has(routeKey);\n\n // Estimate finality time\n const estimatedFinalitySeconds = fastTransferAvailable ? 30 : 900;\n\n // Validate hooks\n const hookValidation: { index: number; valid: boolean; reason?: string }[] = [];\n if (input.hooks) {\n for (let i = 0; i < input.hooks.length; i++) {\n const hook = input.hooks[i]!;\n const isValidAddr = /^0x[a-fA-F0-9]{40}$/.test(hook.targetContract);\n const hasCallData = hook.callData.length > 0;\n const validGas = hook.gasLimit > 0 && hook.gasLimit <= 10_000_000;\n\n if (!isValidAddr) {\n hookValidation.push({ index: i, valid: false, reason: 'Invalid target contract address' });\n } else if (!hasCallData) {\n hookValidation.push({ index: i, valid: false, reason: 'Call data is empty' });\n } else if (!validGas) {\n hookValidation.push({ index: i, valid: false, reason: 'Gas limit must be between 1 and 10,000,000' });\n } else {\n hookValidation.push({ index: i, valid: true });\n }\n }\n }\n\n const hooksValid = hookValidation.every((h) => h.valid);\n\n return {\n fastTransferAvailable,\n estimatedFinalitySeconds,\n hooksValid,\n hookValidation,\n standardValidation,\n };\n }\n\n /**\n * Initiate a CCTP V2 fast transfer with optional hooks.\n *\n * Fast transfers use CCTP V2's sub-minute finality on supported routes.\n * Hooks allow automated post-transfer actions on the destination chain.\n *\n * @param input - Fast transfer details including optional hooks\n * @returns The created CrossChainTransfer record with V2 metadata\n */\n initiateFastTransfer(input: InitiateFastTransferInput): CrossChainTransfer {\n const id = generateId();\n const correlationId = input.correlationId ?? generateId();\n const routeKey = `${input.sourceChain}->${input.destinationChain}`;\n const isFast = FAST_TRANSFER_ROUTES.has(routeKey);\n\n const transfer: CrossChainTransfer = {\n id,\n sourceChain: input.sourceChain,\n destinationChain: input.destinationChain,\n sourceDomain: CCTP_DOMAINS[input.sourceChain] ?? -1,\n destinationDomain: CCTP_DOMAINS[input.destinationChain] ?? -1,\n amount: input.amount,\n token: input.token,\n sender: input.sender,\n recipient: input.recipient,\n sourceTxHash: input.sourceTxHash,\n destinationTxHash: null,\n messageHash: null,\n status: 'pending',\n nonce: input.nonce ?? null,\n initiatedAt: now(),\n attestedAt: null,\n confirmedAt: null,\n correlationId,\n agentId: input.agentId,\n metadata: {\n ...input.metadata,\n maxFinalitySeconds: input.maxFinalitySeconds ?? (isFast ? 30 : 900),\n },\n version: 'v2',\n isFastTransfer: isFast,\n hooks: input.hooks,\n };\n\n this.transfers.set(id, transfer);\n this.actionLinks.set(id, {});\n\n return transfer;\n }\n\n /**\n * Record hook execution results for a V2 transfer.\n *\n * @param transferId - The transfer ID\n * @param results - Array of hook execution results\n * @returns The updated transfer\n */\n recordHookResults(transferId: string, results: CCTPHookResult[]): CrossChainTransfer {\n const transfer = this.transfers.get(transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${transferId}`);\n }\n\n if (transfer.version !== 'v2') {\n throw new Error(`Transfer ${transferId} is not a V2 transfer`);\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n hookResults: results,\n metadata: {\n ...transfer.metadata,\n hooksExecutedAt: now(),\n hookSuccessCount: results.filter((r) => r.success).length,\n hookFailureCount: results.filter((r) => !r.success).length,\n },\n };\n\n this.transfers.set(transferId, updated);\n return updated;\n }\n\n /**\n * Check if a route supports CCTP V2 fast transfers.\n *\n * @param sourceChain - Source blockchain network\n * @param destinationChain - Destination blockchain network\n * @returns Whether fast transfer is available\n */\n static isFastTransferAvailable(sourceChain: Chain, destinationChain: Chain): boolean {\n return FAST_TRANSFER_ROUTES.has(`${sourceChain}->${destinationChain}`);\n }\n\n /**\n * Get the CCTP domain ID for a given chain.\n *\n * @param chain - The blockchain network\n * @returns The CCTP domain ID, or undefined for unsupported chains\n */\n static getDomainId(chain: Chain): number | undefined {\n return CCTP_DOMAINS[chain];\n }\n\n /**\n * Get the chains supported for CCTP transfers.\n */\n static getSupportedChains(): Chain[] {\n return Object.keys(CCTP_DOMAINS) as Chain[];\n }\n\n /**\n * Get the list of V2 fast-transfer eligible routes.\n *\n * @returns Array of route strings in \"source->destination\" format\n */\n static getFastTransferRoutes(): string[] {\n return Array.from(FAST_TRANSFER_ROUTES);\n }\n\n // --------------------------------------------------------------------------\n // Validation checks\n // --------------------------------------------------------------------------\n\n private checkChainSupport(chain: Chain, label: string): CCTPValidationCheck {\n const supported = chain in CCTP_DOMAINS;\n return {\n name: `cctp_${label}_chain`,\n passed: supported,\n description: supported\n ? `${label} chain ${chain} supports CCTP (domain ${CCTP_DOMAINS[chain]})`\n : `${label} chain ${chain} does not support CCTP`,\n severity: supported ? 'low' : 'high',\n };\n }\n\n private checkRouteValidity(source: Chain, destination: Chain): CCTPValidationCheck {\n const valid = source !== destination;\n return {\n name: 'cctp_route_validity',\n passed: valid,\n description: valid\n ? `Valid cross-chain route: ${source} -> ${destination}`\n : `Invalid route: source and destination chains are the same (${source})`,\n severity: valid ? 'low' : 'critical',\n };\n }\n\n private checkTokenSupport(token: Token): CCTPValidationCheck {\n // CCTP natively supports USDC; EURC is also supported on some routes\n const supported = token === 'USDC' || token === 'EURC';\n return {\n name: 'cctp_token_support',\n passed: supported,\n description: supported\n ? `Token ${token} is supported for CCTP transfers`\n : `Token ${token} is not natively supported by CCTP (only USDC and EURC)`,\n severity: supported ? 'low' : 'high',\n };\n }\n\n private checkAmountValidity(amount: string): CCTPValidationCheck {\n const parsed = parseAmount(amount);\n const valid = !isNaN(parsed) && parsed > 0;\n return {\n name: 'cctp_amount_validity',\n passed: valid,\n description: valid\n ? `Transfer amount ${amount} is valid`\n : `Transfer amount ${amount} is invalid`,\n severity: valid ? 'low' : 'critical',\n };\n }\n\n private checkAddressFormat(address: string, label: string): CCTPValidationCheck {\n const isValid = /^0x[a-fA-F0-9]{40}$/.test(address);\n return {\n name: `cctp_address_${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 // --------------------------------------------------------------------------\n // Recommendations\n // --------------------------------------------------------------------------\n\n private generateRecommendations(\n checks: CCTPValidationCheck[],\n input: InitiateCCTPTransferInput,\n ): string[] {\n const recommendations: string[] = [];\n const amount = parseAmount(input.amount);\n\n const failedChecks = checks.filter((c) => !c.passed);\n\n if (failedChecks.some((c) => c.severity === 'critical')) {\n recommendations.push(\n 'Do not proceed with this transfer. Critical validation failures detected.',\n );\n }\n\n if (failedChecks.some((c) => c.name === 'cctp_token_support')) {\n recommendations.push(\n 'Consider using USDC for native CCTP support. Other tokens require bridge protocols.',\n );\n }\n\n if (!isNaN(amount) && amount >= 50000) {\n recommendations.push(\n 'Large cross-chain transfer detected. Verify recipient identity and document purpose.',\n );\n }\n\n if (!isNaN(amount) && amount >= 10000) {\n recommendations.push(\n 'Cross-chain transfer meets reporting threshold. Ensure CTR filing if applicable.',\n );\n }\n\n if (failedChecks.length === 0) {\n recommendations.push(\n 'Transfer validation passed. Monitor attestation status for completion.',\n );\n }\n\n return recommendations;\n }\n}\n","// ============================================================================\n// Kontext SDK - Circle Programmable Wallets Integration\n// ============================================================================\n//\n// Integrates Circle's Programmable Wallets (wallet-as-a-service) with\n// Kontext's compliance and audit infrastructure. Supports two operating modes:\n//\n// - **Simulation mode** (default): Validates flows, runs compliance checks,\n// and logs everything without making real Circle API calls.\n// - **Live mode**: When a Circle API key is provided, proxies real API calls\n// to Circle's endpoints.\n//\n// All wallet operations are automatically logged through Kontext's rolling\n// SHA-256 digest chain for tamper-evident audit trails.\n// ============================================================================\n\nimport type {\n Chain,\n ActionLog,\n LogTransactionInput,\n ComplianceCheckResult,\n AnomalySeverity,\n} from '../types.js';\nimport { generateId, now, parseAmount, isValidAddress } from '../utils.js';\nimport { UsdcCompliance } from './usdc.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration options for the CircleWalletManager */\nexport interface CircleWalletOptions {\n /** Entity secret ciphertext for developer-controlled wallets */\n entitySecretCiphertext?: string;\n /** Default blockchain network for new wallets */\n defaultChain?: Chain;\n /** Automatically log all wallet operations through Kontext (default: true) */\n autoLog?: boolean;\n /** Require compliance check before transfers (default: true) */\n requireCompliance?: boolean;\n}\n\n/** A wallet set (group of wallets) */\nexport interface WalletSet {\n /** Unique wallet set identifier */\n id: string;\n /** Human-readable name */\n name: string;\n /** Custody type */\n custodyType: 'DEVELOPER' | 'USER';\n /** Creation timestamp */\n createdAt: string;\n}\n\n/** A Circle programmable wallet */\nexport interface CircleWallet {\n /** Unique wallet identifier */\n id: string;\n /** Parent wallet set ID */\n walletSetId: string;\n /** On-chain address */\n address: string;\n /** Blockchain network */\n chain: Chain;\n /** Custody type */\n custodyType: 'DEVELOPER' | 'USER';\n /** Wallet state */\n state: 'LIVE' | 'FROZEN';\n /** Creation timestamp */\n createDate: string;\n}\n\n/** Options for creating a new wallet */\nexport interface CreateWalletOptions {\n /** Blockchain network for the wallet */\n chain: Chain;\n /** Custody type (default: 'DEVELOPER') */\n custodyType?: 'DEVELOPER' | 'USER';\n /** Additional metadata */\n metadata?: Record<string, string>;\n}\n\n/** Input for a compliant transfer */\nexport interface CompliantTransferInput {\n /** Source wallet ID */\n walletId: string;\n /** Destination on-chain address */\n destinationAddress: string;\n /** Transfer amount (string to preserve precision) */\n amount: string;\n /** Blockchain network (defaults to wallet's chain) */\n chain?: Chain;\n /** Token to transfer */\n token?: 'USDC' | 'EURC';\n /** Agent initiating the transfer */\n agent?: string;\n /** Additional metadata */\n metadata?: Record<string, any>;\n}\n\n/** Result of a compliant transfer */\nexport interface CompliantTransferResult {\n /** Circle transfer identifier */\n transferId: string;\n /** Source wallet ID */\n walletId: string;\n /** Transfer status */\n status: 'COMPLETED' | 'BLOCKED' | 'PENDING_REVIEW';\n /** Compliance check details */\n complianceCheck: ComplianceCheckSummary;\n /** Kontext action log ID */\n kontextLogId: string;\n /** Trust score at time of transfer */\n trustScore: number;\n /** Transfer amount */\n amount: string;\n /** Blockchain network */\n chain: Chain;\n /** On-chain transaction hash (if completed) */\n transactionHash?: string;\n /** Reason the transfer was blocked (if blocked) */\n blockedReason?: string;\n}\n\n/** Summary of compliance check for a transfer */\nexport interface ComplianceCheckSummary {\n /** Whether the check passed */\n passed: boolean;\n /** Risk level */\n riskLevel: AnomalySeverity;\n /** Individual check results */\n checks: ComplianceCheckResult[];\n /** Recommendations */\n recommendations: string[];\n}\n\n/** Wallet balance information */\nexport interface WalletBalance {\n /** Wallet identifier */\n walletId: string;\n /** Blockchain network */\n chain: Chain;\n /** Token balances */\n balances: { token: string; amount: string }[];\n}\n\n/**\n * Adapter interface for Circle API calls.\n * Allows swapping between simulation and live implementations.\n */\nexport interface CircleApiAdapter {\n createWalletSet(name: string, custodyType: string): Promise<{ id: string }>;\n createWallet(walletSetId: string, chain: Chain, custodyType: string): Promise<{ id: string; address: string }>;\n getWallet(walletId: string): Promise<{ id: string; address: string; chain: Chain; state: string } | null>;\n listWallets(walletSetId: string): Promise<{ id: string; address: string; chain: Chain; state: string }[]>;\n transfer(params: { walletId: string; destinationAddress: string; amount: string; chain: Chain; token: string }): Promise<{ transferId: string; transactionHash: string }>;\n getBalance(walletId: string): Promise<{ balances: { token: string; amount: string }[] }>;\n}\n\n// ============================================================================\n// Simulation Adapter\n// ============================================================================\n\n/**\n * Simulated Circle API adapter for testing and development.\n * Returns deterministic mock data without making real API calls.\n */\nclass SimulationAdapter implements CircleApiAdapter {\n private walletCounter = 0;\n private transferCounter = 0;\n\n async createWalletSet(name: string, custodyType: string): Promise<{ id: string }> {\n return { id: `ws_sim_${generateId().slice(0, 8)}` };\n }\n\n async createWallet(walletSetId: string, chain: Chain, custodyType: string): Promise<{ id: string; address: string }> {\n this.walletCounter++;\n const addressHex = this.walletCounter.toString(16).padStart(40, '0');\n return {\n id: `wallet_sim_${generateId().slice(0, 8)}`,\n address: `0x${addressHex}`,\n };\n }\n\n async getWallet(walletId: string): Promise<{ id: string; address: string; chain: Chain; state: string } | null> {\n return {\n id: walletId,\n address: '0x' + '0'.repeat(40),\n chain: 'ethereum',\n state: 'LIVE',\n };\n }\n\n async listWallets(walletSetId: string): Promise<{ id: string; address: string; chain: Chain; state: string }[]> {\n return [];\n }\n\n async transfer(params: { walletId: string; destinationAddress: string; amount: string; chain: Chain; token: string }): Promise<{ transferId: string; transactionHash: string }> {\n this.transferCounter++;\n return {\n transferId: `txn_sim_${generateId().slice(0, 8)}`,\n transactionHash: `0x${this.transferCounter.toString(16).padStart(64, '0')}`,\n };\n }\n\n async getBalance(walletId: string): Promise<{ balances: { token: string; amount: string }[] }> {\n return {\n balances: [\n { token: 'USDC', amount: '1000.00' },\n ],\n };\n }\n}\n\n// ============================================================================\n// Live Adapter\n// ============================================================================\n\n/**\n * Live Circle API adapter that makes real HTTP calls to Circle's endpoints.\n */\nclass LiveCircleAdapter implements CircleApiAdapter {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.circle.com/v1/w3s';\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Circle API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data as T;\n }\n\n async createWalletSet(name: string, custodyType: string): Promise<{ id: string }> {\n const result = await this.request<{ data: { walletSet: { id: string } } }>('POST', '/developer/walletSets', {\n name,\n idempotencyKey: generateId(),\n });\n return { id: result.data.walletSet.id };\n }\n\n async createWallet(walletSetId: string, chain: Chain, custodyType: string): Promise<{ id: string; address: string }> {\n const chainMap: Record<string, string> = {\n ethereum: 'ETH',\n base: 'BASE',\n polygon: 'MATIC',\n arbitrum: 'ARB',\n optimism: 'OP',\n arc: 'ARC',\n };\n const result = await this.request<{ data: { wallets: { id: string; address: string }[] } }>('POST', '/developer/wallets', {\n walletSetId,\n blockchains: [chainMap[chain] ?? chain.toUpperCase()],\n count: 1,\n idempotencyKey: generateId(),\n });\n const wallet = result.data.wallets[0];\n return { id: wallet!.id, address: wallet!.address };\n }\n\n async getWallet(walletId: string): Promise<{ id: string; address: string; chain: Chain; state: string } | null> {\n try {\n const result = await this.request<{ data: { wallet: { id: string; address: string; blockchain: string; state: string } } }>('GET', `/wallets/${walletId}`);\n const w = result.data.wallet;\n return { id: w.id, address: w.address, chain: w.blockchain.toLowerCase() as Chain, state: w.state };\n } catch {\n return null;\n }\n }\n\n async listWallets(walletSetId: string): Promise<{ id: string; address: string; chain: Chain; state: string }[]> {\n const result = await this.request<{ data: { wallets: { id: string; address: string; blockchain: string; state: string }[] } }>('GET', `/wallets?walletSetId=${walletSetId}`);\n return result.data.wallets.map((w) => ({\n id: w.id,\n address: w.address,\n chain: w.blockchain.toLowerCase() as Chain,\n state: w.state,\n }));\n }\n\n async transfer(params: { walletId: string; destinationAddress: string; amount: string; chain: Chain; token: string }): Promise<{ transferId: string; transactionHash: string }> {\n const result = await this.request<{ data: { transfer: { id: string; transactionHash: string } } }>('POST', '/developer/transactions/transfer', {\n walletId: params.walletId,\n destinationAddress: params.destinationAddress,\n amounts: [params.amount],\n tokenId: params.token,\n idempotencyKey: generateId(),\n });\n return {\n transferId: result.data.transfer.id,\n transactionHash: result.data.transfer.transactionHash,\n };\n }\n\n async getBalance(walletId: string): Promise<{ balances: { token: string; amount: string }[] }> {\n const result = await this.request<{ data: { tokenBalances: { token: { symbol: string }; amount: string }[] } }>('GET', `/wallets/${walletId}/balances`);\n return {\n balances: result.data.tokenBalances.map((b) => ({\n token: b.token.symbol,\n amount: b.amount,\n })),\n };\n }\n}\n\n// ============================================================================\n// Kontext Client Interface (subset needed by this module)\n// ============================================================================\n\n/** Minimal interface for the Kontext client used by CircleWalletManager */\ninterface KontextLike {\n log(input: { type: string; description: string; agentId: string; metadata?: Record<string, unknown> }): Promise<ActionLog>;\n logTransaction(input: LogTransactionInput): Promise<ActionLog>;\n getTrustScore(agentId: string): Promise<{ score: number }>;\n checkUsdcCompliance(tx: LogTransactionInput): { compliant: boolean; checks: ComplianceCheckResult[]; riskLevel: AnomalySeverity; recommendations: string[] };\n}\n\n// ============================================================================\n// CircleWalletManager\n// ============================================================================\n\n/**\n * Manages Circle Programmable Wallets with integrated Kontext compliance\n * and audit logging.\n *\n * All wallet operations are automatically logged through Kontext's rolling\n * SHA-256 digest chain. Transfers are wrapped with compliance checks that\n * must pass before execution.\n *\n * @example\n * ```typescript\n * import { Kontext } from 'kontext-sdk';\n * import { CircleWalletManager } from 'kontext-sdk';\n *\n * const kontext = Kontext.init({ projectId: 'my-project', environment: 'production' });\n * const wallets = new CircleWalletManager(kontext, 'circle-api-key');\n *\n * const walletSet = await wallets.createWalletSet('Operations');\n * const wallet = await wallets.createWallet(walletSet.id, { chain: 'base' });\n *\n * const result = await wallets.transferWithCompliance({\n * walletId: wallet.id,\n * destinationAddress: '0x...',\n * amount: '100',\n * agent: 'payment-agent',\n * });\n * ```\n */\nexport class CircleWalletManager {\n private readonly kontext: KontextLike;\n private readonly adapter: CircleApiAdapter;\n private readonly options: Required<CircleWalletOptions>;\n private readonly isLiveMode: boolean;\n\n // In-memory state for wallet tracking\n private walletSets: Map<string, WalletSet> = new Map();\n private wallets: Map<string, CircleWallet> = new Map();\n private walletSetWallets: Map<string, string[]> = new Map();\n private auditTrail: Map<string, ActionLog[]> = new Map();\n\n /**\n * Create a new CircleWalletManager.\n *\n * @param kontextClient - Initialized Kontext SDK client\n * @param circleApiKey - Circle API key (optional; omit for simulation mode)\n * @param options - Configuration options\n */\n constructor(\n kontextClient: KontextLike,\n circleApiKey?: string,\n options?: CircleWalletOptions,\n ) {\n this.kontext = kontextClient;\n this.isLiveMode = !!circleApiKey;\n this.adapter = circleApiKey\n ? new LiveCircleAdapter(circleApiKey)\n : new SimulationAdapter();\n\n this.options = {\n entitySecretCiphertext: options?.entitySecretCiphertext ?? '',\n defaultChain: options?.defaultChain ?? 'ethereum',\n autoLog: options?.autoLog ?? true,\n requireCompliance: options?.requireCompliance ?? true,\n };\n }\n\n // --------------------------------------------------------------------------\n // Wallet Set Management\n // --------------------------------------------------------------------------\n\n /**\n * Create a new wallet set (a logical group of wallets).\n *\n * @param name - Human-readable name for the wallet set\n * @param metadata - Optional metadata key-value pairs\n * @returns The created WalletSet\n */\n async createWalletSet(name: string, metadata?: Record<string, string>): Promise<WalletSet> {\n const custodyType = this.options.entitySecretCiphertext ? 'DEVELOPER' : 'USER';\n const result = await this.adapter.createWalletSet(name, custodyType);\n\n const walletSet: WalletSet = {\n id: result.id,\n name,\n custodyType,\n createdAt: now(),\n };\n\n this.walletSets.set(walletSet.id, walletSet);\n this.walletSetWallets.set(walletSet.id, []);\n\n if (this.options.autoLog) {\n await this.logOperation('wallet_set_created', `Created wallet set \"${name}\"`, {\n walletSetId: walletSet.id,\n custodyType,\n ...metadata,\n });\n }\n\n return walletSet;\n }\n\n // --------------------------------------------------------------------------\n // Wallet Management\n // --------------------------------------------------------------------------\n\n /**\n * Create a new wallet within a wallet set.\n *\n * @param walletSetId - Parent wallet set ID\n * @param options - Wallet creation options\n * @returns The created CircleWallet\n */\n async createWallet(walletSetId: string, options: CreateWalletOptions): Promise<CircleWallet> {\n const walletSet = this.walletSets.get(walletSetId);\n if (!walletSet) {\n throw new Error(`Wallet set not found: ${walletSetId}`);\n }\n\n const chain = options.chain ?? this.options.defaultChain;\n const custodyType = options.custodyType ?? walletSet.custodyType;\n\n const result = await this.adapter.createWallet(walletSetId, chain, custodyType);\n\n const wallet: CircleWallet = {\n id: result.id,\n walletSetId,\n address: result.address,\n chain,\n custodyType,\n state: 'LIVE',\n createDate: now(),\n };\n\n this.wallets.set(wallet.id, wallet);\n const setWallets = this.walletSetWallets.get(walletSetId) ?? [];\n setWallets.push(wallet.id);\n this.walletSetWallets.set(walletSetId, setWallets);\n\n if (this.options.autoLog) {\n await this.logOperation('wallet_created', `Created wallet on ${chain}`, {\n walletId: wallet.id,\n walletSetId,\n chain,\n address: wallet.address,\n custodyType,\n ...options.metadata,\n });\n }\n\n return wallet;\n }\n\n /**\n * Get a wallet by its ID.\n *\n * @param walletId - Wallet identifier\n * @returns The CircleWallet, or throws if not found\n */\n async getWallet(walletId: string): Promise<CircleWallet> {\n const cached = this.wallets.get(walletId);\n if (cached) return cached;\n\n if (this.isLiveMode) {\n const remote = await this.adapter.getWallet(walletId);\n if (remote) {\n const wallet: CircleWallet = {\n id: remote.id,\n walletSetId: 'unknown',\n address: remote.address,\n chain: remote.chain,\n custodyType: 'DEVELOPER',\n state: remote.state as 'LIVE' | 'FROZEN',\n createDate: now(),\n };\n this.wallets.set(walletId, wallet);\n return wallet;\n }\n }\n\n throw new Error(`Wallet not found: ${walletId}`);\n }\n\n /**\n * List all wallets in a wallet set.\n *\n * @param walletSetId - Wallet set identifier\n * @returns Array of CircleWallet records\n */\n async listWallets(walletSetId: string): Promise<CircleWallet[]> {\n const walletIds = this.walletSetWallets.get(walletSetId) ?? [];\n const wallets: CircleWallet[] = [];\n for (const id of walletIds) {\n const wallet = this.wallets.get(id);\n if (wallet) wallets.push(wallet);\n }\n return wallets;\n }\n\n // --------------------------------------------------------------------------\n // Compliant Transfers\n // --------------------------------------------------------------------------\n\n /**\n * Execute a USDC/EURC transfer with integrated compliance checks.\n *\n * The transfer flow:\n * 1. Validate the source wallet exists and is live\n * 2. Run Kontext compliance checks on the transaction\n * 3. Get the agent's trust score\n * 4. If compliance passes, execute the transfer via Circle\n * 5. Log the entire operation through Kontext's audit system\n *\n * @param input - Transfer details\n * @returns CompliantTransferResult with status and audit trail\n */\n async transferWithCompliance(input: CompliantTransferInput): Promise<CompliantTransferResult> {\n const wallet = this.wallets.get(input.walletId);\n if (!wallet) {\n throw new Error(`Wallet not found: ${input.walletId}`);\n }\n\n if (wallet.state !== 'LIVE') {\n throw new Error(`Wallet ${input.walletId} is frozen and cannot execute transfers`);\n }\n\n const chain = input.chain ?? wallet.chain;\n const token = input.token ?? 'USDC';\n const agent = input.agent ?? 'system';\n\n // Step 1: Run compliance check\n const complianceCheck = this.runComplianceCheck(input, wallet, chain, token);\n\n // Step 2: Get trust score\n let trustScore = 50; // default\n try {\n const score = await this.kontext.getTrustScore(agent);\n trustScore = score.score;\n } catch {\n // Trust scoring may fail for new agents; use default\n }\n\n // Step 3: Determine transfer status based on compliance and trust\n let status: CompliantTransferResult['status'];\n let transactionHash: string | undefined;\n let transferId: string;\n let blockedReason: string | undefined;\n\n if (!complianceCheck.passed && this.options.requireCompliance) {\n status = 'BLOCKED';\n transferId = `blocked_${generateId().slice(0, 8)}`;\n blockedReason = complianceCheck.recommendations.join('; ');\n } else if (complianceCheck.riskLevel === 'high' || complianceCheck.riskLevel === 'critical' || trustScore < 30) {\n status = 'PENDING_REVIEW';\n transferId = `review_${generateId().slice(0, 8)}`;\n } else {\n // Step 4: Execute transfer\n const result = await this.adapter.transfer({\n walletId: input.walletId,\n destinationAddress: input.destinationAddress,\n amount: input.amount,\n chain,\n token,\n });\n status = 'COMPLETED';\n transferId = result.transferId;\n transactionHash = result.transactionHash;\n }\n\n // Step 5: Log the operation\n const logAction = await this.kontext.log({\n type: 'circle_wallet_transfer',\n description: `${token} transfer of ${input.amount} from wallet ${input.walletId} - ${status}`,\n agentId: agent,\n metadata: {\n walletId: input.walletId,\n destinationAddress: input.destinationAddress,\n amount: input.amount,\n chain,\n token,\n status,\n transferId,\n transactionHash,\n trustScore,\n compliancePassed: complianceCheck.passed,\n complianceRiskLevel: complianceCheck.riskLevel,\n blockedReason,\n ...input.metadata,\n },\n });\n\n // Track in audit trail\n const walletAudit = this.auditTrail.get(input.walletId) ?? [];\n walletAudit.push(logAction);\n this.auditTrail.set(input.walletId, walletAudit);\n\n return {\n transferId,\n walletId: input.walletId,\n status,\n complianceCheck,\n kontextLogId: logAction.id,\n trustScore,\n amount: input.amount,\n chain,\n transactionHash,\n blockedReason,\n };\n }\n\n // --------------------------------------------------------------------------\n // Balance and Monitoring\n // --------------------------------------------------------------------------\n\n /**\n * Get the token balances for a wallet.\n *\n * @param walletId - Wallet identifier\n * @param chain - Optional chain override\n * @returns WalletBalance with token amounts\n */\n async getBalance(walletId: string, chain?: Chain): Promise<WalletBalance> {\n const wallet = this.wallets.get(walletId);\n const walletChain = chain ?? wallet?.chain ?? this.options.defaultChain;\n\n const result = await this.adapter.getBalance(walletId);\n\n return {\n walletId,\n chain: walletChain,\n balances: result.balances,\n };\n }\n\n // --------------------------------------------------------------------------\n // Audit Integration\n // --------------------------------------------------------------------------\n\n /**\n * Get the Kontext audit trail for a specific wallet.\n *\n * @param walletId - Wallet identifier\n * @returns Array of ActionLog entries related to this wallet\n */\n async getWalletAuditTrail(walletId: string): Promise<ActionLog[]> {\n return this.auditTrail.get(walletId) ?? [];\n }\n\n // --------------------------------------------------------------------------\n // Internal Helpers\n // --------------------------------------------------------------------------\n\n /**\n * Run Kontext compliance checks on a transfer.\n */\n private runComplianceCheck(\n input: CompliantTransferInput,\n wallet: CircleWallet,\n chain: Chain,\n token: string,\n ): ComplianceCheckSummary {\n // Build a LogTransactionInput for Kontext's compliance checker\n const txInput: LogTransactionInput = {\n txHash: '0x' + '0'.repeat(64), // placeholder for pre-check\n chain,\n amount: input.amount,\n token: token as 'USDC' | 'EURC',\n from: wallet.address,\n to: input.destinationAddress,\n agentId: input.agent ?? 'system',\n };\n\n const usdcCheck = this.kontext.checkUsdcCompliance(txInput);\n\n // Additional checks specific to Circle wallets\n const additionalChecks: ComplianceCheckResult[] = [];\n\n // Check destination address format\n const addrValid = isValidAddress(input.destinationAddress);\n additionalChecks.push({\n name: 'destination_address_format',\n passed: addrValid,\n description: addrValid\n ? 'Destination address format is valid'\n : `Invalid destination address: ${input.destinationAddress}`,\n severity: addrValid ? 'low' : 'high',\n });\n\n // Check amount is positive\n const amount = parseAmount(input.amount);\n const amountValid = !isNaN(amount) && amount > 0;\n additionalChecks.push({\n name: 'transfer_amount_positive',\n passed: amountValid,\n description: amountValid\n ? `Transfer amount ${input.amount} is valid`\n : `Transfer amount ${input.amount} is invalid`,\n severity: amountValid ? 'low' : 'critical',\n });\n\n // Check wallet is not frozen\n additionalChecks.push({\n name: 'wallet_state_check',\n passed: wallet.state === 'LIVE',\n description: wallet.state === 'LIVE'\n ? 'Wallet is in LIVE state'\n : 'Wallet is FROZEN -- transfers are blocked',\n severity: wallet.state === 'LIVE' ? 'low' : 'critical',\n });\n\n const allChecks = [...usdcCheck.checks, ...additionalChecks];\n const failedChecks = allChecks.filter((c) => !c.passed);\n const passed = failedChecks.length === 0 || failedChecks.every((c) => c.severity === 'low');\n\n // Determine highest risk level\n const severityOrder: AnomalySeverity[] = ['low', 'medium', 'high', 'critical'];\n const riskLevel = allChecks.reduce<AnomalySeverity>((max, c) => {\n return severityOrder.indexOf(c.severity) > severityOrder.indexOf(max) ? c.severity : max;\n }, 'low');\n\n return {\n passed,\n riskLevel,\n checks: allChecks,\n recommendations: usdcCheck.recommendations,\n };\n }\n\n /**\n * Log an operation through the Kontext client.\n */\n private async logOperation(\n type: string,\n description: string,\n metadata: Record<string, unknown>,\n ): Promise<ActionLog> {\n const action = await this.kontext.log({\n type,\n description,\n agentId: 'circle-wallet-manager',\n metadata,\n });\n\n // Track in per-wallet audit trails if applicable\n const walletId = metadata['walletId'] as string | undefined;\n if (walletId) {\n const trail = this.auditTrail.get(walletId) ?? [];\n trail.push(action);\n this.auditTrail.set(walletId, trail);\n }\n\n return action;\n }\n}\n","// ============================================================================\n// Kontext SDK - Circle Compliance Engine Integration\n// ============================================================================\n//\n// Integrates Circle's transaction screening capabilities with Kontext's own\n// trust scoring and compliance infrastructure for dual-layer screening.\n//\n// Supports two operating modes:\n// - **Simulation mode** (default): Runs simulated Circle screening alongside\n// real Kontext compliance checks.\n// - **Live mode**: When a Circle API key is provided, calls Circle's actual\n// transaction screening APIs.\n// ============================================================================\n\nimport type {\n Chain,\n ActionLog,\n LogTransactionInput,\n AnomalySeverity,\n ComplianceCheckResult,\n RiskFactor,\n} from '../types.js';\nimport { generateId, now, parseAmount, isValidAddress } from '../utils.js';\nimport { UsdcCompliance } from './usdc.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Input for screening a transaction */\nexport interface ScreenTransactionInput {\n /** Sender address */\n from: string;\n /** Recipient address */\n to: string;\n /** Transfer amount */\n amount: string;\n /** Blockchain network */\n chain: Chain;\n /** Token being transferred */\n token?: string;\n}\n\n/** Result of dual screening (Circle + Kontext) */\nexport interface DualScreenResult {\n /** Circle's screening result */\n circleScreening: {\n /** Whether the transaction is approved by Circle */\n approved: boolean;\n /** Risk level from Circle's screening */\n riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE';\n /** Flags raised by Circle's screening */\n flags: string[];\n };\n /** Kontext's screening result */\n kontextScreening: {\n /** Trust score (0-100) */\n trustScore: number;\n /** Whether anomaly was detected */\n anomalyDetected: boolean;\n /** Whether compliance checks passed */\n complianceApproved: boolean;\n /** Flags raised by Kontext screening */\n flags: string[];\n };\n /** Combined decision from both systems */\n combinedDecision: 'APPROVE' | 'REVIEW' | 'BLOCK';\n /** Kontext audit log ID */\n auditLogId: string;\n}\n\n/** Result of screening a single address */\nexport interface AddressScreenResult {\n /** The screened address */\n address: string;\n /** Blockchain network */\n chain: Chain;\n /** Whether the address is sanctioned */\n sanctioned: boolean;\n /** Risk level */\n riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE';\n /** Flags raised */\n flags: string[];\n /** Screening timestamp */\n screenedAt: string;\n}\n\n/** Input for comprehensive risk assessment */\nexport interface RiskAssessmentInput {\n /** Address to assess */\n address: string;\n /** Blockchain network */\n chain: Chain;\n /** Agent ID for trust scoring */\n agentId?: string;\n /** Transaction amount for contextual assessment */\n amount?: string;\n /** Token for contextual assessment */\n token?: string;\n}\n\n/** Comprehensive risk assessment result */\nexport interface ComprehensiveRiskResult {\n /** Overall risk level */\n overallRisk: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';\n /** Circle-derived risk score (0-100) */\n circleRiskScore: number;\n /** Kontext trust score (0-100) */\n kontextTrustScore: number;\n /** Combined weighted score (0-100, higher = riskier) */\n combinedScore: number;\n /** Action recommendation */\n recommendation: 'PROCEED' | 'MANUAL_REVIEW' | 'BLOCK';\n /** Individual risk factors */\n factors: ComprehensiveRiskFactor[];\n /** Kontext audit log ID */\n auditLogId: string;\n}\n\n/** Risk factor in comprehensive assessment */\nexport interface ComprehensiveRiskFactor {\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 * Adapter interface for Circle's compliance screening API.\n */\nexport interface CircleComplianceAdapter {\n screenTransaction(input: ScreenTransactionInput): Promise<{\n approved: boolean;\n riskLevel: string;\n flags: string[];\n }>;\n screenAddress(address: string, chain: Chain): Promise<{\n sanctioned: boolean;\n riskLevel: string;\n flags: string[];\n }>;\n}\n\n// ============================================================================\n// Simulation Adapter\n// ============================================================================\n\n/** Known high-risk address patterns for simulation purposes */\nconst SIMULATED_HIGH_RISK_PREFIXES = [\n '0x000000000000000000000000000000000000dead',\n '0x0000000000000000000000000000000000000000',\n];\n\n/**\n * Simulated Circle compliance screening.\n * Uses heuristic rules to approximate screening behavior.\n */\nclass SimulatedComplianceAdapter implements CircleComplianceAdapter {\n async screenTransaction(input: ScreenTransactionInput): Promise<{\n approved: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n const flags: string[] = [];\n let riskLevel = 'LOW';\n\n const amount = parseAmount(input.amount);\n\n // Simulate sanctions check\n if (this.isHighRiskAddress(input.from) || this.isHighRiskAddress(input.to)) {\n flags.push('SANCTIONED_ADDRESS');\n riskLevel = 'SEVERE';\n }\n\n // Amount-based risk\n if (!isNaN(amount)) {\n if (amount >= 100000) {\n flags.push('VERY_LARGE_AMOUNT');\n riskLevel = riskLevel === 'SEVERE' ? 'SEVERE' : 'HIGH';\n } else if (amount >= 50000) {\n flags.push('LARGE_AMOUNT');\n if (riskLevel === 'LOW') riskLevel = 'MEDIUM';\n } else if (amount >= 10000) {\n flags.push('REPORTABLE_AMOUNT');\n if (riskLevel === 'LOW') riskLevel = 'LOW';\n }\n }\n\n // Invalid amount\n if (isNaN(amount) || amount <= 0) {\n flags.push('INVALID_AMOUNT');\n riskLevel = 'HIGH';\n }\n\n // Address format check\n if (!isValidAddress(input.from)) {\n flags.push('INVALID_SENDER_ADDRESS');\n riskLevel = 'HIGH';\n }\n if (!isValidAddress(input.to)) {\n flags.push('INVALID_RECIPIENT_ADDRESS');\n riskLevel = 'HIGH';\n }\n\n const approved = riskLevel !== 'SEVERE' && riskLevel !== 'HIGH';\n\n return { approved, riskLevel, flags };\n }\n\n async screenAddress(address: string, chain: Chain): Promise<{\n sanctioned: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n const flags: string[] = [];\n let riskLevel = 'LOW';\n let sanctioned = false;\n\n if (this.isHighRiskAddress(address)) {\n sanctioned = true;\n riskLevel = 'SEVERE';\n flags.push('SANCTIONED_ADDRESS');\n }\n\n if (!isValidAddress(address)) {\n riskLevel = 'HIGH';\n flags.push('INVALID_ADDRESS_FORMAT');\n }\n\n return { sanctioned, riskLevel, flags };\n }\n\n private isHighRiskAddress(address: string): boolean {\n const lower = address.toLowerCase();\n return SIMULATED_HIGH_RISK_PREFIXES.some((prefix) => lower === prefix);\n }\n}\n\n// ============================================================================\n// Live Adapter\n// ============================================================================\n\n/**\n * Live Circle compliance adapter that calls Circle's screening APIs.\n */\nclass LiveComplianceAdapter implements CircleComplianceAdapter {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.circle.com/v1';\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Circle Compliance API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data as T;\n }\n\n async screenTransaction(input: ScreenTransactionInput): Promise<{\n approved: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n try {\n const result = await this.request<{\n data: { decision: string; riskLevel: string; flags: string[] }\n }>('POST', '/compliance/screening/transactions', {\n from: input.from,\n to: input.to,\n amount: input.amount,\n chain: input.chain,\n token: input.token,\n });\n return {\n approved: result.data.decision === 'APPROVE',\n riskLevel: result.data.riskLevel,\n flags: result.data.flags,\n };\n } catch {\n // Fallback to simulation on API failure\n const sim = new SimulatedComplianceAdapter();\n return sim.screenTransaction(input);\n }\n }\n\n async screenAddress(address: string, chain: Chain): Promise<{\n sanctioned: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n try {\n const result = await this.request<{\n data: { sanctioned: boolean; riskLevel: string; flags: string[] }\n }>('POST', '/compliance/screening/addresses', {\n address,\n chain,\n });\n return result.data;\n } catch {\n // Fallback to simulation on API failure\n const sim = new SimulatedComplianceAdapter();\n return sim.screenAddress(address, chain);\n }\n }\n}\n\n// ============================================================================\n// Kontext Client Interface (subset needed by this module)\n// ============================================================================\n\n/** Minimal interface for the Kontext client used by CircleComplianceEngine */\ninterface KontextLike {\n log(input: { type: string; description: string; agentId: string; metadata?: Record<string, unknown> }): Promise<ActionLog>;\n getTrustScore(agentId: string): Promise<{ score: number }>;\n checkUsdcCompliance(tx: LogTransactionInput): { compliant: boolean; checks: ComplianceCheckResult[]; riskLevel: AnomalySeverity; recommendations: string[] };\n}\n\n// ============================================================================\n// CircleComplianceEngine\n// ============================================================================\n\n/**\n * Dual-layer compliance engine combining Circle's transaction screening\n * with Kontext's trust scoring and anomaly detection.\n *\n * Every screening operation is logged through Kontext's tamper-evident\n * audit system for regulatory compliance.\n *\n * @example\n * ```typescript\n * const kontext = Kontext.init({ projectId: 'my-project', environment: 'production' });\n * const compliance = new CircleComplianceEngine(kontext);\n *\n * const result = await compliance.screenTransaction({\n * from: '0xSender...',\n * to: '0xRecipient...',\n * amount: '5000',\n * chain: 'base',\n * });\n *\n * if (result.combinedDecision === 'BLOCK') {\n * console.log('Transaction blocked');\n * }\n * ```\n */\nexport class CircleComplianceEngine {\n private readonly kontext: KontextLike;\n private readonly adapter: CircleComplianceAdapter;\n private readonly isLiveMode: boolean;\n\n /**\n * Create a new CircleComplianceEngine.\n *\n * @param kontextClient - Initialized Kontext SDK client\n * @param circleApiKey - Circle API key (optional; omit for simulation mode)\n */\n constructor(kontextClient: KontextLike, circleApiKey?: string) {\n this.kontext = kontextClient;\n this.isLiveMode = !!circleApiKey;\n this.adapter = circleApiKey\n ? new LiveComplianceAdapter(circleApiKey)\n : new SimulatedComplianceAdapter();\n }\n\n // --------------------------------------------------------------------------\n // Transaction Screening\n // --------------------------------------------------------------------------\n\n /**\n * Screen a transaction through both Circle and Kontext compliance systems.\n *\n * @param input - Transaction details to screen\n * @returns DualScreenResult with combined decision\n */\n async screenTransaction(input: ScreenTransactionInput): Promise<DualScreenResult> {\n // Step 1: Circle screening\n const circleResult = await this.adapter.screenTransaction(input);\n\n // Step 2: Kontext screening\n const kontextResult = this.runKontextScreening(input);\n\n // Step 3: Combined decision\n const combinedDecision = this.determineCombinedDecision(\n circleResult.approved,\n circleResult.riskLevel as 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n kontextResult.complianceApproved,\n kontextResult.trustScore,\n );\n\n // Step 4: Log the screening\n const logAction = await this.kontext.log({\n type: 'compliance_screening',\n description: `Dual screening: ${input.from} -> ${input.to} (${input.amount} ${input.token ?? 'USDC'}) - ${combinedDecision}`,\n agentId: 'circle-compliance-engine',\n metadata: {\n from: input.from,\n to: input.to,\n amount: input.amount,\n chain: input.chain,\n token: input.token,\n circleApproved: circleResult.approved,\n circleRiskLevel: circleResult.riskLevel,\n circleFlags: circleResult.flags,\n kontextTrustScore: kontextResult.trustScore,\n kontextAnomalyDetected: kontextResult.anomalyDetected,\n kontextComplianceApproved: kontextResult.complianceApproved,\n kontextFlags: kontextResult.flags,\n combinedDecision,\n },\n });\n\n return {\n circleScreening: {\n approved: circleResult.approved,\n riskLevel: circleResult.riskLevel as 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n flags: circleResult.flags,\n },\n kontextScreening: kontextResult,\n combinedDecision,\n auditLogId: logAction.id,\n };\n }\n\n // --------------------------------------------------------------------------\n // Address Screening\n // --------------------------------------------------------------------------\n\n /**\n * Screen an address for sanctions and risk.\n *\n * @param address - On-chain address to screen\n * @param chain - Blockchain network\n * @returns AddressScreenResult with risk assessment\n */\n async screenAddress(address: string, chain: Chain): Promise<AddressScreenResult> {\n const result = await this.adapter.screenAddress(address, chain);\n\n // Log the screening\n await this.kontext.log({\n type: 'address_screening',\n description: `Address screening: ${address} on ${chain} - ${result.riskLevel}`,\n agentId: 'circle-compliance-engine',\n metadata: {\n address,\n chain,\n sanctioned: result.sanctioned,\n riskLevel: result.riskLevel,\n flags: result.flags,\n },\n });\n\n return {\n address,\n chain,\n sanctioned: result.sanctioned,\n riskLevel: result.riskLevel as 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n flags: result.flags,\n screenedAt: now(),\n };\n }\n\n // --------------------------------------------------------------------------\n // Comprehensive Risk Assessment\n // --------------------------------------------------------------------------\n\n /**\n * Get a comprehensive risk assessment combining Circle screening with\n * Kontext trust scoring.\n *\n * @param input - Assessment input\n * @returns ComprehensiveRiskResult with combined scoring\n */\n async getComprehensiveRisk(input: RiskAssessmentInput): Promise<ComprehensiveRiskResult> {\n const factors: ComprehensiveRiskFactor[] = [];\n\n // Circle address screening\n const addressScreen = await this.adapter.screenAddress(input.address, input.chain);\n const circleRiskScore = this.riskLevelToScore(addressScreen.riskLevel);\n\n factors.push({\n name: 'circle_address_screening',\n score: circleRiskScore,\n description: `Circle screening: ${addressScreen.riskLevel}${addressScreen.sanctioned ? ' (SANCTIONED)' : ''}`,\n });\n\n // Kontext trust score\n let kontextTrustScore = 50;\n if (input.agentId) {\n try {\n const trustResult = await this.kontext.getTrustScore(input.agentId);\n kontextTrustScore = trustResult.score;\n } catch {\n // Use default for unknown agents\n }\n }\n\n // Invert trust score to risk (high trust = low risk)\n const kontextRiskScore = 100 - kontextTrustScore;\n factors.push({\n name: 'kontext_trust_score',\n score: kontextRiskScore,\n description: `Kontext trust: ${kontextTrustScore}/100 (risk: ${kontextRiskScore}/100)`,\n });\n\n // Amount-based risk\n if (input.amount) {\n const amount = parseAmount(input.amount);\n let amountRisk = 0;\n if (!isNaN(amount)) {\n if (amount >= 100000) amountRisk = 80;\n else if (amount >= 50000) amountRisk = 60;\n else if (amount >= 10000) amountRisk = 40;\n else if (amount >= 3000) amountRisk = 20;\n else amountRisk = 5;\n }\n factors.push({\n name: 'amount_risk',\n score: amountRisk,\n description: `Amount ${input.amount}: risk score ${amountRisk}`,\n });\n }\n\n // Address format risk\n if (!isValidAddress(input.address)) {\n factors.push({\n name: 'address_format',\n score: 90,\n description: 'Invalid address format',\n });\n }\n\n // Compute combined score (weighted average)\n const totalScore = factors.reduce((sum, f) => sum + f.score, 0);\n const combinedScore = Math.round(totalScore / factors.length);\n\n // Determine overall risk and recommendation\n let overallRisk: ComprehensiveRiskResult['overallRisk'];\n let recommendation: ComprehensiveRiskResult['recommendation'];\n\n if (combinedScore >= 75 || addressScreen.sanctioned) {\n overallRisk = 'CRITICAL';\n recommendation = 'BLOCK';\n } else if (combinedScore >= 50) {\n overallRisk = 'HIGH';\n recommendation = 'MANUAL_REVIEW';\n } else if (combinedScore >= 25) {\n overallRisk = 'MEDIUM';\n recommendation = 'MANUAL_REVIEW';\n } else {\n overallRisk = 'LOW';\n recommendation = 'PROCEED';\n }\n\n // Log the assessment\n const logAction = await this.kontext.log({\n type: 'comprehensive_risk_assessment',\n description: `Risk assessment for ${input.address}: ${overallRisk} (score: ${combinedScore})`,\n agentId: input.agentId ?? 'circle-compliance-engine',\n metadata: {\n address: input.address,\n chain: input.chain,\n circleRiskScore,\n kontextTrustScore,\n combinedScore,\n overallRisk,\n recommendation,\n factorCount: factors.length,\n },\n });\n\n return {\n overallRisk,\n circleRiskScore,\n kontextTrustScore,\n combinedScore,\n recommendation,\n factors,\n auditLogId: logAction.id,\n };\n }\n\n // --------------------------------------------------------------------------\n // Internal Helpers\n // --------------------------------------------------------------------------\n\n /**\n * Run Kontext-side screening using USDC compliance checks and trust scoring.\n */\n private runKontextScreening(input: ScreenTransactionInput): {\n trustScore: number;\n anomalyDetected: boolean;\n complianceApproved: boolean;\n flags: string[];\n } {\n const flags: string[] = [];\n let anomalyDetected = false;\n\n // Run USDC compliance check\n const txInput: LogTransactionInput = {\n txHash: '0x' + '0'.repeat(64),\n chain: input.chain,\n amount: input.amount,\n token: (input.token ?? 'USDC') as 'USDC' | 'EURC',\n from: input.from,\n to: input.to,\n agentId: 'circle-compliance-engine',\n };\n\n const complianceResult = this.kontext.checkUsdcCompliance(txInput);\n\n if (!complianceResult.compliant) {\n flags.push('KONTEXT_COMPLIANCE_FAILED');\n }\n\n // Check for high-severity issues\n const criticalChecks = complianceResult.checks.filter(\n (c) => !c.passed && (c.severity === 'critical' || c.severity === 'high'),\n );\n if (criticalChecks.length > 0) {\n anomalyDetected = true;\n flags.push(...criticalChecks.map((c) => `KONTEXT_${c.name.toUpperCase()}`));\n }\n\n // Amount-based flags\n const amount = parseAmount(input.amount);\n if (!isNaN(amount) && amount >= 50000) {\n flags.push('KONTEXT_LARGE_TRANSACTION');\n }\n\n // Trust score -- use a default since we can't async here\n const trustScore = 50;\n\n return {\n trustScore,\n anomalyDetected,\n complianceApproved: complianceResult.compliant,\n flags,\n };\n }\n\n /**\n * Determine the combined decision based on both screening results.\n */\n private determineCombinedDecision(\n circleApproved: boolean,\n circleRisk: 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n kontextApproved: boolean,\n kontextTrustScore: number,\n ): 'APPROVE' | 'REVIEW' | 'BLOCK' {\n // BLOCK if Circle flags as SEVERE or Kontext fails critically\n if (circleRisk === 'SEVERE') return 'BLOCK';\n if (!circleApproved && !kontextApproved) return 'BLOCK';\n\n // REVIEW if either system raises concerns\n if (circleRisk === 'HIGH' || !circleApproved) return 'REVIEW';\n if (!kontextApproved) return 'REVIEW';\n if (circleRisk === 'MEDIUM') return 'REVIEW';\n\n // APPROVE only when both systems agree\n return 'APPROVE';\n }\n\n /**\n * Convert a risk level string to a numeric score.\n */\n private riskLevelToScore(riskLevel: string): number {\n switch (riskLevel) {\n case 'SEVERE': return 95;\n case 'HIGH': return 70;\n case 'MEDIUM': return 40;\n case 'LOW': return 10;\n default: return 50;\n }\n }\n}\n","// ============================================================================\n// Kontext SDK - Circle Gas Station Integration\n// ============================================================================\n//\n// Integrates Circle's Gas Station (sponsored gas) feature with Kontext's\n// audit and compliance infrastructure. Gas Station allows applications to\n// sponsor gas fees for their users on supported chains.\n//\n// Supports two operating modes:\n// - **Simulation mode** (default): Simulates gas sponsorship eligibility\n// and estimation without real API calls.\n// - **Live mode**: When a Circle API key is provided, queries Circle's\n// Gas Station API for real eligibility and estimates.\n// ============================================================================\n\nimport type {\n Chain,\n ActionLog,\n} from '../types.js';\nimport { generateId, now, parseAmount } from '../utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Gas sponsorship eligibility result */\nexport interface GasEligibility {\n /** Whether the wallet is eligible for sponsored gas */\n eligible: boolean;\n /** Maximum sponsored amount in native token */\n maxSponsoredAmount: string;\n /** Supported operations */\n supportedOperations: string[];\n /** Remaining daily quota */\n remainingDailyQuota: string;\n /** Reason if not eligible */\n reason?: string;\n}\n\n/** Input for gas estimation */\nexport interface GasEstimateInput {\n /** Source wallet ID */\n walletId: string;\n /** Destination address */\n destinationAddress: string;\n /** Transfer amount */\n amount: string;\n /** Blockchain network */\n chain: Chain;\n /** Token being transferred */\n token?: string;\n}\n\n/** Gas estimate result */\nexport interface GasEstimate {\n /** Estimated gas cost in native token */\n estimatedGas: string;\n /** Whether this gas would be sponsored */\n sponsored: boolean;\n /** Amount the user would pay (zero if fully sponsored) */\n userCost: string;\n /** Amount Circle would sponsor */\n sponsoredAmount: string;\n /** Chain the estimate is for */\n chain: Chain;\n /** Native token used for gas */\n nativeToken: string;\n}\n\n/** Input for logging a gas sponsorship event */\nexport interface GasSponsorshipLog {\n /** Wallet ID that received sponsorship */\n walletId: string;\n /** Transaction hash of the sponsored transaction */\n transactionHash: string;\n /** Amount of gas sponsored */\n sponsoredGasAmount: string;\n /** Chain the sponsorship occurred on */\n chain: Chain;\n /** Agent that initiated the transaction */\n agent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Native gas tokens by chain */\nconst NATIVE_TOKENS: Record<string, string> = {\n ethereum: 'ETH',\n base: 'ETH',\n polygon: 'MATIC',\n arbitrum: 'ETH',\n optimism: 'ETH',\n arc: 'ARC',\n};\n\n/** Simulated gas prices in native token (very rough approximations) */\nconst SIMULATED_GAS_PRICES: Record<string, string> = {\n ethereum: '0.005',\n base: '0.0001',\n polygon: '0.01',\n arbitrum: '0.0003',\n optimism: '0.0002',\n arc: '0.0001',\n};\n\n/** Chains eligible for gas sponsorship */\nconst SPONSORSHIP_ELIGIBLE_CHAINS: Chain[] = [\n 'base',\n 'polygon',\n 'arbitrum',\n 'optimism',\n 'arc',\n];\n\n/**\n * Adapter interface for Circle Gas Station API.\n */\nexport interface GasStationAdapter {\n checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility>;\n estimateGas(input: GasEstimateInput): Promise<GasEstimate>;\n}\n\n// ============================================================================\n// Simulation Adapter\n// ============================================================================\n\n/**\n * Simulated Gas Station adapter for development and testing.\n */\nclass SimulatedGasStationAdapter implements GasStationAdapter {\n async checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility> {\n const eligible = SPONSORSHIP_ELIGIBLE_CHAINS.includes(chain);\n\n return {\n eligible,\n maxSponsoredAmount: eligible ? '0.01' : '0',\n supportedOperations: eligible\n ? ['transfer', 'approve', 'swap']\n : [],\n remainingDailyQuota: eligible ? '0.5' : '0',\n reason: eligible ? undefined : `Chain ${chain} is not eligible for gas sponsorship`,\n };\n }\n\n async estimateGas(input: GasEstimateInput): Promise<GasEstimate> {\n const gasPrice = SIMULATED_GAS_PRICES[input.chain] ?? '0.001';\n const nativeToken = NATIVE_TOKENS[input.chain] ?? 'ETH';\n const sponsored = SPONSORSHIP_ELIGIBLE_CHAINS.includes(input.chain);\n\n return {\n estimatedGas: gasPrice,\n sponsored,\n userCost: sponsored ? '0' : gasPrice,\n sponsoredAmount: sponsored ? gasPrice : '0',\n chain: input.chain,\n nativeToken,\n };\n }\n}\n\n// ============================================================================\n// Live Adapter\n// ============================================================================\n\n/**\n * Live Gas Station adapter that calls Circle's API.\n */\nclass LiveGasStationAdapter implements GasStationAdapter {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.circle.com/v1/w3s';\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Circle Gas Station API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data as T;\n }\n\n async checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility> {\n try {\n const result = await this.request<{\n data: {\n eligible: boolean;\n maxSponsoredAmount: string;\n supportedOperations: string[];\n remainingDailyQuota: string;\n }\n }>('GET', `/gas-station/eligibility?walletId=${walletId}&chain=${chain}`);\n return result.data;\n } catch {\n // Fallback to simulation\n const sim = new SimulatedGasStationAdapter();\n return sim.checkEligibility(walletId, chain);\n }\n }\n\n async estimateGas(input: GasEstimateInput): Promise<GasEstimate> {\n try {\n const result = await this.request<{ data: GasEstimate }>('POST', '/gas-station/estimate', input);\n return result.data;\n } catch {\n // Fallback to simulation\n const sim = new SimulatedGasStationAdapter();\n return sim.estimateGas(input);\n }\n }\n}\n\n// ============================================================================\n// Kontext Client Interface (subset needed by this module)\n// ============================================================================\n\n/** Minimal interface for the Kontext client used by GasStationManager */\ninterface KontextLike {\n log(input: { type: string; description: string; agentId: string; metadata?: Record<string, unknown> }): Promise<ActionLog>;\n}\n\n// ============================================================================\n// GasStationManager\n// ============================================================================\n\n/**\n * Manages Circle Gas Station (sponsored gas) with integrated Kontext audit\n * logging for compliance tracking.\n *\n * Gas sponsorship events are logged through Kontext's tamper-evident audit\n * system to maintain a clear record of subsidized transactions.\n *\n * @example\n * ```typescript\n * const kontext = Kontext.init({ projectId: 'my-project', environment: 'production' });\n * const gasStation = new GasStationManager(kontext);\n *\n * const eligibility = await gasStation.checkEligibility('wallet-123', 'base');\n * if (eligibility.eligible) {\n * const estimate = await gasStation.estimateGas({\n * walletId: 'wallet-123',\n * destinationAddress: '0x...',\n * amount: '100',\n * chain: 'base',\n * });\n * console.log(`Gas sponsored: ${estimate.sponsored}`);\n * }\n * ```\n */\nexport class GasStationManager {\n private readonly kontext: KontextLike;\n private readonly adapter: GasStationAdapter;\n private readonly isLiveMode: boolean;\n\n /**\n * Create a new GasStationManager.\n *\n * @param kontextClient - Initialized Kontext SDK client\n * @param circleApiKey - Circle API key (optional; omit for simulation mode)\n */\n constructor(kontextClient: KontextLike, circleApiKey?: string) {\n this.kontext = kontextClient;\n this.isLiveMode = !!circleApiKey;\n this.adapter = circleApiKey\n ? new LiveGasStationAdapter(circleApiKey)\n : new SimulatedGasStationAdapter();\n }\n\n /**\n * Check if a wallet is eligible for gas sponsorship on a given chain.\n *\n * @param walletId - Wallet identifier\n * @param chain - Blockchain network\n * @returns GasEligibility with details\n */\n async checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility> {\n const eligibility = await this.adapter.checkEligibility(walletId, chain);\n\n // Log the eligibility check\n await this.kontext.log({\n type: 'gas_eligibility_check',\n description: `Gas eligibility check for wallet ${walletId} on ${chain}: ${eligibility.eligible ? 'eligible' : 'not eligible'}`,\n agentId: 'gas-station-manager',\n metadata: {\n walletId,\n chain,\n eligible: eligibility.eligible,\n maxSponsoredAmount: eligibility.maxSponsoredAmount,\n remainingDailyQuota: eligibility.remainingDailyQuota,\n reason: eligibility.reason,\n },\n });\n\n return eligibility;\n }\n\n /**\n * Estimate gas cost for a transfer and determine sponsorship.\n *\n * @param input - Transfer details for estimation\n * @returns GasEstimate with sponsorship information\n */\n async estimateGas(input: GasEstimateInput): Promise<GasEstimate> {\n const estimate = await this.adapter.estimateGas(input);\n\n // Log the estimate\n await this.kontext.log({\n type: 'gas_estimate',\n description: `Gas estimate for ${input.amount} ${input.token ?? 'USDC'} transfer on ${input.chain}: ${estimate.estimatedGas} ${estimate.nativeToken}${estimate.sponsored ? ' (sponsored)' : ''}`,\n agentId: 'gas-station-manager',\n metadata: {\n walletId: input.walletId,\n destinationAddress: input.destinationAddress,\n amount: input.amount,\n chain: input.chain,\n token: input.token,\n estimatedGas: estimate.estimatedGas,\n sponsored: estimate.sponsored,\n userCost: estimate.userCost,\n sponsoredAmount: estimate.sponsoredAmount,\n },\n });\n\n return estimate;\n }\n\n /**\n * Log a gas sponsorship event for audit purposes.\n *\n * Call this after a sponsored transaction has been confirmed on-chain\n * to record the sponsorship in Kontext's audit trail.\n *\n * @param input - Sponsorship event details\n * @returns The created ActionLog entry\n */\n async logGasSponsorship(input: GasSponsorshipLog): Promise<ActionLog> {\n const nativeToken = NATIVE_TOKENS[input.chain] ?? 'ETH';\n\n const action = await this.kontext.log({\n type: 'gas_sponsorship',\n description: `Gas sponsorship: ${input.sponsoredGasAmount} ${nativeToken} for wallet ${input.walletId} on ${input.chain} (tx: ${input.transactionHash})`,\n agentId: input.agent ?? 'gas-station-manager',\n metadata: {\n walletId: input.walletId,\n transactionHash: input.transactionHash,\n sponsoredGasAmount: input.sponsoredGasAmount,\n chain: input.chain,\n nativeToken,\n ...input.metadata,\n },\n });\n\n return action;\n }\n\n /**\n * Get the list of chains eligible for gas sponsorship.\n *\n * @returns Array of supported chains\n */\n static getEligibleChains(): Chain[] {\n return [...SPONSORSHIP_ELIGIBLE_CHAINS];\n }\n\n /**\n * Get the native gas token for a chain.\n *\n * @param chain - Blockchain network\n * @returns Native token symbol\n */\n static getNativeToken(chain: Chain): string {\n return NATIVE_TOKENS[chain] ?? 'ETH';\n }\n}\n","// ============================================================================\n// Kontext SDK - Webhook Manager\n// ============================================================================\n\nimport type { AnomalyEvent, TrustScore } from './types.js';\nimport type { Task } from './types.js';\nimport { generateId, now } from './utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Supported webhook event types */\nexport type WebhookEventType =\n | 'anomaly.detected'\n | 'task.confirmed'\n | 'task.failed'\n | 'trust.score_changed';\n\n/** Webhook registration configuration */\nexport interface WebhookConfig {\n /** Unique identifier for this webhook */\n id: string;\n /** Target URL to receive webhook POST requests */\n url: string;\n /** Event types to listen for */\n events: WebhookEventType[];\n /** Optional secret for HMAC signature verification */\n secret?: string;\n /** Whether this webhook is active */\n active: boolean;\n /** When this webhook was registered */\n createdAt: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for registering a new webhook */\nexport interface RegisterWebhookInput {\n /** Target URL */\n url: string;\n /** Event types to listen for */\n events: WebhookEventType[];\n /** Optional secret for payload signing */\n secret?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Webhook delivery payload */\nexport interface WebhookPayload {\n /** Unique delivery ID */\n id: string;\n /** Event type */\n event: WebhookEventType;\n /** Timestamp of the event */\n timestamp: string;\n /** Event-specific data */\n data: Record<string, unknown>;\n}\n\n/** Result of a webhook delivery attempt */\nexport interface WebhookDeliveryResult {\n /** Webhook ID */\n webhookId: string;\n /** Delivery payload ID */\n payloadId: string;\n /** Whether delivery succeeded */\n success: boolean;\n /** HTTP status code (if applicable) */\n statusCode: number | null;\n /** Number of attempts made */\n attempts: number;\n /** Error message if failed */\n error: string | null;\n /** Timestamp of last attempt */\n lastAttemptAt: string;\n}\n\n/** Retry configuration */\nexport interface WebhookRetryConfig {\n /** Maximum number of retry attempts */\n maxRetries: number;\n /** Base delay in milliseconds for exponential backoff */\n baseDelayMs: number;\n /** Maximum delay in milliseconds */\n maxDelayMs: number;\n}\n\n/** Default retry configuration */\nconst DEFAULT_RETRY_CONFIG: WebhookRetryConfig = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n};\n\n// ============================================================================\n// Webhook Manager\n// ============================================================================\n\n/**\n * WebhookManager handles registration and delivery of webhook notifications\n * for SDK events including anomaly detection, task confirmation, and trust\n * score changes.\n *\n * Features:\n * - Register multiple webhook URLs with event type filtering\n * - Automatic retry with exponential backoff on delivery failure\n * - Delivery result tracking\n * - Enable/disable individual webhooks\n *\n * @example\n * ```typescript\n * const manager = new WebhookManager();\n *\n * manager.register({\n * url: 'https://example.com/webhooks/kontext',\n * events: ['anomaly.detected', 'task.confirmed'],\n * });\n *\n * // Webhooks fire automatically when events occur\n * await manager.notifyAnomalyDetected(anomalyEvent);\n * ```\n */\nexport class WebhookManager {\n private webhooks: Map<string, WebhookConfig> = new Map();\n private deliveryResults: WebhookDeliveryResult[] = [];\n private retryConfig: WebhookRetryConfig;\n private fetchFn: typeof fetch;\n\n constructor(retryConfig?: Partial<WebhookRetryConfig>, fetchFn?: typeof fetch) {\n this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };\n this.fetchFn = fetchFn ?? globalThis.fetch;\n }\n\n /**\n * Register a new webhook endpoint.\n *\n * @param input - Webhook configuration\n * @returns The created WebhookConfig\n */\n register(input: RegisterWebhookInput): WebhookConfig {\n if (!input.url || input.url.trim() === '') {\n throw new Error('Webhook URL is required');\n }\n\n if (!input.events || input.events.length === 0) {\n throw new Error('At least one event type is required');\n }\n\n const config: WebhookConfig = {\n id: generateId(),\n url: input.url,\n events: input.events,\n secret: input.secret,\n active: true,\n createdAt: now(),\n metadata: input.metadata,\n };\n\n this.webhooks.set(config.id, config);\n\n return config;\n }\n\n /**\n * Unregister a webhook by ID.\n *\n * @param webhookId - The webhook to remove\n * @returns Whether the webhook was found and removed\n */\n unregister(webhookId: string): boolean {\n return this.webhooks.delete(webhookId);\n }\n\n /**\n * Enable or disable a webhook.\n *\n * @param webhookId - The webhook to update\n * @param active - Whether to enable or disable\n * @returns The updated WebhookConfig, or undefined if not found\n */\n setActive(webhookId: string, active: boolean): WebhookConfig | undefined {\n const webhook = this.webhooks.get(webhookId);\n if (!webhook) return undefined;\n\n const updated = { ...webhook, active };\n this.webhooks.set(webhookId, updated);\n return updated;\n }\n\n /**\n * Get all registered webhooks.\n */\n getWebhooks(): WebhookConfig[] {\n return Array.from(this.webhooks.values());\n }\n\n /**\n * Get a specific webhook by ID.\n */\n getWebhook(webhookId: string): WebhookConfig | undefined {\n return this.webhooks.get(webhookId);\n }\n\n /**\n * Get delivery results for a specific webhook or all webhooks.\n */\n getDeliveryResults(webhookId?: string): WebhookDeliveryResult[] {\n if (webhookId) {\n return this.deliveryResults.filter((r) => r.webhookId === webhookId);\n }\n return [...this.deliveryResults];\n }\n\n /**\n * Notify all subscribed webhooks of an anomaly detection event.\n *\n * @param anomaly - The detected anomaly event\n * @returns Array of delivery results\n */\n async notifyAnomalyDetected(anomaly: AnomalyEvent): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'anomaly.detected',\n timestamp: now(),\n data: {\n anomalyId: anomaly.id,\n type: anomaly.type,\n severity: anomaly.severity,\n description: anomaly.description,\n agentId: anomaly.agentId,\n actionId: anomaly.actionId,\n detectedAt: anomaly.detectedAt,\n data: anomaly.data,\n },\n };\n\n return this.deliver('anomaly.detected', payload);\n }\n\n /**\n * Notify all subscribed webhooks of a task confirmation.\n *\n * @param task - The confirmed task\n * @returns Array of delivery results\n */\n async notifyTaskConfirmed(task: Task): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'task.confirmed',\n timestamp: now(),\n data: {\n taskId: task.id,\n description: task.description,\n agentId: task.agentId,\n status: task.status,\n confirmedAt: task.confirmedAt,\n correlationId: task.correlationId,\n },\n };\n\n return this.deliver('task.confirmed', payload);\n }\n\n /**\n * Notify all subscribed webhooks of a task failure.\n *\n * @param task - The failed task\n * @returns Array of delivery results\n */\n async notifyTaskFailed(task: Task): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'task.failed',\n timestamp: now(),\n data: {\n taskId: task.id,\n description: task.description,\n agentId: task.agentId,\n status: task.status,\n correlationId: task.correlationId,\n metadata: task.metadata,\n },\n };\n\n return this.deliver('task.failed', payload);\n }\n\n /**\n * Notify all subscribed webhooks of a trust score change.\n *\n * @param trustScore - The new trust score\n * @param previousScore - The previous score value (if known)\n * @returns Array of delivery results\n */\n async notifyTrustScoreChanged(\n trustScore: TrustScore,\n previousScore?: number,\n ): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'trust.score_changed',\n timestamp: now(),\n data: {\n agentId: trustScore.agentId,\n score: trustScore.score,\n previousScore: previousScore ?? null,\n level: trustScore.level,\n factors: trustScore.factors,\n computedAt: trustScore.computedAt,\n },\n };\n\n return this.deliver('trust.score_changed', payload);\n }\n\n // --------------------------------------------------------------------------\n // Delivery with retry\n // --------------------------------------------------------------------------\n\n private async deliver(\n eventType: WebhookEventType,\n payload: WebhookPayload,\n ): Promise<WebhookDeliveryResult[]> {\n const subscribers = Array.from(this.webhooks.values()).filter(\n (w) => w.active && w.events.includes(eventType),\n );\n\n const results: WebhookDeliveryResult[] = [];\n\n for (const webhook of subscribers) {\n const result = await this.deliverToWebhook(webhook, payload);\n results.push(result);\n this.deliveryResults.push(result);\n }\n\n return results;\n }\n\n private async deliverToWebhook(\n webhook: WebhookConfig,\n payload: WebhookPayload,\n ): Promise<WebhookDeliveryResult> {\n let lastError: string | null = null;\n let statusCode: number | null = null;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n // Exponential backoff: wait before retries (not before first attempt)\n if (attempt > 0) {\n const delay = Math.min(\n this.retryConfig.baseDelayMs * Math.pow(2, attempt - 1),\n this.retryConfig.maxDelayMs,\n );\n await this.sleep(delay);\n }\n\n const response = await this.fetchFn(webhook.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Kontext-Event': payload.event,\n 'X-Kontext-Delivery': payload.id,\n ...(webhook.secret\n ? { 'X-Kontext-Signature': await this.computeSignature(payload, webhook.secret) }\n : {}),\n },\n body: JSON.stringify(payload),\n });\n\n statusCode = response.status;\n\n if (response.ok) {\n return {\n webhookId: webhook.id,\n payloadId: payload.id,\n success: true,\n statusCode,\n attempts: attempt + 1,\n error: null,\n lastAttemptAt: now(),\n };\n }\n\n lastError = `HTTP ${response.status}`;\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n }\n }\n\n return {\n webhookId: webhook.id,\n payloadId: payload.id,\n success: false,\n statusCode,\n attempts: this.retryConfig.maxRetries + 1,\n error: lastError,\n lastAttemptAt: now(),\n };\n }\n\n private async computeSignature(payload: WebhookPayload, secret: string): Promise<string> {\n // Use the built-in crypto module for HMAC signature\n const { createHmac } = await import('crypto');\n const hmac = createHmac('sha256', secret);\n hmac.update(JSON.stringify(payload));\n return hmac.digest('hex');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","// ============================================================================\n// Kontext SDK - Vercel AI SDK Integration\n// ============================================================================\n//\n// Provides middleware for the Vercel AI SDK (`ai` npm package) that\n// automatically logs every LLM call, tool invocation, and streaming\n// result into the Kontext tamper-evident digest chain.\n//\n// This enables compliance-grade audit trails for any AI application\n// built on Next.js + Vercel AI SDK with zero application code changes.\n//\n// Middleware pattern: https://sdk.vercel.ai/docs/ai-sdk-core/middleware\n// ============================================================================\n\nimport { Kontext } from '../client.js';\nimport type { Environment } from '../types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** AI operation types recognized by the Vercel AI SDK middleware. */\nexport type AIOperationType = 'generate' | 'stream' | 'object' | 'embed' | 'embedMany';\n\n/**\n * Configuration options for the Kontext Vercel AI SDK middleware.\n *\n * Controls which operations are logged, how tool calls are handled,\n * and whether financial compliance checks are triggered.\n */\nexport interface KontextAIOptions {\n /** Agent identifier for audit logs. Defaults to `'vercel-ai'`. */\n agentId?: string;\n\n /**\n * Tool names that involve financial transactions.\n * When a tool call matches one of these names, Kontext will automatically\n * log a `LogTransactionInput` with the extracted amount, triggering\n * compliance checks and anomaly detection.\n */\n financialTools?: string[];\n\n /**\n * Whether to include tool call arguments in the audit log.\n * Defaults to `false` for privacy. Set to `true` for full traceability.\n */\n logToolArgs?: boolean;\n\n /**\n * Default currency for financial tool calls.\n * Defaults to `'USDC'`.\n */\n defaultCurrency?: string;\n\n /**\n * Trust score threshold (0-100). If the agent's trust score is below\n * this threshold, tool calls will be blocked and `onBlocked` will fire.\n */\n trustThreshold?: number;\n\n /**\n * Callback invoked when a tool call is blocked due to trust threshold\n * or other compliance rules.\n */\n onBlocked?: (toolCall: BlockedToolCall, reason: string) => void;\n}\n\n/**\n * A tool call that was blocked by the Kontext middleware.\n */\nexport interface BlockedToolCall {\n /** The name of the tool that was blocked. */\n toolName: string;\n /** The arguments that were passed to the tool. */\n args: unknown;\n}\n\n/**\n * Input options for the one-line `createKontextAI` setup function.\n * Combines Kontext SDK configuration with AI middleware options.\n */\nexport interface CreateKontextAIInput {\n /** Kontext project identifier. */\n projectId: string;\n\n /** Deployment environment. */\n environment?: Environment;\n\n /** Optional API key for cloud mode. */\n apiKey?: string;\n\n /** Enable debug logging. */\n debug?: boolean;\n\n /** Agent identifier for audit logs. */\n agentId?: string;\n\n /** Tool names that involve financial transactions. */\n financialTools?: string[];\n\n /** Whether to log tool arguments. */\n logToolArgs?: boolean;\n\n /** Default currency for financial tool calls. */\n defaultCurrency?: string;\n\n /** Trust score threshold for blocking tool calls. */\n trustThreshold?: number;\n\n /** Callback when a tool call is blocked. */\n onBlocked?: (toolCall: BlockedToolCall, reason: string) => void;\n}\n\n/**\n * Return type from `createKontextAI`.\n */\nexport interface CreateKontextAIResult {\n /** The wrapped language model with Kontext middleware applied. */\n model: unknown;\n /** The Kontext client instance for direct access to audit, trust, and compliance APIs. */\n kontext: Kontext;\n}\n\n/**\n * Options for the `withKontext` Next.js route handler wrapper.\n */\nexport interface WithKontextOptions {\n /** Kontext project identifier. */\n projectId?: string;\n\n /** Deployment environment. */\n environment?: Environment;\n\n /** Optional API key for cloud mode. */\n apiKey?: string;\n\n /** Agent identifier for audit logs. */\n agentId?: string;\n\n /** Enable debug logging. */\n debug?: boolean;\n}\n\n/**\n * Context object passed to route handlers wrapped with `withKontext`.\n * Provides a pre-configured Kontext client and a helper to wrap AI models.\n */\nexport interface KontextAIContext {\n /** The Kontext client instance. */\n kontext: Kontext;\n\n /**\n * Wrap an AI model with Kontext middleware for automatic audit logging.\n *\n * @param model - A Vercel AI SDK language model\n * @param options - Additional middleware options\n * @returns The wrapped model\n */\n wrapModel: (model: unknown, options?: KontextAIOptions) => unknown;\n\n /** Unique request identifier for correlating logs. */\n requestId: string;\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\n/**\n * Creates a Kontext middleware object for the Vercel AI SDK.\n *\n * This middleware intercepts every `generateText()`, `streamText()`, and\n * `generateObject()` call and automatically logs each operation, tool\n * invocation, and result into the Kontext tamper-evident digest chain.\n *\n * The middleware conforms to the Vercel AI SDK middleware interface:\n * - `transformParams` — Logs the AI request before execution\n * - `wrapGenerate` — Wraps synchronous generation to log tool calls and results\n * - `wrapStream` — Wraps streaming generation to log stream lifecycle events\n *\n * @param kontext - An initialized Kontext client instance\n * @param options - Middleware configuration options\n * @returns A Vercel AI SDK middleware object\n *\n * @example\n * ```typescript\n * import { Kontext } from 'kontext-sdk';\n * import { experimental_wrapLanguageModel as wrapLanguageModel } from 'ai';\n * import { openai } from '@ai-sdk/openai';\n *\n * const kontext = Kontext.init({ projectId: 'my-app', environment: 'production' });\n *\n * const model = wrapLanguageModel({\n * model: openai('gpt-4o'),\n * middleware: kontextMiddleware(kontext, {\n * agentId: 'payment-agent',\n * financialTools: ['transfer_usdc', 'send_payment'],\n * }),\n * });\n *\n * // Every generateText / streamText call is now automatically audited.\n * ```\n */\nexport function kontextMiddleware(kontext: Kontext, options?: KontextAIOptions) {\n const agentId = options?.agentId ?? 'vercel-ai';\n const logToolArgs = options?.logToolArgs ?? false;\n const financialTools = options?.financialTools ?? [];\n const defaultCurrency = options?.defaultCurrency ?? 'USDC';\n const trustThreshold = options?.trustThreshold;\n const onBlocked = options?.onBlocked;\n\n return {\n /**\n * Logs the AI request parameters before the model is invoked.\n * Captures the operation type, model ID, tool count, and generation settings.\n */\n transformParams: async ({ params, type }: { params: Record<string, unknown>; type: string }) => {\n const modelInfo = params['model'] as { modelId?: string } | undefined;\n const tools = params['tools'];\n\n await kontext.log({\n type: `ai_${type}`,\n description: `AI ${type} request to ${modelInfo?.modelId ?? 'unknown'} model`,\n agentId,\n metadata: {\n model: modelInfo?.modelId ?? 'unknown',\n toolCount: Array.isArray(tools) ? tools.length : 0,\n maxTokens: params['maxTokens'] ?? null,\n temperature: params['temperature'] ?? null,\n operationType: type,\n },\n });\n\n return params;\n },\n\n /**\n * Wraps synchronous generation (`generateText`, `generateObject`).\n * After the model returns, logs every tool call individually and the\n * overall response. For financial tools, automatically creates\n * compliance-tracked transaction records.\n */\n wrapGenerate: async ({\n doGenerate,\n params,\n }: {\n doGenerate: () => Promise<Record<string, unknown>>;\n params: Record<string, unknown>;\n }) => {\n const startTime = Date.now();\n\n // Check trust threshold before generation\n if (trustThreshold !== undefined) {\n const trustScore = await kontext.getTrustScore(agentId);\n if (trustScore.score < trustThreshold) {\n await kontext.log({\n type: 'ai_blocked',\n description: `AI generation blocked: agent trust score ${trustScore.score} below threshold ${trustThreshold}`,\n agentId,\n metadata: {\n trustScore: trustScore.score,\n trustLevel: trustScore.level,\n threshold: trustThreshold,\n },\n });\n\n throw new Error(\n `Kontext: AI generation blocked. Agent \"${agentId}\" trust score (${trustScore.score}) ` +\n `is below the required threshold (${trustThreshold}).`,\n );\n }\n }\n\n const result = await doGenerate();\n const duration = Date.now() - startTime;\n const modelInfo = params['model'] as { modelId?: string } | undefined;\n\n // Log each tool call\n const toolCalls = result['toolCalls'] as Array<{ toolName: string; args: unknown }> | undefined;\n if (toolCalls && toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n // Check if this specific tool should be blocked\n if (trustThreshold !== undefined && financialTools.includes(toolCall.toolName)) {\n const trustScore = await kontext.getTrustScore(agentId);\n if (trustScore.score < trustThreshold) {\n if (onBlocked) {\n onBlocked({ toolName: toolCall.toolName, args: toolCall.args }, `Trust score ${trustScore.score} below threshold ${trustThreshold}`);\n }\n\n await kontext.log({\n type: 'ai_tool_blocked',\n description: `Financial tool \"${toolCall.toolName}\" blocked: trust score ${trustScore.score} below threshold ${trustThreshold}`,\n agentId,\n metadata: {\n toolName: toolCall.toolName,\n trustScore: trustScore.score,\n threshold: trustThreshold,\n },\n });\n\n continue;\n }\n }\n\n // Log the tool call\n await kontext.log({\n type: 'ai_tool_call',\n description: `Tool call: ${toolCall.toolName}`,\n agentId,\n metadata: {\n toolName: toolCall.toolName,\n args: logToolArgs ? toolCall.args : '[redacted]',\n duration,\n model: modelInfo?.modelId ?? 'unknown',\n },\n });\n\n // For financial tools, extract and log a transaction\n if (financialTools.includes(toolCall.toolName)) {\n const amount = extractAmount(toolCall.args);\n if (amount !== null) {\n await kontext.log({\n type: 'ai_financial_tool_call',\n description: `Financial tool \"${toolCall.toolName}\" invoked with amount ${amount} ${defaultCurrency}`,\n agentId,\n metadata: {\n toolName: toolCall.toolName,\n amount: amount.toString(),\n currency: defaultCurrency,\n toolArgs: logToolArgs ? toolCall.args : '[redacted]',\n },\n });\n }\n }\n }\n }\n\n // Log the overall completion\n const usage = result['usage'] as { promptTokens?: number; completionTokens?: number; totalTokens?: number } | undefined;\n await kontext.log({\n type: 'ai_response',\n description: `AI response completed in ${duration}ms`,\n agentId,\n metadata: {\n duration,\n toolCallCount: toolCalls?.length ?? 0,\n finishReason: result['finishReason'] ?? 'unknown',\n promptTokens: usage?.promptTokens ?? null,\n completionTokens: usage?.completionTokens ?? null,\n totalTokens: usage?.totalTokens ?? null,\n model: modelInfo?.modelId ?? 'unknown',\n },\n });\n\n return result;\n },\n\n /**\n * Wraps streaming generation (`streamText`).\n * Pipes the response stream through a transform that monitors for\n * tool call chunks. On stream completion, logs the overall duration\n * and any tool calls that occurred during the stream.\n */\n wrapStream: async ({\n doStream,\n params,\n }: {\n doStream: () => Promise<{ stream: ReadableStream; [key: string]: unknown }>;\n params: Record<string, unknown>;\n }) => {\n const startTime = Date.now();\n const modelInfo = params['model'] as { modelId?: string } | undefined;\n\n // Log stream start\n await kontext.log({\n type: 'ai_stream_start',\n description: `AI stream started for model ${modelInfo?.modelId ?? 'unknown'}`,\n agentId,\n metadata: {\n model: modelInfo?.modelId ?? 'unknown',\n operationType: 'stream',\n },\n });\n\n const { stream, ...rest } = await doStream();\n\n const toolCallsInStream: Array<{ toolName: string; args: unknown }> = [];\n\n // Transform stream to monitor and log tool calls\n const transformedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk: Record<string, unknown>, controller) {\n // Pass through all chunks unmodified\n controller.enqueue(chunk);\n\n // Track tool call chunks for post-stream logging\n if (chunk['type'] === 'tool-call') {\n const toolName = chunk['toolName'] as string;\n const args = chunk['args'] as unknown;\n toolCallsInStream.push({ toolName, args });\n }\n },\n async flush() {\n const duration = Date.now() - startTime;\n\n // Log each tool call found in the stream\n for (const toolCall of toolCallsInStream) {\n await kontext.log({\n type: 'ai_tool_call',\n description: `Tool call (stream): ${toolCall.toolName}`,\n agentId,\n metadata: {\n toolName: toolCall.toolName,\n args: logToolArgs ? toolCall.args : '[redacted]',\n duration,\n model: modelInfo?.modelId ?? 'unknown',\n source: 'stream',\n },\n });\n\n // Financial tool logging in stream\n if (financialTools.includes(toolCall.toolName)) {\n const amount = extractAmount(toolCall.args);\n if (amount !== null) {\n await kontext.log({\n type: 'ai_financial_tool_call',\n description: `Financial tool \"${toolCall.toolName}\" invoked via stream with amount ${amount} ${defaultCurrency}`,\n agentId,\n metadata: {\n toolName: toolCall.toolName,\n amount: amount.toString(),\n currency: defaultCurrency,\n source: 'stream',\n },\n });\n }\n }\n }\n\n // Log stream completion\n await kontext.log({\n type: 'ai_stream_complete',\n description: `AI stream completed in ${duration}ms with ${toolCallsInStream.length} tool call(s)`,\n agentId,\n metadata: {\n duration,\n toolCallCount: toolCallsInStream.length,\n model: modelInfo?.modelId ?? 'unknown',\n },\n });\n },\n }),\n );\n\n return { stream: transformedStream, ...rest };\n },\n };\n}\n\n// ============================================================================\n// Model Wrapper\n// ============================================================================\n\n/**\n * Wraps a Vercel AI SDK language model with Kontext middleware for\n * automatic audit logging of all AI operations.\n *\n * This function applies the Kontext middleware using the Vercel AI SDK's\n * `experimental_wrapLanguageModel` pattern. The returned model can be\n * used directly with `generateText()`, `streamText()`, and `generateObject()`.\n *\n * @param model - A Vercel AI SDK language model (e.g., `openai('gpt-4o')`)\n * @param kontext - An initialized Kontext client instance\n * @param options - Middleware configuration options\n * @returns A wrapped language model with Kontext audit logging\n *\n * @example\n * ```typescript\n * import { openai } from '@ai-sdk/openai';\n * import { Kontext, kontextWrapModel } from 'kontext-sdk';\n * import { generateText } from 'ai';\n *\n * const kontext = Kontext.init({ projectId: 'my-app', environment: 'production' });\n * const model = kontextWrapModel(openai('gpt-4o'), kontext, {\n * agentId: 'support-agent',\n * financialTools: ['transfer_usdc'],\n * });\n *\n * const result = await generateText({ model, prompt: 'Send 100 USDC to Alice' });\n * // All operations automatically logged with SHA-256 digest chains\n * ```\n */\nexport function kontextWrapModel(\n model: unknown,\n kontext: Kontext,\n options?: KontextAIOptions,\n): unknown {\n const middleware = kontextMiddleware(kontext, options);\n\n // Return a proxy object that delegates to the original model\n // while intercepting generate/stream calls through our middleware.\n // This follows the Vercel AI SDK middleware wrapping convention.\n return {\n ...(model as Record<string, unknown>),\n _kontextMiddleware: middleware,\n _originalModel: model,\n _kontextInstance: kontext,\n\n // When the Vercel AI SDK calls doGenerate, our middleware wraps it\n async doGenerate(params: Record<string, unknown>) {\n const transformedParams = await middleware.transformParams({\n params,\n type: 'generate',\n });\n\n const originalModel = model as { doGenerate: (p: Record<string, unknown>) => Promise<Record<string, unknown>> };\n return middleware.wrapGenerate({\n doGenerate: () => originalModel.doGenerate(transformedParams),\n params: transformedParams,\n });\n },\n\n // When the Vercel AI SDK calls doStream, our middleware wraps it\n async doStream(params: Record<string, unknown>) {\n const transformedParams = await middleware.transformParams({\n params,\n type: 'stream',\n });\n\n const originalModel = model as { doStream: (p: Record<string, unknown>) => Promise<{ stream: ReadableStream; [key: string]: unknown }> };\n return middleware.wrapStream({\n doStream: () => originalModel.doStream(transformedParams),\n params: transformedParams,\n });\n },\n };\n}\n\n// ============================================================================\n// One-Line Setup\n// ============================================================================\n\n/**\n * One-line Kontext + Vercel AI SDK setup.\n *\n * Creates a Kontext client and wraps a Vercel AI SDK language model in a\n * single function call. The returned model automatically logs every AI\n * operation with tamper-evident SHA-256 digest chains.\n *\n * @param model - A Vercel AI SDK language model (e.g., `openai('gpt-4o')`)\n * @param input - Combined Kontext and AI middleware configuration\n * @returns An object containing the wrapped model and the Kontext client\n *\n * @example\n * ```typescript\n * import { openai } from '@ai-sdk/openai';\n * import { createKontextAI } from 'kontext-sdk';\n * import { generateText } from 'ai';\n *\n * const { model, kontext } = createKontextAI(openai('gpt-4o'), {\n * projectId: 'payment-app',\n * agentId: 'payment-agent',\n * financialTools: ['transfer_usdc', 'send_payment'],\n * });\n *\n * const result = await generateText({ model, tools, prompt: 'Pay 50 USDC' });\n * // All tool calls are automatically logged with digest chains.\n *\n * // Access the audit trail\n * const chain = kontext.exportDigestChain();\n * console.log('Terminal digest:', kontext.getTerminalDigest());\n * ```\n */\nexport function createKontextAI(\n model: unknown,\n input: CreateKontextAIInput,\n): CreateKontextAIResult {\n const kontext = Kontext.init({\n projectId: input.projectId,\n environment: input.environment ?? 'development',\n apiKey: input.apiKey,\n debug: input.debug,\n });\n\n const wrappedModel = kontextWrapModel(model, kontext, {\n agentId: input.agentId,\n financialTools: input.financialTools,\n logToolArgs: input.logToolArgs,\n defaultCurrency: input.defaultCurrency,\n trustThreshold: input.trustThreshold,\n onBlocked: input.onBlocked,\n });\n\n return { model: wrappedModel, kontext };\n}\n\n// ============================================================================\n// Next.js Route Handler\n// ============================================================================\n\n/**\n * Wraps a Next.js API route handler with Kontext audit logging.\n *\n * Every incoming request is logged with a unique request ID, and a\n * pre-configured `KontextAIContext` is passed to the handler. The context\n * provides a `wrapModel()` helper for wrapping AI models inside the handler.\n *\n * On completion, the request lifecycle (including duration and status code)\n * is logged to the digest chain.\n *\n * @param handler - The route handler function\n * @param options - Kontext configuration for the route\n * @returns A standard Next.js route handler function\n *\n * @example\n * ```typescript\n * // app/api/chat/route.ts\n * import { withKontext } from 'kontext-sdk';\n * import { openai } from '@ai-sdk/openai';\n * import { generateText } from 'ai';\n *\n * export const POST = withKontext(async (req, ctx) => {\n * const { messages } = await req.json();\n *\n * const model = ctx.wrapModel(openai('gpt-4o'), {\n * financialTools: ['transfer_usdc'],\n * });\n *\n * const result = await generateText({ model, messages });\n * return Response.json(result);\n * }, {\n * projectId: 'my-app',\n * environment: 'production',\n * });\n * ```\n */\nexport function withKontext(\n handler: (req: Request, ctx: KontextAIContext) => Promise<Response>,\n options?: WithKontextOptions,\n): (req: Request) => Promise<Response> {\n // Initialize a shared Kontext client for the route\n const kontext = Kontext.init({\n projectId: options?.projectId ?? process.env['KONTEXT_PROJECT_ID'] ?? 'default',\n environment: options?.environment ?? (process.env['NODE_ENV'] === 'production' ? 'production' : 'development') as Environment,\n apiKey: options?.apiKey ?? process.env['KONTEXT_API_KEY'],\n debug: options?.debug,\n });\n\n const agentId = options?.agentId ?? 'nextjs-route';\n\n return async (req: Request): Promise<Response> => {\n const requestId = generateRequestId();\n const startTime = Date.now();\n\n // Log the incoming request\n await kontext.log({\n type: 'http_request',\n description: `${req.method} ${new URL(req.url).pathname}`,\n agentId,\n correlationId: requestId,\n metadata: {\n method: req.method,\n url: req.url,\n requestId,\n },\n });\n\n // Build the context\n const ctx: KontextAIContext = {\n kontext,\n requestId,\n wrapModel: (model: unknown, aiOptions?: KontextAIOptions) =>\n kontextWrapModel(model, kontext, {\n ...aiOptions,\n agentId: aiOptions?.agentId ?? agentId,\n }),\n };\n\n try {\n const response = await handler(req, ctx);\n const duration = Date.now() - startTime;\n\n // Log successful response\n await kontext.log({\n type: 'http_response',\n description: `Response ${response.status} in ${duration}ms`,\n agentId,\n correlationId: requestId,\n metadata: {\n status: response.status,\n duration,\n requestId,\n terminalDigest: kontext.getTerminalDigest(),\n },\n });\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n // Log the error\n await kontext.log({\n type: 'http_error',\n description: `Request failed after ${duration}ms: ${error instanceof Error ? error.message : 'Unknown error'}`,\n agentId,\n correlationId: requestId,\n metadata: {\n error: error instanceof Error ? error.message : String(error),\n duration,\n requestId,\n },\n });\n\n throw error;\n }\n };\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Extract a numeric amount from tool call arguments.\n *\n * Searches for common field names (`amount`, `value`, `total`, `payment`,\n * `transfer`) in the arguments object and returns the first valid number found.\n *\n * @param args - The tool call arguments (typically a JSON object)\n * @returns The extracted numeric amount, or `null` if no amount was found\n */\nexport function extractAmount(args: unknown): number | null {\n if (args === null || args === undefined) return null;\n\n if (typeof args === 'number') return args;\n if (typeof args === 'string') {\n const parsed = parseFloat(args);\n return isNaN(parsed) ? null : parsed;\n }\n\n if (typeof args === 'object') {\n const obj = args as Record<string, unknown>;\n const amountFields = ['amount', 'value', 'total', 'payment', 'transfer', 'sum'];\n\n for (const field of amountFields) {\n if (field in obj) {\n const value = obj[field];\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (!isNaN(parsed)) return parsed;\n }\n }\n }\n\n // Recurse into nested objects (one level deep)\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const nested = extractAmount(value);\n if (nested !== null) return nested;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Generate a unique request identifier for correlating log entries\n * within a single HTTP request lifecycle.\n */\nfunction generateRequestId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `req_${crypto.randomUUID()}`;\n }\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `req_${timestamp}-${random}`;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/store.ts","../src/digest.ts","../src/utils.ts","../src/logger.ts","../src/tasks.ts","../src/audit.ts","../src/trust.ts","../src/anomaly.ts","../src/integrations/usdc.ts","../src/client.ts","../src/storage.ts","../src/integrations/cctp.ts","../src/integrations/circle-wallets.ts","../src/integrations/circle-compliance.ts","../src/integrations/gas-station.ts","../src/webhooks.ts","../src/integrations/vercel-ai.ts"],"names":["KontextErrorCode","createHash","path","fs","REPORTING_THRESHOLD","path2","fs2","relative","createHmac","resolve","timingSafeEqual"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================================\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';\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' | 'sar' | 'ctr';\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 (defaults to Kontext cloud API) */\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 * 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/**\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 /** 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 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 cryptocurrency transaction */\nexport interface LogTransactionInput {\n /** On-chain transaction hash */\n txHash: string;\n /** Blockchain network */\n chain: Chain;\n /** Transaction amount (string to preserve decimal precision) */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address */\n from: string;\n /** Recipient address */\n to: string;\n /** ID of the agent initiating the transaction */\n agentId: string;\n /** Optional correlation ID */\n correlationId?: string;\n /** Additional transaction metadata */\n metadata?: Record<string, unknown>;\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}\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// SAR/CTR Report Templates\n// ============================================================================\n\n/** Subject information for SAR/CTR reports */\nexport interface ReportSubject {\n /** Subject name or identifier */\n name: string;\n /** Agent ID (if applicable) */\n agentId?: string;\n /** Wallet addresses associated with the subject */\n addresses: string[];\n /** Additional identifying information */\n identifiers?: Record<string, string>;\n}\n\n/** Suspicious Activity Report template */\nexport interface SARReport {\n /** Report ID */\n id: string;\n /** Report type discriminator */\n type: 'sar';\n /** Generation timestamp */\n generatedAt: string;\n /** Reporting period */\n period: DateRange;\n /** Project ID */\n projectId: string;\n /** Filing institution information */\n filingInstitution: string;\n /** Subject(s) of the report */\n subjects: ReportSubject[];\n /** Narrative summary of suspicious activity */\n narrative: string;\n /** Suspicious activity categories */\n activityCategories: string[];\n /** Total amount involved */\n totalAmount: string;\n /** Currency/token */\n currency: string;\n /** Transactions flagged as suspicious */\n suspiciousTransactions: TransactionRecord[];\n /** Related anomalies */\n anomalies: AnomalyEvent[];\n /** Supporting action logs */\n supportingActions: ActionLog[];\n /** Whether this is a continuing activity report */\n isContinuingActivity: boolean;\n /** Prior report ID if continuing */\n priorReportId: string | null;\n /** Status of the report */\n status: 'draft' | 'review' | 'filed';\n}\n\n/** Currency Transaction Report template */\nexport interface CTRReport {\n /** Report ID */\n id: string;\n /** Report type discriminator */\n type: 'ctr';\n /** Generation timestamp */\n generatedAt: string;\n /** Reporting period */\n period: DateRange;\n /** Project ID */\n projectId: string;\n /** Filing institution information */\n filingInstitution: string;\n /** Person/entity conducting the transactions */\n conductors: ReportSubject[];\n /** Transactions included in the report */\n transactions: TransactionRecord[];\n /** Total cash-in amount */\n totalCashIn: string;\n /** Total cash-out amount */\n totalCashOut: string;\n /** Currency/token */\n currency: string;\n /** Whether multiple transactions are aggregated */\n isAggregated: boolean;\n /** Chains involved */\n chainsInvolved: Chain[];\n /** Supporting action logs */\n supportingActions: ActionLog[];\n /** Status of the report */\n status: 'draft' | 'review' | 'filed';\n}\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 */\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// Anomaly Detection\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/** 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 event callback */\nexport type AnomalyCallback = (anomaly: AnomalyEvent) => void;\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// Agent Reasoning\n// ============================================================================\n\n/** Input for logging agent reasoning */\nexport interface LogReasoningInput {\n /** ID of the agent making the decision */\n agentId: string;\n /** What action was taken or is being considered */\n action: string;\n /** The agent's reasoning/justification */\n reasoning: string;\n /** Optional confidence score (0-1) */\n confidence?: number;\n /** Optional additional context */\n context?: Record<string, unknown>;\n}\n\n/** A reasoning entry stored in the action log */\nexport interface ReasoningEntry {\n /** Unique reasoning entry identifier */\n id: string;\n /** Timestamp of the reasoning entry */\n timestamp: string;\n /** ID of the agent making the decision */\n agentId: string;\n /** What action was taken or is being considered */\n action: string;\n /** The agent's reasoning/justification */\n reasoning: string;\n /** Confidence score (0-1), defaults to 1.0 */\n confidence: number;\n /** Additional context */\n context: Record<string, unknown>;\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// 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}\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 - 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 // --------------------------------------------------------------------------\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 * 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 - 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 - 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 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 record: TransactionRecord = {\n id: generateId(),\n timestamp: now(),\n projectId: this.config.projectId,\n agentId: input.agentId,\n correlationId,\n type: 'transaction',\n description: `${input.token} transfer of ${input.amount} on ${input.chain}`,\n metadata: {\n ...input.metadata,\n },\n txHash: input.txHash,\n chain: input.chain,\n amount: input.amount,\n token: input.token,\n from: input.from,\n to: input.to,\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 // 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.txHash || input.txHash.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Transaction hash is required',\n { field: 'txHash' },\n );\n }\n\n if (!input.from || input.from.trim() === '') {\n throw new KontextError(\n KontextErrorCode.VALIDATION_ERROR,\n 'Sender address (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 address (to) is required',\n { field: 'to' },\n );\n }\n\n const validChains: Chain[] = ['ethereum', 'base', 'polygon', 'arbitrum', 'optimism', 'arc', 'avalanche', 'solana'];\n if (!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'];\n if (!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 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 ?? 'https://kontext-api-421314897784.us-central1.run.app';\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 SARReport,\n CTRReport,\n ReportSubject,\n DateRange,\n Chain,\n} from './types.js';\nimport { KontextError, KontextErrorCode } from './types.js';\nimport { KontextStore } from './store.js';\nimport { generateId, now, isWithinDateRange, toCsv, parseAmount } 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 = {\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 // SAR Report Generation\n // --------------------------------------------------------------------------\n\n /**\n * Generate a Suspicious Activity Report (SAR) template.\n *\n * This produces a structured SAR template populated with data from the SDK.\n * It is a template/structure, not an actual regulatory filing. Organizations\n * should review and supplement this data before formal submission.\n *\n * @param options - Report configuration including period and optional filters\n * @returns SARReport template populated with flagged transactions and anomalies\n *\n * @example\n * ```typescript\n * const sar = await exporter.generateSARReport({\n * type: 'sar',\n * period: { start: new Date('2026-01-01'), end: new Date() },\n * });\n * console.log(`SAR contains ${sar.suspiciousTransactions.length} flagged transactions`);\n * ```\n */\n async generateSARReport(options: ReportOptions): Promise<SARReport> {\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 anomalies = this.filterAnomalies(exportOptions);\n\n // Identify suspicious transactions: those with associated anomalies\n const anomalyActionIds = new Set(anomalies.map((a) => a.actionId));\n const suspiciousTransactions = transactions.filter(\n (tx) => anomalyActionIds.has(tx.id),\n );\n\n // If no directly linked suspicious transactions, include transactions\n // associated with agents who have anomalies\n const anomalyAgentIds = new Set(anomalies.map((a) => a.agentId));\n const additionalSuspicious = suspiciousTransactions.length === 0\n ? transactions.filter((tx) => anomalyAgentIds.has(tx.agentId))\n : [];\n\n const allSuspicious = [...suspiciousTransactions, ...additionalSuspicious];\n\n // Build subjects from agents involved in suspicious activity\n const subjectMap = new Map<string, ReportSubject>();\n for (const tx of allSuspicious) {\n if (!subjectMap.has(tx.agentId)) {\n const agentTxs = transactions.filter((t) => t.agentId === tx.agentId);\n const addresses = new Set<string>();\n for (const t of agentTxs) {\n addresses.add(t.from);\n addresses.add(t.to);\n }\n subjectMap.set(tx.agentId, {\n name: tx.agentId,\n agentId: tx.agentId,\n addresses: Array.from(addresses),\n });\n }\n }\n\n // Compute total amount involved\n const totalAmount = allSuspicious\n .reduce((sum, tx) => sum + (parseAmount(tx.amount) || 0), 0)\n .toFixed(2);\n\n // Determine primary token\n const tokenCounts = new Map<string, number>();\n for (const tx of allSuspicious) {\n tokenCounts.set(tx.token, (tokenCounts.get(tx.token) ?? 0) + 1);\n }\n const currency = tokenCounts.size > 0\n ? Array.from(tokenCounts.entries()).sort((a, b) => b[1] - a[1])[0]![0]\n : 'USDC';\n\n // Build activity categories from anomaly types\n const activityCategories = Array.from(\n new Set(anomalies.map((a) => this.anomalyTypeToCategory(a.type))),\n );\n\n // Generate narrative\n const narrative = this.generateSARNarrative(\n allSuspicious,\n anomalies,\n options.period,\n );\n\n return {\n id: generateId(),\n type: 'sar',\n generatedAt: now(),\n period: options.period,\n projectId: this.config.projectId,\n filingInstitution: this.config.projectId,\n subjects: Array.from(subjectMap.values()),\n narrative,\n activityCategories,\n totalAmount,\n currency,\n suspiciousTransactions: allSuspicious,\n anomalies,\n supportingActions: actions.filter((a) =>\n anomalyAgentIds.has(a.agentId),\n ),\n isContinuingActivity: false,\n priorReportId: null,\n status: 'draft',\n };\n }\n\n // --------------------------------------------------------------------------\n // CTR Report Generation\n // --------------------------------------------------------------------------\n\n /**\n * Generate a Currency Transaction Report (CTR) template.\n *\n * This produces a structured CTR template for transactions that meet or\n * exceed reporting thresholds. It is a template/structure, not an actual\n * regulatory filing. Organizations should review and supplement this data\n * before formal submission.\n *\n * @param options - Report configuration including period and optional filters\n * @returns CTRReport template populated with qualifying transactions\n *\n * @example\n * ```typescript\n * const ctr = await exporter.generateCTRReport({\n * type: 'ctr',\n * period: { start: new Date('2026-01-01'), end: new Date() },\n * });\n * console.log(`CTR covers ${ctr.transactions.length} reportable transactions`);\n * ```\n */\n async generateCTRReport(options: ReportOptions): Promise<CTRReport> {\n const REPORTING_THRESHOLD = 10000;\n\n const exportOptions: ExportOptions = {\n format: 'json',\n dateRange: options.period,\n agentIds: options.agentIds,\n includeTasks: false,\n includeAnomalies: false,\n };\n\n const actions = this.filterActions(exportOptions);\n const transactions = this.filterTransactions(exportOptions);\n\n // Filter transactions at or above the reporting threshold\n const reportableTransactions = transactions.filter((tx) => {\n const amount = parseAmount(tx.amount);\n return !isNaN(amount) && amount >= REPORTING_THRESHOLD;\n });\n\n // Also include aggregated transactions from the same agent/day that\n // together exceed the threshold (structuring detection)\n const agentDailyTotals = new Map<string, number>();\n for (const tx of transactions) {\n const day = tx.timestamp.split('T')[0];\n const key = `${tx.agentId}:${day}`;\n agentDailyTotals.set(key, (agentDailyTotals.get(key) ?? 0) + (parseAmount(tx.amount) || 0));\n }\n\n // Find agents with daily totals above threshold who have individual\n // transactions below threshold (potential structuring)\n const structuringKeys = new Set<string>();\n for (const [key, total] of agentDailyTotals.entries()) {\n if (total >= REPORTING_THRESHOLD) {\n structuringKeys.add(key);\n }\n }\n\n const reportableIds = new Set(reportableTransactions.map((tx) => tx.id));\n const additionalStructuring = transactions.filter((tx) => {\n if (reportableIds.has(tx.id)) return false;\n const day = tx.timestamp.split('T')[0];\n const key = `${tx.agentId}:${day}`;\n return structuringKeys.has(key);\n });\n\n const allReportable = [...reportableTransactions, ...additionalStructuring];\n const isAggregated = additionalStructuring.length > 0;\n\n // Build conductors\n const conductorMap = new Map<string, ReportSubject>();\n for (const tx of allReportable) {\n if (!conductorMap.has(tx.agentId)) {\n const agentTxs = allReportable.filter((t) => t.agentId === tx.agentId);\n const addresses = new Set<string>();\n for (const t of agentTxs) {\n addresses.add(t.from);\n addresses.add(t.to);\n }\n conductorMap.set(tx.agentId, {\n name: tx.agentId,\n agentId: tx.agentId,\n addresses: Array.from(addresses),\n });\n }\n }\n\n // Compute totals\n let cashIn = 0;\n let cashOut = 0;\n for (const tx of allReportable) {\n const amount = parseAmount(tx.amount) || 0;\n cashOut += amount; // Transfers out from the agent's perspective\n cashIn += amount; // Received on the other end\n }\n\n // Collect chains\n const chainsInvolved = Array.from(\n new Set(allReportable.map((tx) => tx.chain)),\n ) as Chain[];\n\n // Determine primary currency\n const tokenCounts = new Map<string, number>();\n for (const tx of allReportable) {\n tokenCounts.set(tx.token, (tokenCounts.get(tx.token) ?? 0) + 1);\n }\n const currency = tokenCounts.size > 0\n ? Array.from(tokenCounts.entries()).sort((a, b) => b[1] - a[1])[0]![0]\n : 'USDC';\n\n return {\n id: generateId(),\n type: 'ctr',\n generatedAt: now(),\n period: options.period,\n projectId: this.config.projectId,\n filingInstitution: this.config.projectId,\n conductors: Array.from(conductorMap.values()),\n transactions: allReportable,\n totalCashIn: cashIn.toFixed(2),\n totalCashOut: cashOut.toFixed(2),\n currency,\n isAggregated,\n chainsInvolved,\n supportingActions: actions.filter((a) =>\n conductorMap.has(a.agentId),\n ),\n status: 'draft',\n };\n }\n\n // --------------------------------------------------------------------------\n // SAR/CTR helpers\n // --------------------------------------------------------------------------\n\n private anomalyTypeToCategory(type: string): string {\n const mapping: Record<string, string> = {\n unusualAmount: 'Unusual transaction amount',\n frequencySpike: 'Unusually high transaction frequency',\n newDestination: 'Transactions to unknown destinations',\n offHoursActivity: 'Activity during unusual hours',\n rapidSuccession: 'Rapid succession of transactions',\n roundAmount: 'Potential structuring (round amounts)',\n };\n return mapping[type] ?? `Other: ${type}`;\n }\n\n private generateSARNarrative(\n transactions: TransactionRecord[],\n anomalies: AnomalyEvent[],\n period: DateRange,\n ): string {\n const startDate = period.start.toISOString().split('T')[0];\n const endDate = period.end.toISOString().split('T')[0];\n\n const parts: string[] = [];\n\n parts.push(\n `During the period from ${startDate} to ${endDate}, ` +\n `${transactions.length} transaction(s) were identified as potentially suspicious.`,\n );\n\n if (anomalies.length > 0) {\n const typeCounts = new Map<string, number>();\n for (const a of anomalies) {\n typeCounts.set(a.type, (typeCounts.get(a.type) ?? 0) + 1);\n }\n const typeDesc = Array.from(typeCounts.entries())\n .map(([type, count]) => `${this.anomalyTypeToCategory(type)} (${count} occurrence(s))`)\n .join('; ');\n\n parts.push(`Anomaly detection identified the following patterns: ${typeDesc}.`);\n }\n\n const totalAmount = transactions\n .reduce((sum, tx) => sum + (parseAmount(tx.amount) || 0), 0)\n .toFixed(2);\n parts.push(`Total amount involved: ${totalAmount}.`);\n\n const agents = new Set(transactions.map((t) => t.agentId));\n parts.push(`Agent(s) involved: ${Array.from(agents).join(', ')}.`);\n\n parts.push(\n 'This report is generated as a template for review. ' +\n 'Additional investigation and supporting documentation should be attached before filing.',\n );\n\n return parts.join(' ');\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 && !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 - 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 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}`,\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 - 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} exceeds threshold of ${this.thresholds.maxAmount}`,\n tx.agentId,\n tx.id,\n { amount: tx.amount, threshold: this.thresholds.maxAmount, token: tx.token },\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 - 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';\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: sourced from publicly known sanctions as of 2024.\n\n/** OFAC-sanctioned Ethereum addresses from the Treasury SDN list */\nlet SANCTIONED_ADDRESSES: string[] = [\n // Tornado Cash contracts (sanctioned August 2022)\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\n // Lazarus Group / North Korea (Ronin Bridge hack)\n '0x098B716B8Aaf21512996dC57EB0615e2383E2f96',\n '0xa0e1c89Ef1a489c9C7dE96311eD5Ce5D32c20E4B',\n '0x3Cffd56B47B7b41c56258D9C7731ABaDc360E460',\n '0x53b6936513e738f44FB50d2b9476730C0Ab3Bfc1',\n // Garantex exchange (sanctioned April 2022)\n '0x6F1cA141A28907F78Ebaa64f83E4AE6038d3cbe7',\n // Blender.io\n '0x23773E65ed146A459791799d01336DB287f25334',\n];\n\n/**\n * Pre-computed set of lowercased sanctioned addresses for O(1) lookups.\n */\nlet SANCTIONED_SET: Set<string> = new Set(\n SANCTIONED_ADDRESSES.map((addr) => addr.toLowerCase()),\n);\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 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 TrustScore,\n TransactionEvaluation,\n AnomalyDetectionConfig,\n AnomalyCallback,\n AnomalyEvent,\n UsdcComplianceCheck,\n SARReport,\n CTRReport,\n LogReasoningInput,\n ReasoningEntry,\n GenerateComplianceCertificateInput,\n ComplianceCertificate,\n} from './types.js';\nimport type { DigestVerification, DigestLink } from './digest.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 { TrustScorer } from './trust.js';\nimport { AnomalyDetector } from './anomaly.js';\nimport { UsdcCompliance } from './integrations/usdc.js';\nimport { createHash } from 'crypto';\nimport { generateId, now } from './utils.js';\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 trustScorer: TrustScorer;\n private readonly anomalyDetector: AnomalyDetector;\n private readonly mode: KontextMode;\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 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\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 // Run anomaly detection if enabled\n if (this.anomalyDetector.isEnabled()) {\n this.anomalyDetector.evaluateAction(action);\n }\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 this.validateMetadata(input.metadata);\n const record = await this.logger.logTransaction(input);\n\n // Run anomaly detection if enabled\n if (this.anomalyDetector.isEnabled()) {\n this.anomalyDetector.evaluateTransaction(record);\n }\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 }\n\n /**\n * Restore state from the attached storage adapter.\n * Loads previously persisted actions, transactions, tasks, and anomalies.\n * No-op if no storage adapter is configured.\n */\n async restore(): Promise<void> {\n await this.store.restore();\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 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 * Generate a Suspicious Activity Report (SAR) template.\n *\n * This produces a structured SAR template populated with data from the SDK.\n * It is a template/structure, not an actual regulatory filing.\n *\n * @param options - Report configuration\n * @returns SAR report template\n */\n async generateSARReport(options: ReportOptions): Promise<SARReport> {\n return this.auditExporter.generateSARReport(options);\n }\n\n /**\n * Generate a Currency Transaction Report (CTR) template.\n *\n * This produces a structured CTR template for transactions that meet or\n * exceed reporting thresholds. It is a template/structure, not an actual\n * regulatory filing.\n *\n * @param options - Report configuration\n * @returns CTR report template\n */\n async generateCTRReport(options: ReportOptions): Promise<CTRReport> {\n return this.auditExporter.generateCTRReport(options);\n }\n\n // --------------------------------------------------------------------------\n // Trust Scoring\n // --------------------------------------------------------------------------\n\n /**\n * Get the trust score for an agent.\n *\n * @param agentId - Agent identifier\n * @returns Trust score with factor breakdown\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.\n *\n * @param tx - Transaction to evaluate\n * @returns Transaction evaluation with risk score and recommendation\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 * @param config - Detection configuration\n */\n enableAnomalyDetection(config: AnomalyDetectionConfig): void {\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 // 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 // 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 // Agent Reasoning\n // --------------------------------------------------------------------------\n\n /**\n * Log an agent's reasoning/justification for an action.\n * The reasoning entry is recorded into the digest chain as a tamper-evident\n * part of the audit trail (type: 'reasoning').\n *\n * @param input - Reasoning details\n * @returns The created reasoning entry\n *\n * @example\n * ```typescript\n * const entry = await kontext.logReasoning({\n * agentId: 'payment-agent-1',\n * action: 'approve_transfer',\n * reasoning: 'Recipient is a verified vendor with 50+ prior transactions',\n * confidence: 0.95,\n * context: { recipientId: 'vendor-42' },\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\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\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\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 reasoningEntry: ReasoningEntry = {\n id: generateId(),\n timestamp: now(),\n agentId: input.agentId,\n action: input.action,\n reasoning: input.reasoning,\n confidence: input.confidence ?? 1.0,\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: `Reasoning for ${input.action}: ${input.reasoning}`,\n agentId: input.agentId,\n metadata: {\n reasoningId: reasoningEntry.id,\n action: input.action,\n reasoning: input.reasoning,\n confidence: reasoningEntry.confidence,\n context: reasoningEntry.context,\n },\n });\n\n return reasoningEntry;\n }\n\n /**\n * Get all reasoning entries for a specific agent.\n *\n * @param agentId - Agent identifier\n * @returns Array of reasoning entries\n */\n getReasoningEntries(agentId: string): ReasoningEntry[] {\n const reasoningActions = this.store.queryActions(\n (a) => a.agentId === agentId && a.type === 'reasoning',\n );\n\n return reasoningActions.map((action) => ({\n id: action.metadata['reasoningId'] as string,\n timestamp: action.timestamp,\n agentId: action.agentId,\n action: action.metadata['action'] as string,\n reasoning: action.metadata['reasoning'] as string,\n confidence: action.metadata['confidence'] as number,\n context: (action.metadata['context'] as Record<string, unknown>) ?? {},\n }));\n }\n\n // --------------------------------------------------------------------------\n // Compliance Certificates\n // --------------------------------------------------------------------------\n\n /**\n * Generate a compliance certificate that summarizes agent actions and\n * verifies the terminal digest.\n *\n * @param input - Certificate generation options\n * @returns A compliance certificate with digest chain verification\n *\n * @example\n * ```typescript\n * const cert = await kontext.generateComplianceCertificate({\n * agentId: 'payment-agent-1',\n * includeReasoning: true,\n * });\n * console.log(cert.complianceStatus); // 'compliant'\n * console.log(cert.digestChain.verified); // true\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 // Count transactions\n const transactions = agentActions.filter((a) => a.type === 'transaction');\n\n // Count tool calls\n const toolCalls = agentActions.filter((a) => a.type === 'tool_call');\n\n // Count reasoning entries\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]) => ({\n type,\n count,\n }));\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 const anomalies = this.store.queryAnomalies((a) => a.agentId === agentId);\n let filteredAnomalies = anomalies;\n if (timeRange) {\n const from = timeRange.from.getTime();\n const to = timeRange.to.getTime();\n filteredAnomalies = anomalies.filter((a) => {\n const ts = new Date(a.detectedAt).getTime();\n return ts >= from && ts <= to;\n });\n }\n\n let complianceStatus: ComplianceCertificate['complianceStatus'];\n const criticalAnomalies = filteredAnomalies.filter((a) => a.severity === 'critical');\n const highAnomalies = filteredAnomalies.filter((a) => a.severity === 'high');\n\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: action.metadata['action'] as string,\n reasoning: action.metadata['reasoning'] as string,\n confidence: action.metadata['confidence'] as number,\n context: (action.metadata['context'] as Record<string, unknown>) ?? {},\n }));\n }\n\n // Build the certificate content (before signature)\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 {\n ...certificateContent,\n contentHash,\n };\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 }\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 SDK - CCTP (Cross-Chain Transfer Protocol) Integration\n// ============================================================================\n// Supports both CCTP V1 and V2 features:\n// - V1: Standard burn-and-mint with attestation (minutes)\n// - V2: Fast transfers (sub-minute), hooks for post-transfer automation,\n// and expanded domain support\n\nimport type {\n Chain,\n Token,\n LogTransactionInput,\n AnomalySeverity,\n} from '../types.js';\nimport { generateId, now, parseAmount } from '../utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Supported CCTP domain identifiers for each chain (V2 expanded) */\nconst CCTP_DOMAINS: Record<string, number> = {\n ethereum: 0,\n arbitrum: 3,\n optimism: 2,\n base: 6,\n polygon: 7,\n // Arc (Circle's stablecoin-native blockchain) -- placeholder domain ID, update when Arc mainnet launches\n arc: 10,\n // CCTP V2 expanded domains\n avalanche: 1,\n solana: 5,\n};\n\n/** CCTP V2 fast-transfer eligible routes */\nconst FAST_TRANSFER_ROUTES: Set<string> = new Set([\n 'ethereum->base',\n 'base->ethereum',\n 'ethereum->arbitrum',\n 'arbitrum->ethereum',\n 'ethereum->optimism',\n 'optimism->ethereum',\n 'ethereum->polygon',\n 'polygon->ethereum',\n 'base->arbitrum',\n 'arbitrum->base',\n 'base->optimism',\n 'optimism->base',\n 'base->polygon',\n 'polygon->base',\n 'ethereum->avalanche',\n 'avalanche->ethereum',\n]);\n\n/** CCTP protocol version */\nexport type CCTPVersion = 'v1' | 'v2';\n\n/** CCTP message status */\nexport type CCTPMessageStatus =\n | 'pending'\n | 'attested'\n | 'confirmed'\n | 'failed';\n\n/** CCTP V2 hook definition for post-transfer automation */\nexport interface CCTPHook {\n /** Target contract address on the destination chain */\n targetContract: string;\n /** Encoded function call data */\n callData: string;\n /** Maximum gas for hook execution */\n gasLimit: number;\n /** Human-readable description of the hook */\n description?: string;\n}\n\n/** Input for initiating a CCTP V2 fast transfer */\nexport interface InitiateFastTransferInput {\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destinationChain: Chain;\n /** Transfer amount */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address */\n sender: string;\n /** Recipient address */\n recipient: string;\n /** Source chain transaction hash */\n sourceTxHash: string;\n /** Agent initiating the transfer */\n agentId: string;\n /** Maximum finality time the sender will accept (seconds) */\n maxFinalitySeconds?: number;\n /** Optional hooks to execute after transfer completes */\n hooks?: CCTPHook[];\n /** Optional nonce */\n nonce?: number;\n /** Optional correlation ID */\n correlationId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** A cross-chain transfer record */\nexport interface CrossChainTransfer {\n /** Unique transfer identifier */\n id: string;\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destinationChain: Chain;\n /** CCTP domain ID for source */\n sourceDomain: number;\n /** CCTP domain ID for destination */\n destinationDomain: number;\n /** Transfer amount (string to preserve precision) */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address on source chain */\n sender: string;\n /** Recipient address on destination chain */\n recipient: string;\n /** Source chain transaction hash */\n sourceTxHash: string;\n /** Destination chain transaction hash (set after confirmation) */\n destinationTxHash: string | null;\n /** CCTP message hash for attestation tracking */\n messageHash: string | null;\n /** Current status of the transfer */\n status: CCTPMessageStatus;\n /** Nonce from the CCTP MessageSent event */\n nonce: number | null;\n /** Timestamp when the transfer was initiated */\n initiatedAt: string;\n /** Timestamp when attestation was received */\n attestedAt: string | null;\n /** Timestamp when the transfer was confirmed on destination */\n confirmedAt: string | null;\n /** Correlation ID linking source and destination actions */\n correlationId: string;\n /** Agent that initiated the transfer */\n agentId: string;\n /** Additional metadata */\n metadata: Record<string, unknown>;\n /** CCTP protocol version used */\n version?: CCTPVersion;\n /** Whether this is a fast transfer (V2) */\n isFastTransfer?: boolean;\n /** Post-transfer hooks (V2) */\n hooks?: CCTPHook[];\n /** Hook execution results (V2) */\n hookResults?: CCTPHookResult[];\n}\n\n/** Input for initiating a cross-chain transfer record */\nexport interface InitiateCCTPTransferInput {\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destinationChain: Chain;\n /** Transfer amount */\n amount: string;\n /** Token being transferred */\n token: Token;\n /** Sender address */\n sender: string;\n /** Recipient address */\n recipient: string;\n /** Source chain transaction hash (from depositForBurn) */\n sourceTxHash: string;\n /** Agent initiating the transfer */\n agentId: string;\n /** Optional nonce from the MessageSent event */\n nonce?: number;\n /** Optional correlation ID */\n correlationId?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for recording a CCTP attestation */\nexport interface CCTPAttestationInput {\n /** The cross-chain transfer ID */\n transferId: string;\n /** The message hash from the attestation service */\n messageHash: string;\n /** Optional attestation metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for confirming a cross-chain transfer on destination */\nexport interface ConfirmCCTPTransferInput {\n /** The cross-chain transfer ID */\n transferId: string;\n /** Destination chain transaction hash (from receiveMessage) */\n destinationTxHash: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Validation result for a cross-chain transfer */\nexport interface CCTPValidationResult {\n /** Whether the transfer configuration is valid */\n valid: boolean;\n /** Validation checks performed */\n checks: CCTPValidationCheck[];\n /** Overall risk level */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Recommendations */\n recommendations: string[];\n}\n\n/** Individual validation check */\nexport interface CCTPValidationCheck {\n /** Check name */\n name: string;\n /** Whether the check passed */\n passed: boolean;\n /** Description */\n description: string;\n /** Severity if failed */\n severity: AnomalySeverity;\n}\n\n/** Cross-chain audit trail entry */\nexport interface CrossChainAuditEntry {\n /** The transfer record */\n transfer: CrossChainTransfer;\n /** Source chain action log ID (from logTransaction) */\n sourceActionId: string | null;\n /** Destination chain action log ID (from logTransaction) */\n destinationActionId: string | null;\n /** Whether source and destination are linked */\n linked: boolean;\n /** Duration from initiation to confirmation in milliseconds */\n durationMs: number | null;\n}\n\n/** Result of a CCTP V2 hook execution */\nexport interface CCTPHookResult {\n /** Target contract address */\n targetContract: string;\n /** Whether the hook executed successfully */\n success: boolean;\n /** Transaction hash of the hook execution */\n transactionHash?: string;\n /** Error message if the hook failed */\n error?: string;\n /** Gas used by the hook */\n gasUsed?: number;\n}\n\n/** Validation result for a CCTP V2 fast transfer */\nexport interface FastTransferValidation {\n /** Whether the fast transfer route is supported */\n fastTransferAvailable: boolean;\n /** Estimated finality time in seconds */\n estimatedFinalitySeconds: number;\n /** Whether hooks are valid */\n hooksValid: boolean;\n /** Hook validation details */\n hookValidation: { index: number; valid: boolean; reason?: string }[];\n /** Standard validation result */\n standardValidation: CCTPValidationResult;\n}\n\n// ============================================================================\n// CCTP Transfer Manager\n// ============================================================================\n\n/**\n * CCTPTransferManager handles cross-chain transfer tracking and validation\n * for Circle's Cross-Chain Transfer Protocol.\n *\n * Provides:\n * - Transfer validation (source chain to destination chain)\n * - CCTP message attestation logging\n * - Cross-chain audit trail linking\n * - Transfer lifecycle tracking (pending -> attested -> confirmed)\n */\nexport class CCTPTransferManager {\n private transfers: Map<string, CrossChainTransfer> = new Map();\n private actionLinks: Map<string, { sourceActionId?: string; destinationActionId?: string }> = new Map();\n\n /**\n * Validate a cross-chain transfer before execution.\n *\n * Checks include:\n * - Source and destination chain support\n * - Route validity (different chains)\n * - Token support on both chains\n * - Amount validation\n * - Address format validation\n *\n * @param input - Transfer details to validate\n * @returns Validation result with checks and recommendations\n */\n validateTransfer(input: InitiateCCTPTransferInput): CCTPValidationResult {\n const checks: CCTPValidationCheck[] = [];\n\n // Check source chain CCTP support\n checks.push(this.checkChainSupport(input.sourceChain, 'source'));\n\n // Check destination chain CCTP support\n checks.push(this.checkChainSupport(input.destinationChain, 'destination'));\n\n // Check route validity (source !== destination)\n checks.push(this.checkRouteValidity(input.sourceChain, input.destinationChain));\n\n // Check token support\n checks.push(this.checkTokenSupport(input.token));\n\n // Check amount validity\n checks.push(this.checkAmountValidity(input.amount));\n\n // Check address formats\n checks.push(this.checkAddressFormat(input.sender, 'sender'));\n checks.push(this.checkAddressFormat(input.recipient, 'recipient'));\n\n const failedChecks = checks.filter((c) => !c.passed);\n const valid = failedChecks.length === 0;\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 = this.generateRecommendations(checks, input);\n\n return {\n valid,\n checks,\n riskLevel: valid ? 'low' : highestSeverity,\n recommendations,\n };\n }\n\n /**\n * Record a new cross-chain transfer initiated via CCTP depositForBurn.\n *\n * @param input - Transfer initiation details\n * @returns The created CrossChainTransfer record\n */\n initiateTransfer(input: InitiateCCTPTransferInput): CrossChainTransfer {\n const id = generateId();\n const correlationId = input.correlationId ?? generateId();\n\n const transfer: CrossChainTransfer = {\n id,\n sourceChain: input.sourceChain,\n destinationChain: input.destinationChain,\n sourceDomain: CCTP_DOMAINS[input.sourceChain] ?? -1,\n destinationDomain: CCTP_DOMAINS[input.destinationChain] ?? -1,\n amount: input.amount,\n token: input.token,\n sender: input.sender,\n recipient: input.recipient,\n sourceTxHash: input.sourceTxHash,\n destinationTxHash: null,\n messageHash: null,\n status: 'pending',\n nonce: input.nonce ?? null,\n initiatedAt: now(),\n attestedAt: null,\n confirmedAt: null,\n correlationId,\n agentId: input.agentId,\n metadata: input.metadata ?? {},\n };\n\n this.transfers.set(id, transfer);\n this.actionLinks.set(id, {});\n\n return transfer;\n }\n\n /**\n * Record a CCTP attestation for a pending transfer.\n * Called after the attestation service has signed the burn message.\n *\n * @param input - Attestation details\n * @returns The updated CrossChainTransfer record\n * @throws Error if transfer not found or not in pending status\n */\n recordAttestation(input: CCTPAttestationInput): CrossChainTransfer {\n const transfer = this.transfers.get(input.transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${input.transferId}`);\n }\n\n if (transfer.status !== 'pending') {\n throw new Error(\n `Transfer ${input.transferId} is not in pending status (current: ${transfer.status})`,\n );\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n messageHash: input.messageHash,\n status: 'attested',\n attestedAt: now(),\n metadata: {\n ...transfer.metadata,\n ...input.metadata,\n },\n };\n\n this.transfers.set(input.transferId, updated);\n\n return updated;\n }\n\n /**\n * Confirm a cross-chain transfer has been received on the destination chain.\n * Called after receiveMessage has been executed on the destination.\n *\n * @param input - Confirmation details\n * @returns The updated CrossChainTransfer record\n * @throws Error if transfer not found or not in attested status\n */\n confirmTransfer(input: ConfirmCCTPTransferInput): CrossChainTransfer {\n const transfer = this.transfers.get(input.transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${input.transferId}`);\n }\n\n if (transfer.status !== 'attested') {\n throw new Error(\n `Transfer ${input.transferId} is not in attested status (current: ${transfer.status})`,\n );\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n destinationTxHash: input.destinationTxHash,\n status: 'confirmed',\n confirmedAt: now(),\n metadata: {\n ...transfer.metadata,\n ...input.metadata,\n },\n };\n\n this.transfers.set(input.transferId, updated);\n\n return updated;\n }\n\n /**\n * Mark a transfer as failed.\n *\n * @param transferId - The transfer to mark as failed\n * @param reason - Reason for failure\n * @returns The updated CrossChainTransfer record\n */\n failTransfer(transferId: string, reason: string): CrossChainTransfer {\n const transfer = this.transfers.get(transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${transferId}`);\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n status: 'failed',\n metadata: {\n ...transfer.metadata,\n failureReason: reason,\n failedAt: now(),\n },\n };\n\n this.transfers.set(transferId, updated);\n\n return updated;\n }\n\n /**\n * Link a Kontext action log ID to a cross-chain transfer.\n * Used to correlate source and destination chain actions in the audit trail.\n *\n * @param transferId - The cross-chain transfer ID\n * @param actionId - The action log ID to link\n * @param side - Whether this is the source or destination action\n */\n linkAction(transferId: string, actionId: string, side: 'source' | 'destination'): void {\n const transfer = this.transfers.get(transferId);\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${transferId}`);\n }\n\n const links = this.actionLinks.get(transferId) ?? {};\n if (side === 'source') {\n links.sourceActionId = actionId;\n } else {\n links.destinationActionId = actionId;\n }\n this.actionLinks.set(transferId, links);\n }\n\n /**\n * Get a cross-chain transfer by ID.\n */\n getTransfer(transferId: string): CrossChainTransfer | undefined {\n return this.transfers.get(transferId);\n }\n\n /**\n * Get all cross-chain transfers, optionally filtered by status.\n */\n getTransfers(status?: CCTPMessageStatus): CrossChainTransfer[] {\n const all = Array.from(this.transfers.values());\n if (status) {\n return all.filter((t) => t.status === status);\n }\n return all;\n }\n\n /**\n * Get transfers by correlation ID.\n * Useful for finding all transfers related to a single workflow.\n */\n getTransfersByCorrelation(correlationId: string): CrossChainTransfer[] {\n return Array.from(this.transfers.values()).filter(\n (t) => t.correlationId === correlationId,\n );\n }\n\n /**\n * Build a cross-chain audit trail for a given transfer.\n * Links source and destination chain actions together.\n *\n * @param transferId - The transfer to build an audit trail for\n * @returns CrossChainAuditEntry with linked action references\n */\n getAuditEntry(transferId: string): CrossChainAuditEntry | undefined {\n const transfer = this.transfers.get(transferId);\n if (!transfer) return undefined;\n\n const links = this.actionLinks.get(transferId) ?? {};\n\n let durationMs: number | null = null;\n if (transfer.confirmedAt && transfer.initiatedAt) {\n durationMs =\n new Date(transfer.confirmedAt).getTime() -\n new Date(transfer.initiatedAt).getTime();\n }\n\n return {\n transfer,\n sourceActionId: links.sourceActionId ?? null,\n destinationActionId: links.destinationActionId ?? null,\n linked: !!(links.sourceActionId && links.destinationActionId),\n durationMs,\n };\n }\n\n /**\n * Build audit trail entries for all transfers, optionally filtered.\n *\n * @param agentId - Optional filter by agent\n * @returns Array of CrossChainAuditEntry records\n */\n getAuditTrail(agentId?: string): CrossChainAuditEntry[] {\n let transfers = Array.from(this.transfers.values());\n if (agentId) {\n transfers = transfers.filter((t) => t.agentId === agentId);\n }\n\n return transfers\n .map((t) => this.getAuditEntry(t.id))\n .filter((entry): entry is CrossChainAuditEntry => entry !== undefined);\n }\n\n // --------------------------------------------------------------------------\n // CCTP V2 Features\n // --------------------------------------------------------------------------\n\n /**\n * Validate a fast transfer request (CCTP V2).\n * Checks route eligibility, hook validity, and standard validation.\n *\n * @param input - Fast transfer details\n * @returns FastTransferValidation with availability and hook checks\n */\n validateFastTransfer(input: InitiateFastTransferInput): FastTransferValidation {\n const standardInput: InitiateCCTPTransferInput = {\n sourceChain: input.sourceChain,\n destinationChain: input.destinationChain,\n amount: input.amount,\n token: input.token,\n sender: input.sender,\n recipient: input.recipient,\n sourceTxHash: input.sourceTxHash,\n agentId: input.agentId,\n nonce: input.nonce,\n correlationId: input.correlationId,\n metadata: input.metadata,\n };\n\n const standardValidation = this.validateTransfer(standardInput);\n\n // Check if fast transfer route is available\n const routeKey = `${input.sourceChain}->${input.destinationChain}`;\n const fastTransferAvailable = FAST_TRANSFER_ROUTES.has(routeKey);\n\n // Estimate finality time\n const estimatedFinalitySeconds = fastTransferAvailable ? 30 : 900;\n\n // Validate hooks\n const hookValidation: { index: number; valid: boolean; reason?: string }[] = [];\n if (input.hooks) {\n for (let i = 0; i < input.hooks.length; i++) {\n const hook = input.hooks[i]!;\n const isValidAddr = /^0x[a-fA-F0-9]{40}$/.test(hook.targetContract);\n const hasCallData = hook.callData.length > 0;\n const validGas = hook.gasLimit > 0 && hook.gasLimit <= 10_000_000;\n\n if (!isValidAddr) {\n hookValidation.push({ index: i, valid: false, reason: 'Invalid target contract address' });\n } else if (!hasCallData) {\n hookValidation.push({ index: i, valid: false, reason: 'Call data is empty' });\n } else if (!validGas) {\n hookValidation.push({ index: i, valid: false, reason: 'Gas limit must be between 1 and 10,000,000' });\n } else {\n hookValidation.push({ index: i, valid: true });\n }\n }\n }\n\n const hooksValid = hookValidation.every((h) => h.valid);\n\n return {\n fastTransferAvailable,\n estimatedFinalitySeconds,\n hooksValid,\n hookValidation,\n standardValidation,\n };\n }\n\n /**\n * Initiate a CCTP V2 fast transfer with optional hooks.\n *\n * Fast transfers use CCTP V2's sub-minute finality on supported routes.\n * Hooks allow automated post-transfer actions on the destination chain.\n *\n * @param input - Fast transfer details including optional hooks\n * @returns The created CrossChainTransfer record with V2 metadata\n */\n initiateFastTransfer(input: InitiateFastTransferInput): CrossChainTransfer {\n const id = generateId();\n const correlationId = input.correlationId ?? generateId();\n const routeKey = `${input.sourceChain}->${input.destinationChain}`;\n const isFast = FAST_TRANSFER_ROUTES.has(routeKey);\n\n const transfer: CrossChainTransfer = {\n id,\n sourceChain: input.sourceChain,\n destinationChain: input.destinationChain,\n sourceDomain: CCTP_DOMAINS[input.sourceChain] ?? -1,\n destinationDomain: CCTP_DOMAINS[input.destinationChain] ?? -1,\n amount: input.amount,\n token: input.token,\n sender: input.sender,\n recipient: input.recipient,\n sourceTxHash: input.sourceTxHash,\n destinationTxHash: null,\n messageHash: null,\n status: 'pending',\n nonce: input.nonce ?? null,\n initiatedAt: now(),\n attestedAt: null,\n confirmedAt: null,\n correlationId,\n agentId: input.agentId,\n metadata: {\n ...input.metadata,\n maxFinalitySeconds: input.maxFinalitySeconds ?? (isFast ? 30 : 900),\n },\n version: 'v2',\n isFastTransfer: isFast,\n hooks: input.hooks,\n };\n\n this.transfers.set(id, transfer);\n this.actionLinks.set(id, {});\n\n return transfer;\n }\n\n /**\n * Record hook execution results for a V2 transfer.\n *\n * @param transferId - The transfer ID\n * @param results - Array of hook execution results\n * @returns The updated transfer\n */\n recordHookResults(transferId: string, results: CCTPHookResult[]): CrossChainTransfer {\n const transfer = this.transfers.get(transferId);\n\n if (!transfer) {\n throw new Error(`Cross-chain transfer not found: ${transferId}`);\n }\n\n if (transfer.version !== 'v2') {\n throw new Error(`Transfer ${transferId} is not a V2 transfer`);\n }\n\n const updated: CrossChainTransfer = {\n ...transfer,\n hookResults: results,\n metadata: {\n ...transfer.metadata,\n hooksExecutedAt: now(),\n hookSuccessCount: results.filter((r) => r.success).length,\n hookFailureCount: results.filter((r) => !r.success).length,\n },\n };\n\n this.transfers.set(transferId, updated);\n return updated;\n }\n\n /**\n * Check if a route supports CCTP V2 fast transfers.\n *\n * @param sourceChain - Source blockchain network\n * @param destinationChain - Destination blockchain network\n * @returns Whether fast transfer is available\n */\n static isFastTransferAvailable(sourceChain: Chain, destinationChain: Chain): boolean {\n return FAST_TRANSFER_ROUTES.has(`${sourceChain}->${destinationChain}`);\n }\n\n /**\n * Get the CCTP domain ID for a given chain.\n *\n * @param chain - The blockchain network\n * @returns The CCTP domain ID, or undefined for unsupported chains\n */\n static getDomainId(chain: Chain): number | undefined {\n return CCTP_DOMAINS[chain];\n }\n\n /**\n * Get the chains supported for CCTP transfers.\n */\n static getSupportedChains(): Chain[] {\n return Object.keys(CCTP_DOMAINS) as Chain[];\n }\n\n /**\n * Get the list of V2 fast-transfer eligible routes.\n *\n * @returns Array of route strings in \"source->destination\" format\n */\n static getFastTransferRoutes(): string[] {\n return Array.from(FAST_TRANSFER_ROUTES);\n }\n\n // --------------------------------------------------------------------------\n // Validation checks\n // --------------------------------------------------------------------------\n\n private checkChainSupport(chain: Chain, label: string): CCTPValidationCheck {\n const supported = chain in CCTP_DOMAINS;\n return {\n name: `cctp_${label}_chain`,\n passed: supported,\n description: supported\n ? `${label} chain ${chain} supports CCTP (domain ${CCTP_DOMAINS[chain]})`\n : `${label} chain ${chain} does not support CCTP`,\n severity: supported ? 'low' : 'high',\n };\n }\n\n private checkRouteValidity(source: Chain, destination: Chain): CCTPValidationCheck {\n const valid = source !== destination;\n return {\n name: 'cctp_route_validity',\n passed: valid,\n description: valid\n ? `Valid cross-chain route: ${source} -> ${destination}`\n : `Invalid route: source and destination chains are the same (${source})`,\n severity: valid ? 'low' : 'critical',\n };\n }\n\n private checkTokenSupport(token: Token): CCTPValidationCheck {\n // CCTP natively supports USDC; EURC is also supported on some routes\n const supported = token === 'USDC' || token === 'EURC';\n return {\n name: 'cctp_token_support',\n passed: supported,\n description: supported\n ? `Token ${token} is supported for CCTP transfers`\n : `Token ${token} is not natively supported by CCTP (only USDC and EURC)`,\n severity: supported ? 'low' : 'high',\n };\n }\n\n private checkAmountValidity(amount: string): CCTPValidationCheck {\n const parsed = parseAmount(amount);\n const valid = !isNaN(parsed) && parsed > 0;\n return {\n name: 'cctp_amount_validity',\n passed: valid,\n description: valid\n ? `Transfer amount ${amount} is valid`\n : `Transfer amount ${amount} is invalid`,\n severity: valid ? 'low' : 'critical',\n };\n }\n\n private checkAddressFormat(address: string, label: string): CCTPValidationCheck {\n const isValid = /^0x[a-fA-F0-9]{40}$/.test(address);\n return {\n name: `cctp_address_${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 // --------------------------------------------------------------------------\n // Recommendations\n // --------------------------------------------------------------------------\n\n private generateRecommendations(\n checks: CCTPValidationCheck[],\n input: InitiateCCTPTransferInput,\n ): string[] {\n const recommendations: string[] = [];\n const amount = parseAmount(input.amount);\n\n const failedChecks = checks.filter((c) => !c.passed);\n\n if (failedChecks.some((c) => c.severity === 'critical')) {\n recommendations.push(\n 'Do not proceed with this transfer. Critical validation failures detected.',\n );\n }\n\n if (failedChecks.some((c) => c.name === 'cctp_token_support')) {\n recommendations.push(\n 'Consider using USDC for native CCTP support. Other tokens require bridge protocols.',\n );\n }\n\n if (!isNaN(amount) && amount >= 50000) {\n recommendations.push(\n 'Large cross-chain transfer detected. Verify recipient identity and document purpose.',\n );\n }\n\n if (!isNaN(amount) && amount >= 10000) {\n recommendations.push(\n 'Cross-chain transfer meets reporting threshold. Ensure CTR filing if applicable.',\n );\n }\n\n if (failedChecks.length === 0) {\n recommendations.push(\n 'Transfer validation passed. Monitor attestation status for completion.',\n );\n }\n\n return recommendations;\n }\n}\n","// ============================================================================\n// Kontext SDK - Circle Programmable Wallets Integration\n// ============================================================================\n//\n// Integrates Circle's Programmable Wallets (wallet-as-a-service) with\n// Kontext's compliance and audit infrastructure. Supports two operating modes:\n//\n// - **Simulation mode** (default): Validates flows, runs compliance checks,\n// and logs everything without making real Circle API calls.\n// - **Live mode**: When a Circle API key is provided, proxies real API calls\n// to Circle's endpoints.\n//\n// All wallet operations are automatically logged through Kontext's rolling\n// SHA-256 digest chain for tamper-evident audit trails.\n// ============================================================================\n\nimport type {\n Chain,\n ActionLog,\n LogTransactionInput,\n ComplianceCheckResult,\n AnomalySeverity,\n} from '../types.js';\nimport { generateId, now, parseAmount, isValidAddress } from '../utils.js';\nimport { UsdcCompliance } from './usdc.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration options for the CircleWalletManager */\nexport interface CircleWalletOptions {\n /** Entity secret ciphertext for developer-controlled wallets */\n entitySecretCiphertext?: string;\n /** Default blockchain network for new wallets */\n defaultChain?: Chain;\n /** Automatically log all wallet operations through Kontext (default: true) */\n autoLog?: boolean;\n /** Require compliance check before transfers (default: true) */\n requireCompliance?: boolean;\n}\n\n/** A wallet set (group of wallets) */\nexport interface WalletSet {\n /** Unique wallet set identifier */\n id: string;\n /** Human-readable name */\n name: string;\n /** Custody type */\n custodyType: 'DEVELOPER' | 'USER';\n /** Creation timestamp */\n createdAt: string;\n}\n\n/** A Circle programmable wallet */\nexport interface CircleWallet {\n /** Unique wallet identifier */\n id: string;\n /** Parent wallet set ID */\n walletSetId: string;\n /** On-chain address */\n address: string;\n /** Blockchain network */\n chain: Chain;\n /** Custody type */\n custodyType: 'DEVELOPER' | 'USER';\n /** Wallet state */\n state: 'LIVE' | 'FROZEN';\n /** Creation timestamp */\n createDate: string;\n}\n\n/** Options for creating a new wallet */\nexport interface CreateWalletOptions {\n /** Blockchain network for the wallet */\n chain: Chain;\n /** Custody type (default: 'DEVELOPER') */\n custodyType?: 'DEVELOPER' | 'USER';\n /** Additional metadata */\n metadata?: Record<string, string>;\n}\n\n/** Input for a compliant transfer */\nexport interface CompliantTransferInput {\n /** Source wallet ID */\n walletId: string;\n /** Destination on-chain address */\n destinationAddress: string;\n /** Transfer amount (string to preserve precision) */\n amount: string;\n /** Blockchain network (defaults to wallet's chain) */\n chain?: Chain;\n /** Token to transfer */\n token?: 'USDC' | 'EURC';\n /** Agent initiating the transfer */\n agent?: string;\n /** Additional metadata */\n metadata?: Record<string, any>;\n}\n\n/** Result of a compliant transfer */\nexport interface CompliantTransferResult {\n /** Circle transfer identifier */\n transferId: string;\n /** Source wallet ID */\n walletId: string;\n /** Transfer status */\n status: 'COMPLETED' | 'BLOCKED' | 'PENDING_REVIEW';\n /** Compliance check details */\n complianceCheck: ComplianceCheckSummary;\n /** Kontext action log ID */\n kontextLogId: string;\n /** Trust score at time of transfer */\n trustScore: number;\n /** Transfer amount */\n amount: string;\n /** Blockchain network */\n chain: Chain;\n /** On-chain transaction hash (if completed) */\n transactionHash?: string;\n /** Reason the transfer was blocked (if blocked) */\n blockedReason?: string;\n}\n\n/** Summary of compliance check for a transfer */\nexport interface ComplianceCheckSummary {\n /** Whether the check passed */\n passed: boolean;\n /** Risk level */\n riskLevel: AnomalySeverity;\n /** Individual check results */\n checks: ComplianceCheckResult[];\n /** Recommendations */\n recommendations: string[];\n}\n\n/** Wallet balance information */\nexport interface WalletBalance {\n /** Wallet identifier */\n walletId: string;\n /** Blockchain network */\n chain: Chain;\n /** Token balances */\n balances: { token: string; amount: string }[];\n}\n\n/**\n * Adapter interface for Circle API calls.\n * Allows swapping between simulation and live implementations.\n */\nexport interface CircleApiAdapter {\n createWalletSet(name: string, custodyType: string): Promise<{ id: string }>;\n createWallet(walletSetId: string, chain: Chain, custodyType: string): Promise<{ id: string; address: string }>;\n getWallet(walletId: string): Promise<{ id: string; address: string; chain: Chain; state: string } | null>;\n listWallets(walletSetId: string): Promise<{ id: string; address: string; chain: Chain; state: string }[]>;\n transfer(params: { walletId: string; destinationAddress: string; amount: string; chain: Chain; token: string }): Promise<{ transferId: string; transactionHash: string }>;\n getBalance(walletId: string): Promise<{ balances: { token: string; amount: string }[] }>;\n}\n\n// ============================================================================\n// Simulation Adapter\n// ============================================================================\n\n/**\n * Simulated Circle API adapter for testing and development.\n * Returns deterministic mock data without making real API calls.\n */\nclass SimulationAdapter implements CircleApiAdapter {\n private walletCounter = 0;\n private transferCounter = 0;\n\n async createWalletSet(name: string, custodyType: string): Promise<{ id: string }> {\n return { id: `ws_sim_${generateId().slice(0, 8)}` };\n }\n\n async createWallet(walletSetId: string, chain: Chain, custodyType: string): Promise<{ id: string; address: string }> {\n this.walletCounter++;\n const addressHex = this.walletCounter.toString(16).padStart(40, '0');\n return {\n id: `wallet_sim_${generateId().slice(0, 8)}`,\n address: `0x${addressHex}`,\n };\n }\n\n async getWallet(walletId: string): Promise<{ id: string; address: string; chain: Chain; state: string } | null> {\n return {\n id: walletId,\n address: '0x' + '0'.repeat(40),\n chain: 'ethereum',\n state: 'LIVE',\n };\n }\n\n async listWallets(walletSetId: string): Promise<{ id: string; address: string; chain: Chain; state: string }[]> {\n return [];\n }\n\n async transfer(params: { walletId: string; destinationAddress: string; amount: string; chain: Chain; token: string }): Promise<{ transferId: string; transactionHash: string }> {\n this.transferCounter++;\n return {\n transferId: `txn_sim_${generateId().slice(0, 8)}`,\n transactionHash: `0x${this.transferCounter.toString(16).padStart(64, '0')}`,\n };\n }\n\n async getBalance(walletId: string): Promise<{ balances: { token: string; amount: string }[] }> {\n return {\n balances: [\n { token: 'USDC', amount: '1000.00' },\n ],\n };\n }\n}\n\n// ============================================================================\n// Live Adapter\n// ============================================================================\n\n/**\n * Live Circle API adapter that makes real HTTP calls to Circle's endpoints.\n */\nclass LiveCircleAdapter implements CircleApiAdapter {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.circle.com/v1/w3s';\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Circle API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data as T;\n }\n\n async createWalletSet(name: string, custodyType: string): Promise<{ id: string }> {\n const result = await this.request<{ data: { walletSet: { id: string } } }>('POST', '/developer/walletSets', {\n name,\n idempotencyKey: generateId(),\n });\n return { id: result.data.walletSet.id };\n }\n\n async createWallet(walletSetId: string, chain: Chain, custodyType: string): Promise<{ id: string; address: string }> {\n const chainMap: Record<string, string> = {\n ethereum: 'ETH',\n base: 'BASE',\n polygon: 'MATIC',\n arbitrum: 'ARB',\n optimism: 'OP',\n arc: 'ARC',\n };\n const result = await this.request<{ data: { wallets: { id: string; address: string }[] } }>('POST', '/developer/wallets', {\n walletSetId,\n blockchains: [chainMap[chain] ?? chain.toUpperCase()],\n count: 1,\n idempotencyKey: generateId(),\n });\n const wallet = result.data.wallets[0];\n return { id: wallet!.id, address: wallet!.address };\n }\n\n async getWallet(walletId: string): Promise<{ id: string; address: string; chain: Chain; state: string } | null> {\n try {\n const result = await this.request<{ data: { wallet: { id: string; address: string; blockchain: string; state: string } } }>('GET', `/wallets/${walletId}`);\n const w = result.data.wallet;\n return { id: w.id, address: w.address, chain: w.blockchain.toLowerCase() as Chain, state: w.state };\n } catch {\n return null;\n }\n }\n\n async listWallets(walletSetId: string): Promise<{ id: string; address: string; chain: Chain; state: string }[]> {\n const result = await this.request<{ data: { wallets: { id: string; address: string; blockchain: string; state: string }[] } }>('GET', `/wallets?walletSetId=${walletSetId}`);\n return result.data.wallets.map((w) => ({\n id: w.id,\n address: w.address,\n chain: w.blockchain.toLowerCase() as Chain,\n state: w.state,\n }));\n }\n\n async transfer(params: { walletId: string; destinationAddress: string; amount: string; chain: Chain; token: string }): Promise<{ transferId: string; transactionHash: string }> {\n const result = await this.request<{ data: { transfer: { id: string; transactionHash: string } } }>('POST', '/developer/transactions/transfer', {\n walletId: params.walletId,\n destinationAddress: params.destinationAddress,\n amounts: [params.amount],\n tokenId: params.token,\n idempotencyKey: generateId(),\n });\n return {\n transferId: result.data.transfer.id,\n transactionHash: result.data.transfer.transactionHash,\n };\n }\n\n async getBalance(walletId: string): Promise<{ balances: { token: string; amount: string }[] }> {\n const result = await this.request<{ data: { tokenBalances: { token: { symbol: string }; amount: string }[] } }>('GET', `/wallets/${walletId}/balances`);\n return {\n balances: result.data.tokenBalances.map((b) => ({\n token: b.token.symbol,\n amount: b.amount,\n })),\n };\n }\n}\n\n// ============================================================================\n// Kontext Client Interface (subset needed by this module)\n// ============================================================================\n\n/** Minimal interface for the Kontext client used by CircleWalletManager */\ninterface KontextLike {\n log(input: { type: string; description: string; agentId: string; metadata?: Record<string, unknown> }): Promise<ActionLog>;\n logTransaction(input: LogTransactionInput): Promise<ActionLog>;\n getTrustScore(agentId: string): Promise<{ score: number }>;\n checkUsdcCompliance(tx: LogTransactionInput): { compliant: boolean; checks: ComplianceCheckResult[]; riskLevel: AnomalySeverity; recommendations: string[] };\n}\n\n// ============================================================================\n// CircleWalletManager\n// ============================================================================\n\n/**\n * Manages Circle Programmable Wallets with integrated Kontext compliance\n * and audit logging.\n *\n * All wallet operations are automatically logged through Kontext's rolling\n * SHA-256 digest chain. Transfers are wrapped with compliance checks that\n * must pass before execution.\n *\n * @example\n * ```typescript\n * import { Kontext } from 'kontext-sdk';\n * import { CircleWalletManager } from 'kontext-sdk';\n *\n * const kontext = Kontext.init({ projectId: 'my-project', environment: 'production' });\n * const wallets = new CircleWalletManager(kontext, 'circle-api-key');\n *\n * const walletSet = await wallets.createWalletSet('Operations');\n * const wallet = await wallets.createWallet(walletSet.id, { chain: 'base' });\n *\n * const result = await wallets.transferWithCompliance({\n * walletId: wallet.id,\n * destinationAddress: '0x...',\n * amount: '100',\n * agent: 'payment-agent',\n * });\n * ```\n */\nexport class CircleWalletManager {\n private readonly kontext: KontextLike;\n private readonly adapter: CircleApiAdapter;\n private readonly options: Required<CircleWalletOptions>;\n private readonly isLiveMode: boolean;\n\n // In-memory state for wallet tracking\n private walletSets: Map<string, WalletSet> = new Map();\n private wallets: Map<string, CircleWallet> = new Map();\n private walletSetWallets: Map<string, string[]> = new Map();\n private auditTrail: Map<string, ActionLog[]> = new Map();\n\n /**\n * Create a new CircleWalletManager.\n *\n * @param kontextClient - Initialized Kontext SDK client\n * @param circleApiKey - Circle API key (optional; omit for simulation mode)\n * @param options - Configuration options\n */\n constructor(\n kontextClient: KontextLike,\n circleApiKey?: string,\n options?: CircleWalletOptions,\n ) {\n this.kontext = kontextClient;\n this.isLiveMode = !!circleApiKey;\n this.adapter = circleApiKey\n ? new LiveCircleAdapter(circleApiKey)\n : new SimulationAdapter();\n\n this.options = {\n entitySecretCiphertext: options?.entitySecretCiphertext ?? '',\n defaultChain: options?.defaultChain ?? 'ethereum',\n autoLog: options?.autoLog ?? true,\n requireCompliance: options?.requireCompliance ?? true,\n };\n }\n\n // --------------------------------------------------------------------------\n // Wallet Set Management\n // --------------------------------------------------------------------------\n\n /**\n * Create a new wallet set (a logical group of wallets).\n *\n * @param name - Human-readable name for the wallet set\n * @param metadata - Optional metadata key-value pairs\n * @returns The created WalletSet\n */\n async createWalletSet(name: string, metadata?: Record<string, string>): Promise<WalletSet> {\n const custodyType = this.options.entitySecretCiphertext ? 'DEVELOPER' : 'USER';\n const result = await this.adapter.createWalletSet(name, custodyType);\n\n const walletSet: WalletSet = {\n id: result.id,\n name,\n custodyType,\n createdAt: now(),\n };\n\n this.walletSets.set(walletSet.id, walletSet);\n this.walletSetWallets.set(walletSet.id, []);\n\n if (this.options.autoLog) {\n await this.logOperation('wallet_set_created', `Created wallet set \"${name}\"`, {\n walletSetId: walletSet.id,\n custodyType,\n ...metadata,\n });\n }\n\n return walletSet;\n }\n\n // --------------------------------------------------------------------------\n // Wallet Management\n // --------------------------------------------------------------------------\n\n /**\n * Create a new wallet within a wallet set.\n *\n * @param walletSetId - Parent wallet set ID\n * @param options - Wallet creation options\n * @returns The created CircleWallet\n */\n async createWallet(walletSetId: string, options: CreateWalletOptions): Promise<CircleWallet> {\n const walletSet = this.walletSets.get(walletSetId);\n if (!walletSet) {\n throw new Error(`Wallet set not found: ${walletSetId}`);\n }\n\n const chain = options.chain ?? this.options.defaultChain;\n const custodyType = options.custodyType ?? walletSet.custodyType;\n\n const result = await this.adapter.createWallet(walletSetId, chain, custodyType);\n\n const wallet: CircleWallet = {\n id: result.id,\n walletSetId,\n address: result.address,\n chain,\n custodyType,\n state: 'LIVE',\n createDate: now(),\n };\n\n this.wallets.set(wallet.id, wallet);\n const setWallets = this.walletSetWallets.get(walletSetId) ?? [];\n setWallets.push(wallet.id);\n this.walletSetWallets.set(walletSetId, setWallets);\n\n if (this.options.autoLog) {\n await this.logOperation('wallet_created', `Created wallet on ${chain}`, {\n walletId: wallet.id,\n walletSetId,\n chain,\n address: wallet.address,\n custodyType,\n ...options.metadata,\n });\n }\n\n return wallet;\n }\n\n /**\n * Get a wallet by its ID.\n *\n * @param walletId - Wallet identifier\n * @returns The CircleWallet, or throws if not found\n */\n async getWallet(walletId: string): Promise<CircleWallet> {\n const cached = this.wallets.get(walletId);\n if (cached) return cached;\n\n if (this.isLiveMode) {\n const remote = await this.adapter.getWallet(walletId);\n if (remote) {\n const wallet: CircleWallet = {\n id: remote.id,\n walletSetId: 'unknown',\n address: remote.address,\n chain: remote.chain,\n custodyType: 'DEVELOPER',\n state: remote.state as 'LIVE' | 'FROZEN',\n createDate: now(),\n };\n this.wallets.set(walletId, wallet);\n return wallet;\n }\n }\n\n throw new Error(`Wallet not found: ${walletId}`);\n }\n\n /**\n * List all wallets in a wallet set.\n *\n * @param walletSetId - Wallet set identifier\n * @returns Array of CircleWallet records\n */\n async listWallets(walletSetId: string): Promise<CircleWallet[]> {\n const walletIds = this.walletSetWallets.get(walletSetId) ?? [];\n const wallets: CircleWallet[] = [];\n for (const id of walletIds) {\n const wallet = this.wallets.get(id);\n if (wallet) wallets.push(wallet);\n }\n return wallets;\n }\n\n // --------------------------------------------------------------------------\n // Compliant Transfers\n // --------------------------------------------------------------------------\n\n /**\n * Execute a USDC/EURC transfer with integrated compliance checks.\n *\n * The transfer flow:\n * 1. Validate the source wallet exists and is live\n * 2. Run Kontext compliance checks on the transaction\n * 3. Get the agent's trust score\n * 4. If compliance passes, execute the transfer via Circle\n * 5. Log the entire operation through Kontext's audit system\n *\n * @param input - Transfer details\n * @returns CompliantTransferResult with status and audit trail\n */\n async transferWithCompliance(input: CompliantTransferInput): Promise<CompliantTransferResult> {\n const wallet = this.wallets.get(input.walletId);\n if (!wallet) {\n throw new Error(`Wallet not found: ${input.walletId}`);\n }\n\n if (wallet.state !== 'LIVE') {\n throw new Error(`Wallet ${input.walletId} is frozen and cannot execute transfers`);\n }\n\n const chain = input.chain ?? wallet.chain;\n const token = input.token ?? 'USDC';\n const agent = input.agent ?? 'system';\n\n // Step 1: Run compliance check\n const complianceCheck = this.runComplianceCheck(input, wallet, chain, token);\n\n // Step 2: Get trust score\n let trustScore = 50; // default\n try {\n const score = await this.kontext.getTrustScore(agent);\n trustScore = score.score;\n } catch {\n // Trust scoring may fail for new agents; use default\n }\n\n // Step 3: Determine transfer status based on compliance and trust\n let status: CompliantTransferResult['status'];\n let transactionHash: string | undefined;\n let transferId: string;\n let blockedReason: string | undefined;\n\n if (!complianceCheck.passed && this.options.requireCompliance) {\n status = 'BLOCKED';\n transferId = `blocked_${generateId().slice(0, 8)}`;\n blockedReason = complianceCheck.recommendations.join('; ');\n } else if (complianceCheck.riskLevel === 'high' || complianceCheck.riskLevel === 'critical' || trustScore < 30) {\n status = 'PENDING_REVIEW';\n transferId = `review_${generateId().slice(0, 8)}`;\n } else {\n // Step 4: Execute transfer\n const result = await this.adapter.transfer({\n walletId: input.walletId,\n destinationAddress: input.destinationAddress,\n amount: input.amount,\n chain,\n token,\n });\n status = 'COMPLETED';\n transferId = result.transferId;\n transactionHash = result.transactionHash;\n }\n\n // Step 5: Log the operation\n const logAction = await this.kontext.log({\n type: 'circle_wallet_transfer',\n description: `${token} transfer of ${input.amount} from wallet ${input.walletId} - ${status}`,\n agentId: agent,\n metadata: {\n walletId: input.walletId,\n destinationAddress: input.destinationAddress,\n amount: input.amount,\n chain,\n token,\n status,\n transferId,\n transactionHash,\n trustScore,\n compliancePassed: complianceCheck.passed,\n complianceRiskLevel: complianceCheck.riskLevel,\n blockedReason,\n ...input.metadata,\n },\n });\n\n // Track in audit trail\n const walletAudit = this.auditTrail.get(input.walletId) ?? [];\n walletAudit.push(logAction);\n this.auditTrail.set(input.walletId, walletAudit);\n\n return {\n transferId,\n walletId: input.walletId,\n status,\n complianceCheck,\n kontextLogId: logAction.id,\n trustScore,\n amount: input.amount,\n chain,\n transactionHash,\n blockedReason,\n };\n }\n\n // --------------------------------------------------------------------------\n // Balance and Monitoring\n // --------------------------------------------------------------------------\n\n /**\n * Get the token balances for a wallet.\n *\n * @param walletId - Wallet identifier\n * @param chain - Optional chain override\n * @returns WalletBalance with token amounts\n */\n async getBalance(walletId: string, chain?: Chain): Promise<WalletBalance> {\n const wallet = this.wallets.get(walletId);\n const walletChain = chain ?? wallet?.chain ?? this.options.defaultChain;\n\n const result = await this.adapter.getBalance(walletId);\n\n return {\n walletId,\n chain: walletChain,\n balances: result.balances,\n };\n }\n\n // --------------------------------------------------------------------------\n // Audit Integration\n // --------------------------------------------------------------------------\n\n /**\n * Get the Kontext audit trail for a specific wallet.\n *\n * @param walletId - Wallet identifier\n * @returns Array of ActionLog entries related to this wallet\n */\n async getWalletAuditTrail(walletId: string): Promise<ActionLog[]> {\n return this.auditTrail.get(walletId) ?? [];\n }\n\n // --------------------------------------------------------------------------\n // Internal Helpers\n // --------------------------------------------------------------------------\n\n /**\n * Run Kontext compliance checks on a transfer.\n */\n private runComplianceCheck(\n input: CompliantTransferInput,\n wallet: CircleWallet,\n chain: Chain,\n token: string,\n ): ComplianceCheckSummary {\n // Build a LogTransactionInput for Kontext's compliance checker\n const txInput: LogTransactionInput = {\n txHash: '0x' + '0'.repeat(64), // placeholder for pre-check\n chain,\n amount: input.amount,\n token: token as 'USDC' | 'EURC',\n from: wallet.address,\n to: input.destinationAddress,\n agentId: input.agent ?? 'system',\n };\n\n const usdcCheck = this.kontext.checkUsdcCompliance(txInput);\n\n // Additional checks specific to Circle wallets\n const additionalChecks: ComplianceCheckResult[] = [];\n\n // Check destination address format\n const addrValid = isValidAddress(input.destinationAddress);\n additionalChecks.push({\n name: 'destination_address_format',\n passed: addrValid,\n description: addrValid\n ? 'Destination address format is valid'\n : `Invalid destination address: ${input.destinationAddress}`,\n severity: addrValid ? 'low' : 'high',\n });\n\n // Check amount is positive\n const amount = parseAmount(input.amount);\n const amountValid = !isNaN(amount) && amount > 0;\n additionalChecks.push({\n name: 'transfer_amount_positive',\n passed: amountValid,\n description: amountValid\n ? `Transfer amount ${input.amount} is valid`\n : `Transfer amount ${input.amount} is invalid`,\n severity: amountValid ? 'low' : 'critical',\n });\n\n // Check wallet is not frozen\n additionalChecks.push({\n name: 'wallet_state_check',\n passed: wallet.state === 'LIVE',\n description: wallet.state === 'LIVE'\n ? 'Wallet is in LIVE state'\n : 'Wallet is FROZEN -- transfers are blocked',\n severity: wallet.state === 'LIVE' ? 'low' : 'critical',\n });\n\n const allChecks = [...usdcCheck.checks, ...additionalChecks];\n const failedChecks = allChecks.filter((c) => !c.passed);\n const passed = failedChecks.length === 0 || failedChecks.every((c) => c.severity === 'low');\n\n // Determine highest risk level\n const severityOrder: AnomalySeverity[] = ['low', 'medium', 'high', 'critical'];\n const riskLevel = allChecks.reduce<AnomalySeverity>((max, c) => {\n return severityOrder.indexOf(c.severity) > severityOrder.indexOf(max) ? c.severity : max;\n }, 'low');\n\n return {\n passed,\n riskLevel,\n checks: allChecks,\n recommendations: usdcCheck.recommendations,\n };\n }\n\n /**\n * Log an operation through the Kontext client.\n */\n private async logOperation(\n type: string,\n description: string,\n metadata: Record<string, unknown>,\n ): Promise<ActionLog> {\n const action = await this.kontext.log({\n type,\n description,\n agentId: 'circle-wallet-manager',\n metadata,\n });\n\n // Track in per-wallet audit trails if applicable\n const walletId = metadata['walletId'] as string | undefined;\n if (walletId) {\n const trail = this.auditTrail.get(walletId) ?? [];\n trail.push(action);\n this.auditTrail.set(walletId, trail);\n }\n\n return action;\n }\n}\n","// ============================================================================\n// Kontext SDK - Circle Compliance Engine Integration\n// ============================================================================\n//\n// Integrates Circle's transaction screening capabilities with Kontext's own\n// trust scoring and compliance infrastructure for dual-layer screening.\n//\n// Supports two operating modes:\n// - **Simulation mode** (default): Runs simulated Circle screening alongside\n// real Kontext compliance checks.\n// - **Live mode**: When a Circle API key is provided, calls Circle's actual\n// transaction screening APIs.\n// ============================================================================\n\nimport type {\n Chain,\n ActionLog,\n LogTransactionInput,\n AnomalySeverity,\n ComplianceCheckResult,\n RiskFactor,\n} from '../types.js';\nimport { generateId, now, parseAmount, isValidAddress } from '../utils.js';\nimport { UsdcCompliance } from './usdc.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Input for screening a transaction */\nexport interface ScreenTransactionInput {\n /** Sender address */\n from: string;\n /** Recipient address */\n to: string;\n /** Transfer amount */\n amount: string;\n /** Blockchain network */\n chain: Chain;\n /** Token being transferred */\n token?: string;\n}\n\n/** Result of dual screening (Circle + Kontext) */\nexport interface DualScreenResult {\n /** Circle's screening result */\n circleScreening: {\n /** Whether the transaction is approved by Circle */\n approved: boolean;\n /** Risk level from Circle's screening */\n riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE';\n /** Flags raised by Circle's screening */\n flags: string[];\n };\n /** Kontext's screening result */\n kontextScreening: {\n /** Trust score (0-100) */\n trustScore: number;\n /** Whether anomaly was detected */\n anomalyDetected: boolean;\n /** Whether compliance checks passed */\n complianceApproved: boolean;\n /** Flags raised by Kontext screening */\n flags: string[];\n };\n /** Combined decision from both systems */\n combinedDecision: 'APPROVE' | 'REVIEW' | 'BLOCK';\n /** Kontext audit log ID */\n auditLogId: string;\n}\n\n/** Result of screening a single address */\nexport interface AddressScreenResult {\n /** The screened address */\n address: string;\n /** Blockchain network */\n chain: Chain;\n /** Whether the address is sanctioned */\n sanctioned: boolean;\n /** Risk level */\n riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE';\n /** Flags raised */\n flags: string[];\n /** Screening timestamp */\n screenedAt: string;\n}\n\n/** Input for comprehensive risk assessment */\nexport interface RiskAssessmentInput {\n /** Address to assess */\n address: string;\n /** Blockchain network */\n chain: Chain;\n /** Agent ID for trust scoring */\n agentId?: string;\n /** Transaction amount for contextual assessment */\n amount?: string;\n /** Token for contextual assessment */\n token?: string;\n}\n\n/** Comprehensive risk assessment result */\nexport interface ComprehensiveRiskResult {\n /** Overall risk level */\n overallRisk: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';\n /** Circle-derived risk score (0-100) */\n circleRiskScore: number;\n /** Kontext trust score (0-100) */\n kontextTrustScore: number;\n /** Combined weighted score (0-100, higher = riskier) */\n combinedScore: number;\n /** Action recommendation */\n recommendation: 'PROCEED' | 'MANUAL_REVIEW' | 'BLOCK';\n /** Individual risk factors */\n factors: ComprehensiveRiskFactor[];\n /** Kontext audit log ID */\n auditLogId: string;\n}\n\n/** Risk factor in comprehensive assessment */\nexport interface ComprehensiveRiskFactor {\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 * Adapter interface for Circle's compliance screening API.\n */\nexport interface CircleComplianceAdapter {\n screenTransaction(input: ScreenTransactionInput): Promise<{\n approved: boolean;\n riskLevel: string;\n flags: string[];\n }>;\n screenAddress(address: string, chain: Chain): Promise<{\n sanctioned: boolean;\n riskLevel: string;\n flags: string[];\n }>;\n}\n\n// ============================================================================\n// Simulation Adapter\n// ============================================================================\n\n/** Known high-risk address patterns for simulation purposes */\nconst SIMULATED_HIGH_RISK_PREFIXES = [\n '0x000000000000000000000000000000000000dead',\n '0x0000000000000000000000000000000000000000',\n];\n\n/**\n * Simulated Circle compliance screening.\n * Uses heuristic rules to approximate screening behavior.\n */\nclass SimulatedComplianceAdapter implements CircleComplianceAdapter {\n async screenTransaction(input: ScreenTransactionInput): Promise<{\n approved: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n const flags: string[] = [];\n let riskLevel = 'LOW';\n\n const amount = parseAmount(input.amount);\n\n // Simulate sanctions check\n if (this.isHighRiskAddress(input.from) || this.isHighRiskAddress(input.to)) {\n flags.push('SANCTIONED_ADDRESS');\n riskLevel = 'SEVERE';\n }\n\n // Amount-based risk\n if (!isNaN(amount)) {\n if (amount >= 100000) {\n flags.push('VERY_LARGE_AMOUNT');\n riskLevel = riskLevel === 'SEVERE' ? 'SEVERE' : 'HIGH';\n } else if (amount >= 50000) {\n flags.push('LARGE_AMOUNT');\n if (riskLevel === 'LOW') riskLevel = 'MEDIUM';\n } else if (amount >= 10000) {\n flags.push('REPORTABLE_AMOUNT');\n if (riskLevel === 'LOW') riskLevel = 'LOW';\n }\n }\n\n // Invalid amount\n if (isNaN(amount) || amount <= 0) {\n flags.push('INVALID_AMOUNT');\n riskLevel = 'HIGH';\n }\n\n // Address format check\n if (!isValidAddress(input.from)) {\n flags.push('INVALID_SENDER_ADDRESS');\n riskLevel = 'HIGH';\n }\n if (!isValidAddress(input.to)) {\n flags.push('INVALID_RECIPIENT_ADDRESS');\n riskLevel = 'HIGH';\n }\n\n const approved = riskLevel !== 'SEVERE' && riskLevel !== 'HIGH';\n\n return { approved, riskLevel, flags };\n }\n\n async screenAddress(address: string, chain: Chain): Promise<{\n sanctioned: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n const flags: string[] = [];\n let riskLevel = 'LOW';\n let sanctioned = false;\n\n if (this.isHighRiskAddress(address)) {\n sanctioned = true;\n riskLevel = 'SEVERE';\n flags.push('SANCTIONED_ADDRESS');\n }\n\n if (!isValidAddress(address)) {\n riskLevel = 'HIGH';\n flags.push('INVALID_ADDRESS_FORMAT');\n }\n\n return { sanctioned, riskLevel, flags };\n }\n\n private isHighRiskAddress(address: string): boolean {\n const lower = address.toLowerCase();\n return SIMULATED_HIGH_RISK_PREFIXES.some((prefix) => lower === prefix);\n }\n}\n\n// ============================================================================\n// Live Adapter\n// ============================================================================\n\n/**\n * Live Circle compliance adapter that calls Circle's screening APIs.\n */\nclass LiveComplianceAdapter implements CircleComplianceAdapter {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.circle.com/v1';\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Circle Compliance API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data as T;\n }\n\n async screenTransaction(input: ScreenTransactionInput): Promise<{\n approved: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n try {\n const result = await this.request<{\n data: { decision: string; riskLevel: string; flags: string[] }\n }>('POST', '/compliance/screening/transactions', {\n from: input.from,\n to: input.to,\n amount: input.amount,\n chain: input.chain,\n token: input.token,\n });\n return {\n approved: result.data.decision === 'APPROVE',\n riskLevel: result.data.riskLevel,\n flags: result.data.flags,\n };\n } catch {\n // Fallback to simulation on API failure\n const sim = new SimulatedComplianceAdapter();\n return sim.screenTransaction(input);\n }\n }\n\n async screenAddress(address: string, chain: Chain): Promise<{\n sanctioned: boolean;\n riskLevel: string;\n flags: string[];\n }> {\n try {\n const result = await this.request<{\n data: { sanctioned: boolean; riskLevel: string; flags: string[] }\n }>('POST', '/compliance/screening/addresses', {\n address,\n chain,\n });\n return result.data;\n } catch {\n // Fallback to simulation on API failure\n const sim = new SimulatedComplianceAdapter();\n return sim.screenAddress(address, chain);\n }\n }\n}\n\n// ============================================================================\n// Kontext Client Interface (subset needed by this module)\n// ============================================================================\n\n/** Minimal interface for the Kontext client used by CircleComplianceEngine */\ninterface KontextLike {\n log(input: { type: string; description: string; agentId: string; metadata?: Record<string, unknown> }): Promise<ActionLog>;\n getTrustScore(agentId: string): Promise<{ score: number }>;\n checkUsdcCompliance(tx: LogTransactionInput): { compliant: boolean; checks: ComplianceCheckResult[]; riskLevel: AnomalySeverity; recommendations: string[] };\n}\n\n// ============================================================================\n// CircleComplianceEngine\n// ============================================================================\n\n/**\n * Dual-layer compliance engine combining Circle's transaction screening\n * with Kontext's trust scoring and anomaly detection.\n *\n * Every screening operation is logged through Kontext's tamper-evident\n * audit system for regulatory compliance.\n *\n * @example\n * ```typescript\n * const kontext = Kontext.init({ projectId: 'my-project', environment: 'production' });\n * const compliance = new CircleComplianceEngine(kontext);\n *\n * const result = await compliance.screenTransaction({\n * from: '0xSender...',\n * to: '0xRecipient...',\n * amount: '5000',\n * chain: 'base',\n * });\n *\n * if (result.combinedDecision === 'BLOCK') {\n * console.log('Transaction blocked');\n * }\n * ```\n */\nexport class CircleComplianceEngine {\n private readonly kontext: KontextLike;\n private readonly adapter: CircleComplianceAdapter;\n private readonly isLiveMode: boolean;\n\n /**\n * Create a new CircleComplianceEngine.\n *\n * @param kontextClient - Initialized Kontext SDK client\n * @param circleApiKey - Circle API key (optional; omit for simulation mode)\n */\n constructor(kontextClient: KontextLike, circleApiKey?: string) {\n this.kontext = kontextClient;\n this.isLiveMode = !!circleApiKey;\n this.adapter = circleApiKey\n ? new LiveComplianceAdapter(circleApiKey)\n : new SimulatedComplianceAdapter();\n }\n\n // --------------------------------------------------------------------------\n // Transaction Screening\n // --------------------------------------------------------------------------\n\n /**\n * Screen a transaction through both Circle and Kontext compliance systems.\n *\n * @param input - Transaction details to screen\n * @returns DualScreenResult with combined decision\n */\n async screenTransaction(input: ScreenTransactionInput): Promise<DualScreenResult> {\n // Step 1: Circle screening\n const circleResult = await this.adapter.screenTransaction(input);\n\n // Step 2: Kontext screening\n const kontextResult = this.runKontextScreening(input);\n\n // Step 3: Combined decision\n const combinedDecision = this.determineCombinedDecision(\n circleResult.approved,\n circleResult.riskLevel as 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n kontextResult.complianceApproved,\n kontextResult.trustScore,\n );\n\n // Step 4: Log the screening\n const logAction = await this.kontext.log({\n type: 'compliance_screening',\n description: `Dual screening: ${input.from} -> ${input.to} (${input.amount} ${input.token ?? 'USDC'}) - ${combinedDecision}`,\n agentId: 'circle-compliance-engine',\n metadata: {\n from: input.from,\n to: input.to,\n amount: input.amount,\n chain: input.chain,\n token: input.token,\n circleApproved: circleResult.approved,\n circleRiskLevel: circleResult.riskLevel,\n circleFlags: circleResult.flags,\n kontextTrustScore: kontextResult.trustScore,\n kontextAnomalyDetected: kontextResult.anomalyDetected,\n kontextComplianceApproved: kontextResult.complianceApproved,\n kontextFlags: kontextResult.flags,\n combinedDecision,\n },\n });\n\n return {\n circleScreening: {\n approved: circleResult.approved,\n riskLevel: circleResult.riskLevel as 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n flags: circleResult.flags,\n },\n kontextScreening: kontextResult,\n combinedDecision,\n auditLogId: logAction.id,\n };\n }\n\n // --------------------------------------------------------------------------\n // Address Screening\n // --------------------------------------------------------------------------\n\n /**\n * Screen an address for sanctions and risk.\n *\n * @param address - On-chain address to screen\n * @param chain - Blockchain network\n * @returns AddressScreenResult with risk assessment\n */\n async screenAddress(address: string, chain: Chain): Promise<AddressScreenResult> {\n const result = await this.adapter.screenAddress(address, chain);\n\n // Log the screening\n await this.kontext.log({\n type: 'address_screening',\n description: `Address screening: ${address} on ${chain} - ${result.riskLevel}`,\n agentId: 'circle-compliance-engine',\n metadata: {\n address,\n chain,\n sanctioned: result.sanctioned,\n riskLevel: result.riskLevel,\n flags: result.flags,\n },\n });\n\n return {\n address,\n chain,\n sanctioned: result.sanctioned,\n riskLevel: result.riskLevel as 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n flags: result.flags,\n screenedAt: now(),\n };\n }\n\n // --------------------------------------------------------------------------\n // Comprehensive Risk Assessment\n // --------------------------------------------------------------------------\n\n /**\n * Get a comprehensive risk assessment combining Circle screening with\n * Kontext trust scoring.\n *\n * @param input - Assessment input\n * @returns ComprehensiveRiskResult with combined scoring\n */\n async getComprehensiveRisk(input: RiskAssessmentInput): Promise<ComprehensiveRiskResult> {\n const factors: ComprehensiveRiskFactor[] = [];\n\n // Circle address screening\n const addressScreen = await this.adapter.screenAddress(input.address, input.chain);\n const circleRiskScore = this.riskLevelToScore(addressScreen.riskLevel);\n\n factors.push({\n name: 'circle_address_screening',\n score: circleRiskScore,\n description: `Circle screening: ${addressScreen.riskLevel}${addressScreen.sanctioned ? ' (SANCTIONED)' : ''}`,\n });\n\n // Kontext trust score\n let kontextTrustScore = 50;\n if (input.agentId) {\n try {\n const trustResult = await this.kontext.getTrustScore(input.agentId);\n kontextTrustScore = trustResult.score;\n } catch {\n // Use default for unknown agents\n }\n }\n\n // Invert trust score to risk (high trust = low risk)\n const kontextRiskScore = 100 - kontextTrustScore;\n factors.push({\n name: 'kontext_trust_score',\n score: kontextRiskScore,\n description: `Kontext trust: ${kontextTrustScore}/100 (risk: ${kontextRiskScore}/100)`,\n });\n\n // Amount-based risk\n if (input.amount) {\n const amount = parseAmount(input.amount);\n let amountRisk = 0;\n if (!isNaN(amount)) {\n if (amount >= 100000) amountRisk = 80;\n else if (amount >= 50000) amountRisk = 60;\n else if (amount >= 10000) amountRisk = 40;\n else if (amount >= 3000) amountRisk = 20;\n else amountRisk = 5;\n }\n factors.push({\n name: 'amount_risk',\n score: amountRisk,\n description: `Amount ${input.amount}: risk score ${amountRisk}`,\n });\n }\n\n // Address format risk\n if (!isValidAddress(input.address)) {\n factors.push({\n name: 'address_format',\n score: 90,\n description: 'Invalid address format',\n });\n }\n\n // Compute combined score (weighted average)\n const totalScore = factors.reduce((sum, f) => sum + f.score, 0);\n const combinedScore = Math.round(totalScore / factors.length);\n\n // Determine overall risk and recommendation\n let overallRisk: ComprehensiveRiskResult['overallRisk'];\n let recommendation: ComprehensiveRiskResult['recommendation'];\n\n if (combinedScore >= 75 || addressScreen.sanctioned) {\n overallRisk = 'CRITICAL';\n recommendation = 'BLOCK';\n } else if (combinedScore >= 50) {\n overallRisk = 'HIGH';\n recommendation = 'MANUAL_REVIEW';\n } else if (combinedScore >= 25) {\n overallRisk = 'MEDIUM';\n recommendation = 'MANUAL_REVIEW';\n } else {\n overallRisk = 'LOW';\n recommendation = 'PROCEED';\n }\n\n // Log the assessment\n const logAction = await this.kontext.log({\n type: 'comprehensive_risk_assessment',\n description: `Risk assessment for ${input.address}: ${overallRisk} (score: ${combinedScore})`,\n agentId: input.agentId ?? 'circle-compliance-engine',\n metadata: {\n address: input.address,\n chain: input.chain,\n circleRiskScore,\n kontextTrustScore,\n combinedScore,\n overallRisk,\n recommendation,\n factorCount: factors.length,\n },\n });\n\n return {\n overallRisk,\n circleRiskScore,\n kontextTrustScore,\n combinedScore,\n recommendation,\n factors,\n auditLogId: logAction.id,\n };\n }\n\n // --------------------------------------------------------------------------\n // Internal Helpers\n // --------------------------------------------------------------------------\n\n /**\n * Run Kontext-side screening using USDC compliance checks and trust scoring.\n */\n private runKontextScreening(input: ScreenTransactionInput): {\n trustScore: number;\n anomalyDetected: boolean;\n complianceApproved: boolean;\n flags: string[];\n } {\n const flags: string[] = [];\n let anomalyDetected = false;\n\n // Run USDC compliance check\n const txInput: LogTransactionInput = {\n txHash: '0x' + '0'.repeat(64),\n chain: input.chain,\n amount: input.amount,\n token: (input.token ?? 'USDC') as 'USDC' | 'EURC',\n from: input.from,\n to: input.to,\n agentId: 'circle-compliance-engine',\n };\n\n const complianceResult = this.kontext.checkUsdcCompliance(txInput);\n\n if (!complianceResult.compliant) {\n flags.push('KONTEXT_COMPLIANCE_FAILED');\n }\n\n // Check for high-severity issues\n const criticalChecks = complianceResult.checks.filter(\n (c) => !c.passed && (c.severity === 'critical' || c.severity === 'high'),\n );\n if (criticalChecks.length > 0) {\n anomalyDetected = true;\n flags.push(...criticalChecks.map((c) => `KONTEXT_${c.name.toUpperCase()}`));\n }\n\n // Amount-based flags\n const amount = parseAmount(input.amount);\n if (!isNaN(amount) && amount >= 50000) {\n flags.push('KONTEXT_LARGE_TRANSACTION');\n }\n\n // Trust score -- use a default since we can't async here\n const trustScore = 50;\n\n return {\n trustScore,\n anomalyDetected,\n complianceApproved: complianceResult.compliant,\n flags,\n };\n }\n\n /**\n * Determine the combined decision based on both screening results.\n */\n private determineCombinedDecision(\n circleApproved: boolean,\n circleRisk: 'LOW' | 'MEDIUM' | 'HIGH' | 'SEVERE',\n kontextApproved: boolean,\n kontextTrustScore: number,\n ): 'APPROVE' | 'REVIEW' | 'BLOCK' {\n // BLOCK if Circle flags as SEVERE or Kontext fails critically\n if (circleRisk === 'SEVERE') return 'BLOCK';\n if (!circleApproved && !kontextApproved) return 'BLOCK';\n\n // REVIEW if either system raises concerns\n if (circleRisk === 'HIGH' || !circleApproved) return 'REVIEW';\n if (!kontextApproved) return 'REVIEW';\n if (circleRisk === 'MEDIUM') return 'REVIEW';\n\n // APPROVE only when both systems agree\n return 'APPROVE';\n }\n\n /**\n * Convert a risk level string to a numeric score.\n */\n private riskLevelToScore(riskLevel: string): number {\n switch (riskLevel) {\n case 'SEVERE': return 95;\n case 'HIGH': return 70;\n case 'MEDIUM': return 40;\n case 'LOW': return 10;\n default: return 50;\n }\n }\n}\n","// ============================================================================\n// Kontext SDK - Circle Gas Station Integration\n// ============================================================================\n//\n// Integrates Circle's Gas Station (sponsored gas) feature with Kontext's\n// audit and compliance infrastructure. Gas Station allows applications to\n// sponsor gas fees for their users on supported chains.\n//\n// Supports two operating modes:\n// - **Simulation mode** (default): Simulates gas sponsorship eligibility\n// and estimation without real API calls.\n// - **Live mode**: When a Circle API key is provided, queries Circle's\n// Gas Station API for real eligibility and estimates.\n// ============================================================================\n\nimport type {\n Chain,\n ActionLog,\n} from '../types.js';\nimport { generateId, now, parseAmount } from '../utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Gas sponsorship eligibility result */\nexport interface GasEligibility {\n /** Whether the wallet is eligible for sponsored gas */\n eligible: boolean;\n /** Maximum sponsored amount in native token */\n maxSponsoredAmount: string;\n /** Supported operations */\n supportedOperations: string[];\n /** Remaining daily quota */\n remainingDailyQuota: string;\n /** Reason if not eligible */\n reason?: string;\n}\n\n/** Input for gas estimation */\nexport interface GasEstimateInput {\n /** Source wallet ID */\n walletId: string;\n /** Destination address */\n destinationAddress: string;\n /** Transfer amount */\n amount: string;\n /** Blockchain network */\n chain: Chain;\n /** Token being transferred */\n token?: string;\n}\n\n/** Gas estimate result */\nexport interface GasEstimate {\n /** Estimated gas cost in native token */\n estimatedGas: string;\n /** Whether this gas would be sponsored */\n sponsored: boolean;\n /** Amount the user would pay (zero if fully sponsored) */\n userCost: string;\n /** Amount Circle would sponsor */\n sponsoredAmount: string;\n /** Chain the estimate is for */\n chain: Chain;\n /** Native token used for gas */\n nativeToken: string;\n}\n\n/** Input for logging a gas sponsorship event */\nexport interface GasSponsorshipLog {\n /** Wallet ID that received sponsorship */\n walletId: string;\n /** Transaction hash of the sponsored transaction */\n transactionHash: string;\n /** Amount of gas sponsored */\n sponsoredGasAmount: string;\n /** Chain the sponsorship occurred on */\n chain: Chain;\n /** Agent that initiated the transaction */\n agent?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Native gas tokens by chain */\nconst NATIVE_TOKENS: Record<string, string> = {\n ethereum: 'ETH',\n base: 'ETH',\n polygon: 'MATIC',\n arbitrum: 'ETH',\n optimism: 'ETH',\n arc: 'ARC',\n};\n\n/** Simulated gas prices in native token (very rough approximations) */\nconst SIMULATED_GAS_PRICES: Record<string, string> = {\n ethereum: '0.005',\n base: '0.0001',\n polygon: '0.01',\n arbitrum: '0.0003',\n optimism: '0.0002',\n arc: '0.0001',\n};\n\n/** Chains eligible for gas sponsorship */\nconst SPONSORSHIP_ELIGIBLE_CHAINS: Chain[] = [\n 'base',\n 'polygon',\n 'arbitrum',\n 'optimism',\n 'arc',\n];\n\n/**\n * Adapter interface for Circle Gas Station API.\n */\nexport interface GasStationAdapter {\n checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility>;\n estimateGas(input: GasEstimateInput): Promise<GasEstimate>;\n}\n\n// ============================================================================\n// Simulation Adapter\n// ============================================================================\n\n/**\n * Simulated Gas Station adapter for development and testing.\n */\nclass SimulatedGasStationAdapter implements GasStationAdapter {\n async checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility> {\n const eligible = SPONSORSHIP_ELIGIBLE_CHAINS.includes(chain);\n\n return {\n eligible,\n maxSponsoredAmount: eligible ? '0.01' : '0',\n supportedOperations: eligible\n ? ['transfer', 'approve', 'swap']\n : [],\n remainingDailyQuota: eligible ? '0.5' : '0',\n reason: eligible ? undefined : `Chain ${chain} is not eligible for gas sponsorship`,\n };\n }\n\n async estimateGas(input: GasEstimateInput): Promise<GasEstimate> {\n const gasPrice = SIMULATED_GAS_PRICES[input.chain] ?? '0.001';\n const nativeToken = NATIVE_TOKENS[input.chain] ?? 'ETH';\n const sponsored = SPONSORSHIP_ELIGIBLE_CHAINS.includes(input.chain);\n\n return {\n estimatedGas: gasPrice,\n sponsored,\n userCost: sponsored ? '0' : gasPrice,\n sponsoredAmount: sponsored ? gasPrice : '0',\n chain: input.chain,\n nativeToken,\n };\n }\n}\n\n// ============================================================================\n// Live Adapter\n// ============================================================================\n\n/**\n * Live Gas Station adapter that calls Circle's API.\n */\nclass LiveGasStationAdapter implements GasStationAdapter {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.circle.com/v1/w3s';\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Circle Gas Station API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data as T;\n }\n\n async checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility> {\n try {\n const result = await this.request<{\n data: {\n eligible: boolean;\n maxSponsoredAmount: string;\n supportedOperations: string[];\n remainingDailyQuota: string;\n }\n }>('GET', `/gas-station/eligibility?walletId=${walletId}&chain=${chain}`);\n return result.data;\n } catch {\n // Fallback to simulation\n const sim = new SimulatedGasStationAdapter();\n return sim.checkEligibility(walletId, chain);\n }\n }\n\n async estimateGas(input: GasEstimateInput): Promise<GasEstimate> {\n try {\n const result = await this.request<{ data: GasEstimate }>('POST', '/gas-station/estimate', input);\n return result.data;\n } catch {\n // Fallback to simulation\n const sim = new SimulatedGasStationAdapter();\n return sim.estimateGas(input);\n }\n }\n}\n\n// ============================================================================\n// Kontext Client Interface (subset needed by this module)\n// ============================================================================\n\n/** Minimal interface for the Kontext client used by GasStationManager */\ninterface KontextLike {\n log(input: { type: string; description: string; agentId: string; metadata?: Record<string, unknown> }): Promise<ActionLog>;\n}\n\n// ============================================================================\n// GasStationManager\n// ============================================================================\n\n/**\n * Manages Circle Gas Station (sponsored gas) with integrated Kontext audit\n * logging for compliance tracking.\n *\n * Gas sponsorship events are logged through Kontext's tamper-evident audit\n * system to maintain a clear record of subsidized transactions.\n *\n * @example\n * ```typescript\n * const kontext = Kontext.init({ projectId: 'my-project', environment: 'production' });\n * const gasStation = new GasStationManager(kontext);\n *\n * const eligibility = await gasStation.checkEligibility('wallet-123', 'base');\n * if (eligibility.eligible) {\n * const estimate = await gasStation.estimateGas({\n * walletId: 'wallet-123',\n * destinationAddress: '0x...',\n * amount: '100',\n * chain: 'base',\n * });\n * console.log(`Gas sponsored: ${estimate.sponsored}`);\n * }\n * ```\n */\nexport class GasStationManager {\n private readonly kontext: KontextLike;\n private readonly adapter: GasStationAdapter;\n private readonly isLiveMode: boolean;\n\n /**\n * Create a new GasStationManager.\n *\n * @param kontextClient - Initialized Kontext SDK client\n * @param circleApiKey - Circle API key (optional; omit for simulation mode)\n */\n constructor(kontextClient: KontextLike, circleApiKey?: string) {\n this.kontext = kontextClient;\n this.isLiveMode = !!circleApiKey;\n this.adapter = circleApiKey\n ? new LiveGasStationAdapter(circleApiKey)\n : new SimulatedGasStationAdapter();\n }\n\n /**\n * Check if a wallet is eligible for gas sponsorship on a given chain.\n *\n * @param walletId - Wallet identifier\n * @param chain - Blockchain network\n * @returns GasEligibility with details\n */\n async checkEligibility(walletId: string, chain: Chain): Promise<GasEligibility> {\n const eligibility = await this.adapter.checkEligibility(walletId, chain);\n\n // Log the eligibility check\n await this.kontext.log({\n type: 'gas_eligibility_check',\n description: `Gas eligibility check for wallet ${walletId} on ${chain}: ${eligibility.eligible ? 'eligible' : 'not eligible'}`,\n agentId: 'gas-station-manager',\n metadata: {\n walletId,\n chain,\n eligible: eligibility.eligible,\n maxSponsoredAmount: eligibility.maxSponsoredAmount,\n remainingDailyQuota: eligibility.remainingDailyQuota,\n reason: eligibility.reason,\n },\n });\n\n return eligibility;\n }\n\n /**\n * Estimate gas cost for a transfer and determine sponsorship.\n *\n * @param input - Transfer details for estimation\n * @returns GasEstimate with sponsorship information\n */\n async estimateGas(input: GasEstimateInput): Promise<GasEstimate> {\n const estimate = await this.adapter.estimateGas(input);\n\n // Log the estimate\n await this.kontext.log({\n type: 'gas_estimate',\n description: `Gas estimate for ${input.amount} ${input.token ?? 'USDC'} transfer on ${input.chain}: ${estimate.estimatedGas} ${estimate.nativeToken}${estimate.sponsored ? ' (sponsored)' : ''}`,\n agentId: 'gas-station-manager',\n metadata: {\n walletId: input.walletId,\n destinationAddress: input.destinationAddress,\n amount: input.amount,\n chain: input.chain,\n token: input.token,\n estimatedGas: estimate.estimatedGas,\n sponsored: estimate.sponsored,\n userCost: estimate.userCost,\n sponsoredAmount: estimate.sponsoredAmount,\n },\n });\n\n return estimate;\n }\n\n /**\n * Log a gas sponsorship event for audit purposes.\n *\n * Call this after a sponsored transaction has been confirmed on-chain\n * to record the sponsorship in Kontext's audit trail.\n *\n * @param input - Sponsorship event details\n * @returns The created ActionLog entry\n */\n async logGasSponsorship(input: GasSponsorshipLog): Promise<ActionLog> {\n const nativeToken = NATIVE_TOKENS[input.chain] ?? 'ETH';\n\n const action = await this.kontext.log({\n type: 'gas_sponsorship',\n description: `Gas sponsorship: ${input.sponsoredGasAmount} ${nativeToken} for wallet ${input.walletId} on ${input.chain} (tx: ${input.transactionHash})`,\n agentId: input.agent ?? 'gas-station-manager',\n metadata: {\n walletId: input.walletId,\n transactionHash: input.transactionHash,\n sponsoredGasAmount: input.sponsoredGasAmount,\n chain: input.chain,\n nativeToken,\n ...input.metadata,\n },\n });\n\n return action;\n }\n\n /**\n * Get the list of chains eligible for gas sponsorship.\n *\n * @returns Array of supported chains\n */\n static getEligibleChains(): Chain[] {\n return [...SPONSORSHIP_ELIGIBLE_CHAINS];\n }\n\n /**\n * Get the native gas token for a chain.\n *\n * @param chain - Blockchain network\n * @returns Native token symbol\n */\n static getNativeToken(chain: Chain): string {\n return NATIVE_TOKENS[chain] ?? 'ETH';\n }\n}\n","// ============================================================================\n// Kontext SDK - Webhook Manager\n// ============================================================================\n\nimport { createHmac, timingSafeEqual } from 'crypto';\nimport type { AnomalyEvent, TrustScore } from './types.js';\nimport type { Task } from './types.js';\nimport { generateId, now } from './utils.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Supported webhook event types */\nexport type WebhookEventType =\n | 'anomaly.detected'\n | 'task.confirmed'\n | 'task.failed'\n | 'trust.score_changed';\n\n/** Webhook registration configuration */\nexport interface WebhookConfig {\n /** Unique identifier for this webhook */\n id: string;\n /** Target URL to receive webhook POST requests */\n url: string;\n /** Event types to listen for */\n events: WebhookEventType[];\n /** Optional secret for HMAC signature verification */\n secret?: string;\n /** Whether this webhook is active */\n active: boolean;\n /** When this webhook was registered */\n createdAt: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Input for registering a new webhook */\nexport interface RegisterWebhookInput {\n /** Target URL */\n url: string;\n /** Event types to listen for */\n events: WebhookEventType[];\n /** Optional secret for payload signing */\n secret?: string;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/** Webhook delivery payload */\nexport interface WebhookPayload {\n /** Unique delivery ID */\n id: string;\n /** Event type */\n event: WebhookEventType;\n /** Timestamp of the event */\n timestamp: string;\n /** Event-specific data */\n data: Record<string, unknown>;\n}\n\n/** Result of a webhook delivery attempt */\nexport interface WebhookDeliveryResult {\n /** Webhook ID */\n webhookId: string;\n /** Delivery payload ID */\n payloadId: string;\n /** Whether delivery succeeded */\n success: boolean;\n /** HTTP status code (if applicable) */\n statusCode: number | null;\n /** Number of attempts made */\n attempts: number;\n /** Error message if failed */\n error: string | null;\n /** Timestamp of last attempt */\n lastAttemptAt: string;\n}\n\n/** Retry configuration */\nexport interface WebhookRetryConfig {\n /** Maximum number of retry attempts */\n maxRetries: number;\n /** Base delay in milliseconds for exponential backoff */\n baseDelayMs: number;\n /** Maximum delay in milliseconds */\n maxDelayMs: number;\n}\n\n/** Default retry configuration */\nconst DEFAULT_RETRY_CONFIG: WebhookRetryConfig = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n};\n\n// ============================================================================\n// Webhook Manager\n// ============================================================================\n\n/**\n * WebhookManager handles registration and delivery of webhook notifications\n * for SDK events including anomaly detection, task confirmation, and trust\n * score changes.\n *\n * Features:\n * - Register multiple webhook URLs with event type filtering\n * - Automatic retry with exponential backoff on delivery failure\n * - Delivery result tracking\n * - Enable/disable individual webhooks\n *\n * @example\n * ```typescript\n * const manager = new WebhookManager();\n *\n * manager.register({\n * url: 'https://example.com/webhooks/kontext',\n * events: ['anomaly.detected', 'task.confirmed'],\n * });\n *\n * // Webhooks fire automatically when events occur\n * await manager.notifyAnomalyDetected(anomalyEvent);\n * ```\n */\nexport class WebhookManager {\n private webhooks: Map<string, WebhookConfig> = new Map();\n private deliveryResults: WebhookDeliveryResult[] = [];\n private retryConfig: WebhookRetryConfig;\n private fetchFn: typeof fetch;\n\n constructor(retryConfig?: Partial<WebhookRetryConfig>, fetchFn?: typeof fetch) {\n this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };\n this.fetchFn = fetchFn ?? globalThis.fetch;\n }\n\n /**\n * Register a new webhook endpoint.\n *\n * @param input - Webhook configuration\n * @returns The created WebhookConfig\n */\n register(input: RegisterWebhookInput): WebhookConfig {\n if (!input.url || input.url.trim() === '') {\n throw new Error('Webhook URL is required');\n }\n\n if (!input.events || input.events.length === 0) {\n throw new Error('At least one event type is required');\n }\n\n const config: WebhookConfig = {\n id: generateId(),\n url: input.url,\n events: input.events,\n secret: input.secret,\n active: true,\n createdAt: now(),\n metadata: input.metadata,\n };\n\n this.webhooks.set(config.id, config);\n\n return config;\n }\n\n /**\n * Unregister a webhook by ID.\n *\n * @param webhookId - The webhook to remove\n * @returns Whether the webhook was found and removed\n */\n unregister(webhookId: string): boolean {\n return this.webhooks.delete(webhookId);\n }\n\n /**\n * Enable or disable a webhook.\n *\n * @param webhookId - The webhook to update\n * @param active - Whether to enable or disable\n * @returns The updated WebhookConfig, or undefined if not found\n */\n setActive(webhookId: string, active: boolean): WebhookConfig | undefined {\n const webhook = this.webhooks.get(webhookId);\n if (!webhook) return undefined;\n\n const updated = { ...webhook, active };\n this.webhooks.set(webhookId, updated);\n return updated;\n }\n\n /**\n * Get all registered webhooks.\n * Secrets are redacted to prevent accidental exposure in logs or API responses.\n */\n getWebhooks(): WebhookConfig[] {\n return Array.from(this.webhooks.values()).map((w) => ({\n ...w,\n secret: w.secret ? '***REDACTED***' : w.secret,\n }));\n }\n\n /**\n * Get a specific webhook by ID.\n * The secret is redacted to prevent accidental exposure in logs or API responses.\n */\n getWebhook(webhookId: string): WebhookConfig | undefined {\n const webhook = this.webhooks.get(webhookId);\n if (!webhook) return undefined;\n return {\n ...webhook,\n secret: webhook.secret ? '***REDACTED***' : webhook.secret,\n };\n }\n\n /**\n * Get delivery results for a specific webhook or all webhooks.\n */\n getDeliveryResults(webhookId?: string): WebhookDeliveryResult[] {\n if (webhookId) {\n return this.deliveryResults.filter((r) => r.webhookId === webhookId);\n }\n return [...this.deliveryResults];\n }\n\n /**\n * Notify all subscribed webhooks of an anomaly detection event.\n *\n * @param anomaly - The detected anomaly event\n * @returns Array of delivery results\n */\n async notifyAnomalyDetected(anomaly: AnomalyEvent): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'anomaly.detected',\n timestamp: now(),\n data: {\n anomalyId: anomaly.id,\n type: anomaly.type,\n severity: anomaly.severity,\n description: anomaly.description,\n agentId: anomaly.agentId,\n actionId: anomaly.actionId,\n detectedAt: anomaly.detectedAt,\n data: anomaly.data,\n },\n };\n\n return this.deliver('anomaly.detected', payload);\n }\n\n /**\n * Notify all subscribed webhooks of a task confirmation.\n *\n * @param task - The confirmed task\n * @returns Array of delivery results\n */\n async notifyTaskConfirmed(task: Task): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'task.confirmed',\n timestamp: now(),\n data: {\n taskId: task.id,\n description: task.description,\n agentId: task.agentId,\n status: task.status,\n confirmedAt: task.confirmedAt,\n correlationId: task.correlationId,\n },\n };\n\n return this.deliver('task.confirmed', payload);\n }\n\n /**\n * Notify all subscribed webhooks of a task failure.\n *\n * @param task - The failed task\n * @returns Array of delivery results\n */\n async notifyTaskFailed(task: Task): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'task.failed',\n timestamp: now(),\n data: {\n taskId: task.id,\n description: task.description,\n agentId: task.agentId,\n status: task.status,\n correlationId: task.correlationId,\n metadata: task.metadata,\n },\n };\n\n return this.deliver('task.failed', payload);\n }\n\n /**\n * Notify all subscribed webhooks of a trust score change.\n *\n * @param trustScore - The new trust score\n * @param previousScore - The previous score value (if known)\n * @returns Array of delivery results\n */\n async notifyTrustScoreChanged(\n trustScore: TrustScore,\n previousScore?: number,\n ): Promise<WebhookDeliveryResult[]> {\n const payload: WebhookPayload = {\n id: generateId(),\n event: 'trust.score_changed',\n timestamp: now(),\n data: {\n agentId: trustScore.agentId,\n score: trustScore.score,\n previousScore: previousScore ?? null,\n level: trustScore.level,\n factors: trustScore.factors,\n computedAt: trustScore.computedAt,\n },\n };\n\n return this.deliver('trust.score_changed', payload);\n }\n\n // --------------------------------------------------------------------------\n // Delivery with retry\n // --------------------------------------------------------------------------\n\n private async deliver(\n eventType: WebhookEventType,\n payload: WebhookPayload,\n ): Promise<WebhookDeliveryResult[]> {\n const subscribers = Array.from(this.webhooks.values()).filter(\n (w) => w.active && w.events.includes(eventType),\n );\n\n const results: WebhookDeliveryResult[] = [];\n\n for (const webhook of subscribers) {\n const result = await this.deliverToWebhook(webhook, payload);\n results.push(result);\n this.deliveryResults.push(result);\n }\n\n return results;\n }\n\n private async deliverToWebhook(\n webhook: WebhookConfig,\n payload: WebhookPayload,\n ): Promise<WebhookDeliveryResult> {\n let lastError: string | null = null;\n let statusCode: number | null = null;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n // Exponential backoff: wait before retries (not before first attempt)\n if (attempt > 0) {\n const delay = Math.min(\n this.retryConfig.baseDelayMs * Math.pow(2, attempt - 1),\n this.retryConfig.maxDelayMs,\n );\n await this.sleep(delay);\n }\n\n const response = await this.fetchFn(webhook.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Kontext-Event': payload.event,\n 'X-Kontext-Delivery': payload.id,\n ...(webhook.secret\n ? { 'X-Kontext-Signature': await this.computeSignature(payload, webhook.secret) }\n : {}),\n },\n body: JSON.stringify(payload),\n });\n\n statusCode = response.status;\n\n if (response.ok) {\n return {\n webhookId: webhook.id,\n payloadId: payload.id,\n success: true,\n statusCode,\n attempts: attempt + 1,\n error: null,\n lastAttemptAt: now(),\n };\n }\n\n lastError = `HTTP ${response.status}`;\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n }\n }\n\n return {\n webhookId: webhook.id,\n payloadId: payload.id,\n success: false,\n statusCode,\n attempts: this.retryConfig.maxRetries + 1,\n error: lastError,\n lastAttemptAt: now(),\n };\n }\n\n private async computeSignature(payload: WebhookPayload, secret: string): Promise<string> {\n const hmac = createHmac('sha256', secret);\n hmac.update(JSON.stringify(payload));\n return hmac.digest('hex');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Verify a webhook signature using constant-time comparison to prevent\n * timing attacks. Use this in your webhook handler to validate incoming\n * payloads from Kontext.\n *\n * @param payload - The raw JSON payload body (string)\n * @param signature - The signature from the X-Kontext-Signature header\n * @param secret - The webhook secret used during registration\n * @returns Whether the signature is valid\n *\n * @example\n * ```typescript\n * const isValid = WebhookManager.verifySignature(\n * req.body, // raw JSON string\n * req.headers['x-kontext-signature'],\n * 'my-webhook-secret',\n * );\n * if (!isValid) return res.status(401).send('Invalid signature');\n * ```\n */\n static verifySignature(payload: string, signature: string, secret: string): boolean {\n const hmac = createHmac('sha256', secret);\n hmac.update(payload);\n const expected = hmac.digest('hex');\n\n if (expected.length !== signature.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(expected, 'hex'), Buffer.from(signature, 'hex'));\n }\n}\n","// ============================================================================\n// Kontext SDK - Vercel AI SDK Integration\n// ============================================================================\n//\n// Provides middleware for the Vercel AI SDK (`ai` npm package) that\n// automatically logs every LLM call, tool invocation, and streaming\n// result into the Kontext tamper-evident digest chain.\n//\n// This enables compliance-grade audit trails for any AI application\n// built on Next.js + Vercel AI SDK with zero application code changes.\n//\n// Middleware pattern: https://sdk.vercel.ai/docs/ai-sdk-core/middleware\n// ============================================================================\n\nimport { Kontext } from '../client.js';\nimport type { Environment } from '../types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** AI operation types recognized by the Vercel AI SDK middleware. */\nexport type AIOperationType = 'generate' | 'stream' | 'object' | 'embed' | 'embedMany';\n\n/**\n * Configuration options for the Kontext Vercel AI SDK middleware.\n *\n * Controls which operations are logged, how tool calls are handled,\n * and whether financial compliance checks are triggered.\n */\nexport interface KontextAIOptions {\n /** Agent identifier for audit logs. Defaults to `'vercel-ai'`. */\n agentId?: string;\n\n /**\n * Tool names that involve financial transactions.\n * When a tool call matches one of these names, Kontext will automatically\n * log a `LogTransactionInput` with the extracted amount, triggering\n * compliance checks and anomaly detection.\n */\n financialTools?: string[];\n\n /**\n * Whether to include tool call arguments in the audit log.\n * Defaults to `false` for privacy. Set to `true` for full traceability.\n */\n logToolArgs?: boolean;\n\n /**\n * Default currency for financial tool calls.\n * Defaults to `'USDC'`.\n */\n defaultCurrency?: string;\n\n /**\n * Trust score threshold (0-100). If the agent's trust score is below\n * this threshold, tool calls will be blocked and `onBlocked` will fire.\n */\n trustThreshold?: number;\n\n /**\n * Callback invoked when a tool call is blocked due to trust threshold\n * or other compliance rules.\n */\n onBlocked?: (toolCall: BlockedToolCall, reason: string) => void;\n}\n\n/**\n * A tool call that was blocked by the Kontext middleware.\n */\nexport interface BlockedToolCall {\n /** The name of the tool that was blocked. */\n toolName: string;\n /** The arguments that were passed to the tool. */\n args: unknown;\n}\n\n/**\n * Input options for the one-line `createKontextAI` setup function.\n * Combines Kontext SDK configuration with AI middleware options.\n */\nexport interface CreateKontextAIInput {\n /** Kontext project identifier. */\n projectId: string;\n\n /** Deployment environment. */\n environment?: Environment;\n\n /** Optional API key for cloud mode. */\n apiKey?: string;\n\n /** Enable debug logging. */\n debug?: boolean;\n\n /** Agent identifier for audit logs. */\n agentId?: string;\n\n /** Tool names that involve financial transactions. */\n financialTools?: string[];\n\n /** Whether to log tool arguments. */\n logToolArgs?: boolean;\n\n /** Default currency for financial tool calls. */\n defaultCurrency?: string;\n\n /** Trust score threshold for blocking tool calls. */\n trustThreshold?: number;\n\n /** Callback when a tool call is blocked. */\n onBlocked?: (toolCall: BlockedToolCall, reason: string) => void;\n}\n\n/**\n * Return type from `createKontextAI`.\n */\nexport interface CreateKontextAIResult {\n /** The wrapped language model with Kontext middleware applied. */\n model: unknown;\n /** The Kontext client instance for direct access to audit, trust, and compliance APIs. */\n kontext: Kontext;\n}\n\n/**\n * Options for the `withKontext` Next.js route handler wrapper.\n */\nexport interface WithKontextOptions {\n /** Kontext project identifier. */\n projectId?: string;\n\n /** Deployment environment. */\n environment?: Environment;\n\n /** Optional API key for cloud mode. */\n apiKey?: string;\n\n /** Agent identifier for audit logs. */\n agentId?: string;\n\n /** Enable debug logging. */\n debug?: boolean;\n}\n\n/**\n * Context object passed to route handlers wrapped with `withKontext`.\n * Provides a pre-configured Kontext client and a helper to wrap AI models.\n */\nexport interface KontextAIContext {\n /** The Kontext client instance. */\n kontext: Kontext;\n\n /**\n * Wrap an AI model with Kontext middleware for automatic audit logging.\n *\n * @param model - A Vercel AI SDK language model\n * @param options - Additional middleware options\n * @returns The wrapped model\n */\n wrapModel: (model: unknown, options?: KontextAIOptions) => unknown;\n\n /** Unique request identifier for correlating logs. */\n requestId: string;\n}\n\n// ============================================================================\n// Middleware\n// ============================================================================\n\n/**\n * Creates a Kontext middleware object for the Vercel AI SDK.\n *\n * This middleware intercepts every `generateText()`, `streamText()`, and\n * `generateObject()` call and automatically logs each operation, tool\n * invocation, and result into the Kontext tamper-evident digest chain.\n *\n * The middleware conforms to the Vercel AI SDK middleware interface:\n * - `transformParams` — Logs the AI request before execution\n * - `wrapGenerate` — Wraps synchronous generation to log tool calls and results\n * - `wrapStream` — Wraps streaming generation to log stream lifecycle events\n *\n * @param kontext - An initialized Kontext client instance\n * @param options - Middleware configuration options\n * @returns A Vercel AI SDK middleware object\n *\n * @example\n * ```typescript\n * import { Kontext } from 'kontext-sdk';\n * import { experimental_wrapLanguageModel as wrapLanguageModel } from 'ai';\n * import { openai } from '@ai-sdk/openai';\n *\n * const kontext = Kontext.init({ projectId: 'my-app', environment: 'production' });\n *\n * const model = wrapLanguageModel({\n * model: openai('gpt-4o'),\n * middleware: kontextMiddleware(kontext, {\n * agentId: 'payment-agent',\n * financialTools: ['transfer_usdc', 'send_payment'],\n * }),\n * });\n *\n * // Every generateText / streamText call is now automatically audited.\n * ```\n */\nexport function kontextMiddleware(kontext: Kontext, options?: KontextAIOptions) {\n const cfg: ResolvedMiddlewareConfig = {\n agentId: options?.agentId ?? 'vercel-ai',\n logToolArgs: options?.logToolArgs ?? false,\n financialTools: options?.financialTools ?? [],\n defaultCurrency: options?.defaultCurrency ?? 'USDC',\n trustThreshold: options?.trustThreshold,\n onBlocked: options?.onBlocked,\n };\n\n return {\n transformParams: (ctx: { params: Record<string, unknown>; type: string }) =>\n logTransformParams(kontext, cfg, ctx),\n wrapGenerate: (ctx: { doGenerate: () => Promise<Record<string, unknown>>; params: Record<string, unknown> }) =>\n wrapGenerateWithAudit(kontext, cfg, ctx),\n wrapStream: (ctx: { doStream: () => Promise<{ stream: ReadableStream; [key: string]: unknown }>; params: Record<string, unknown> }) =>\n wrapStreamWithAudit(kontext, cfg, ctx),\n };\n}\n\n// ============================================================================\n// Resolved config (avoids re-reading options in every helper)\n// ============================================================================\n\ninterface ResolvedMiddlewareConfig {\n agentId: string;\n logToolArgs: boolean;\n financialTools: string[];\n defaultCurrency: string;\n trustThreshold: number | undefined;\n onBlocked: ((toolCall: BlockedToolCall, reason: string) => void) | undefined;\n}\n\n// ============================================================================\n// transformParams — logs AI request before model invocation\n// ============================================================================\n\nasync function logTransformParams(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n { params, type }: { params: Record<string, unknown>; type: string },\n): Promise<Record<string, unknown>> {\n const modelInfo = params['model'] as { modelId?: string } | undefined;\n const tools = params['tools'];\n\n await kontext.log({\n type: `ai_${type}`,\n description: `AI ${type} request to ${modelInfo?.modelId ?? 'unknown'} model`,\n agentId: cfg.agentId,\n metadata: {\n model: modelInfo?.modelId ?? 'unknown',\n toolCount: Array.isArray(tools) ? tools.length : 0,\n maxTokens: params['maxTokens'] ?? null,\n temperature: params['temperature'] ?? null,\n operationType: type,\n },\n });\n\n return params;\n}\n\n// ============================================================================\n// wrapGenerate — wraps synchronous generation with audit logging\n// ============================================================================\n\nasync function wrapGenerateWithAudit(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n { doGenerate, params }: { doGenerate: () => Promise<Record<string, unknown>>; params: Record<string, unknown> },\n): Promise<Record<string, unknown>> {\n const startTime = Date.now();\n\n await enforceAgentTrustThreshold(kontext, cfg);\n\n const result = await doGenerate();\n const duration = Date.now() - startTime;\n const modelId = extractModelId(params);\n\n const toolCalls = result['toolCalls'] as Array<{ toolName: string; args: unknown }> | undefined;\n if (toolCalls && toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await processToolCall(kontext, cfg, toolCall, duration, modelId);\n }\n }\n\n await logGenerateCompletion(kontext, cfg, result, duration, modelId, toolCalls?.length ?? 0);\n return result;\n}\n\n// ============================================================================\n// wrapStream — wraps streaming generation with audit logging\n// ============================================================================\n\nasync function wrapStreamWithAudit(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n { doStream, params }: { doStream: () => Promise<{ stream: ReadableStream; [key: string]: unknown }>; params: Record<string, unknown> },\n): Promise<{ stream: ReadableStream; [key: string]: unknown }> {\n const startTime = Date.now();\n const modelId = extractModelId(params);\n\n await kontext.log({\n type: 'ai_stream_start',\n description: `AI stream started for model ${modelId}`,\n agentId: cfg.agentId,\n metadata: { model: modelId, operationType: 'stream' },\n });\n\n const { stream, ...rest } = await doStream();\n const toolCallsInStream: Array<{ toolName: string; args: unknown }> = [];\n\n const transformedStream = stream.pipeThrough(\n new TransformStream({\n transform(chunk: Record<string, unknown>, controller) {\n controller.enqueue(chunk);\n if (chunk['type'] === 'tool-call') {\n toolCallsInStream.push({\n toolName: chunk['toolName'] as string,\n args: chunk['args'] as unknown,\n });\n }\n },\n async flush() {\n const duration = Date.now() - startTime;\n await logStreamToolCalls(kontext, cfg, toolCallsInStream, duration, modelId);\n await kontext.log({\n type: 'ai_stream_complete',\n description: `AI stream completed in ${duration}ms with ${toolCallsInStream.length} tool call(s)`,\n agentId: cfg.agentId,\n metadata: { duration, toolCallCount: toolCallsInStream.length, model: modelId },\n });\n },\n }),\n );\n\n return { stream: transformedStream, ...rest };\n}\n\n// ============================================================================\n// Shared helpers for middleware decomposition\n// ============================================================================\n\n/** Extract modelId from params, defaulting to 'unknown'. */\nfunction extractModelId(params: Record<string, unknown>): string {\n return (params['model'] as { modelId?: string } | undefined)?.modelId ?? 'unknown';\n}\n\n/** Enforce agent-level trust threshold; throws if score is below threshold. */\nasync function enforceAgentTrustThreshold(kontext: Kontext, cfg: ResolvedMiddlewareConfig): Promise<void> {\n if (cfg.trustThreshold === undefined) return;\n\n const trustScore = await kontext.getTrustScore(cfg.agentId);\n if (trustScore.score < cfg.trustThreshold) {\n await kontext.log({\n type: 'ai_blocked',\n description: `AI generation blocked: agent trust score ${trustScore.score} below threshold ${cfg.trustThreshold}`,\n agentId: cfg.agentId,\n metadata: { trustScore: trustScore.score, trustLevel: trustScore.level, threshold: cfg.trustThreshold },\n });\n throw new Error(\n `Kontext: AI generation blocked. Agent \"${cfg.agentId}\" trust score (${trustScore.score}) ` +\n `is below the required threshold (${cfg.trustThreshold}).`,\n );\n }\n}\n\n/** Process a single tool call: check trust, log the call, log financial data if applicable. */\nasync function processToolCall(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n toolCall: { toolName: string; args: unknown },\n duration: number,\n modelId: string,\n): Promise<void> {\n // Check if this financial tool should be blocked\n if (cfg.trustThreshold !== undefined && cfg.financialTools.includes(toolCall.toolName)) {\n const trustScore = await kontext.getTrustScore(cfg.agentId);\n if (trustScore.score < cfg.trustThreshold) {\n cfg.onBlocked?.({ toolName: toolCall.toolName, args: toolCall.args }, `Trust score ${trustScore.score} below threshold ${cfg.trustThreshold}`);\n await kontext.log({\n type: 'ai_tool_blocked',\n description: `Financial tool \"${toolCall.toolName}\" blocked: trust score ${trustScore.score} below threshold ${cfg.trustThreshold}`,\n agentId: cfg.agentId,\n metadata: { toolName: toolCall.toolName, trustScore: trustScore.score, threshold: cfg.trustThreshold },\n });\n return;\n }\n }\n\n await kontext.log({\n type: 'ai_tool_call',\n description: `Tool call: ${toolCall.toolName}`,\n agentId: cfg.agentId,\n metadata: {\n toolName: toolCall.toolName,\n args: cfg.logToolArgs ? toolCall.args : '[redacted]',\n duration,\n model: modelId,\n },\n });\n\n await logFinancialToolCall(kontext, cfg, toolCall);\n}\n\n/** Log a financial tool call if the tool is in the financialTools list and has an extractable amount. */\nasync function logFinancialToolCall(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n toolCall: { toolName: string; args: unknown },\n source?: string,\n): Promise<void> {\n if (!cfg.financialTools.includes(toolCall.toolName)) return;\n\n const amount = extractAmount(toolCall.args);\n if (amount === null) return;\n\n await kontext.log({\n type: 'ai_financial_tool_call',\n description: `Financial tool \"${toolCall.toolName}\" invoked${source ? ` via ${source}` : ''} with amount ${amount} ${cfg.defaultCurrency}`,\n agentId: cfg.agentId,\n metadata: {\n toolName: toolCall.toolName,\n amount: amount.toString(),\n currency: cfg.defaultCurrency,\n ...(cfg.logToolArgs ? { toolArgs: toolCall.args } : {}),\n ...(source ? { source } : {}),\n },\n });\n}\n\n/** Log the overall generate completion with usage statistics. */\nasync function logGenerateCompletion(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n result: Record<string, unknown>,\n duration: number,\n modelId: string,\n toolCallCount: number,\n): Promise<void> {\n const usage = result['usage'] as { promptTokens?: number; completionTokens?: number; totalTokens?: number } | undefined;\n await kontext.log({\n type: 'ai_response',\n description: `AI response completed in ${duration}ms`,\n agentId: cfg.agentId,\n metadata: {\n duration,\n toolCallCount,\n finishReason: result['finishReason'] ?? 'unknown',\n promptTokens: usage?.promptTokens ?? null,\n completionTokens: usage?.completionTokens ?? null,\n totalTokens: usage?.totalTokens ?? null,\n model: modelId,\n },\n });\n}\n\n/** Log all tool calls collected during a stream, including financial tool detection. */\nasync function logStreamToolCalls(\n kontext: Kontext,\n cfg: ResolvedMiddlewareConfig,\n toolCalls: Array<{ toolName: string; args: unknown }>,\n duration: number,\n modelId: string,\n): Promise<void> {\n for (const toolCall of toolCalls) {\n await kontext.log({\n type: 'ai_tool_call',\n description: `Tool call (stream): ${toolCall.toolName}`,\n agentId: cfg.agentId,\n metadata: {\n toolName: toolCall.toolName,\n args: cfg.logToolArgs ? toolCall.args : '[redacted]',\n duration,\n model: modelId,\n source: 'stream',\n },\n });\n await logFinancialToolCall(kontext, cfg, toolCall, 'stream');\n }\n}\n\n// ============================================================================\n// Model Wrapper\n// ============================================================================\n\n/**\n * Wraps a Vercel AI SDK language model with Kontext middleware for\n * automatic audit logging of all AI operations.\n *\n * This function applies the Kontext middleware using the Vercel AI SDK's\n * `experimental_wrapLanguageModel` pattern. The returned model can be\n * used directly with `generateText()`, `streamText()`, and `generateObject()`.\n *\n * @param model - A Vercel AI SDK language model (e.g., `openai('gpt-4o')`)\n * @param kontext - An initialized Kontext client instance\n * @param options - Middleware configuration options\n * @returns A wrapped language model with Kontext audit logging\n *\n * @example\n * ```typescript\n * import { openai } from '@ai-sdk/openai';\n * import { Kontext, kontextWrapModel } from 'kontext-sdk';\n * import { generateText } from 'ai';\n *\n * const kontext = Kontext.init({ projectId: 'my-app', environment: 'production' });\n * const model = kontextWrapModel(openai('gpt-4o'), kontext, {\n * agentId: 'support-agent',\n * financialTools: ['transfer_usdc'],\n * });\n *\n * const result = await generateText({ model, prompt: 'Send 100 USDC to Alice' });\n * // All operations automatically logged with SHA-256 digest chains\n * ```\n */\nexport function kontextWrapModel(\n model: unknown,\n kontext: Kontext,\n options?: KontextAIOptions,\n): unknown {\n const middleware = kontextMiddleware(kontext, options);\n\n // Return a proxy object that delegates to the original model\n // while intercepting generate/stream calls through our middleware.\n // This follows the Vercel AI SDK middleware wrapping convention.\n return {\n ...(model as Record<string, unknown>),\n _kontextMiddleware: middleware,\n _originalModel: model,\n _kontextInstance: kontext,\n\n // When the Vercel AI SDK calls doGenerate, our middleware wraps it\n async doGenerate(params: Record<string, unknown>) {\n const transformedParams = await middleware.transformParams({\n params,\n type: 'generate',\n });\n\n const originalModel = model as { doGenerate: (p: Record<string, unknown>) => Promise<Record<string, unknown>> };\n return middleware.wrapGenerate({\n doGenerate: () => originalModel.doGenerate(transformedParams),\n params: transformedParams,\n });\n },\n\n // When the Vercel AI SDK calls doStream, our middleware wraps it\n async doStream(params: Record<string, unknown>) {\n const transformedParams = await middleware.transformParams({\n params,\n type: 'stream',\n });\n\n const originalModel = model as { doStream: (p: Record<string, unknown>) => Promise<{ stream: ReadableStream; [key: string]: unknown }> };\n return middleware.wrapStream({\n doStream: () => originalModel.doStream(transformedParams),\n params: transformedParams,\n });\n },\n };\n}\n\n// ============================================================================\n// One-Line Setup\n// ============================================================================\n\n/**\n * One-line Kontext + Vercel AI SDK setup.\n *\n * Creates a Kontext client and wraps a Vercel AI SDK language model in a\n * single function call. The returned model automatically logs every AI\n * operation with tamper-evident SHA-256 digest chains.\n *\n * @param model - A Vercel AI SDK language model (e.g., `openai('gpt-4o')`)\n * @param input - Combined Kontext and AI middleware configuration\n * @returns An object containing the wrapped model and the Kontext client\n *\n * @example\n * ```typescript\n * import { openai } from '@ai-sdk/openai';\n * import { createKontextAI } from 'kontext-sdk';\n * import { generateText } from 'ai';\n *\n * const { model, kontext } = createKontextAI(openai('gpt-4o'), {\n * projectId: 'payment-app',\n * agentId: 'payment-agent',\n * financialTools: ['transfer_usdc', 'send_payment'],\n * });\n *\n * const result = await generateText({ model, tools, prompt: 'Pay 50 USDC' });\n * // All tool calls are automatically logged with digest chains.\n *\n * // Access the audit trail\n * const chain = kontext.exportDigestChain();\n * console.log('Terminal digest:', kontext.getTerminalDigest());\n * ```\n */\nexport function createKontextAI(\n model: unknown,\n input: CreateKontextAIInput,\n): CreateKontextAIResult {\n const kontext = Kontext.init({\n projectId: input.projectId,\n environment: input.environment ?? 'development',\n apiKey: input.apiKey,\n debug: input.debug,\n });\n\n const wrappedModel = kontextWrapModel(model, kontext, {\n agentId: input.agentId,\n financialTools: input.financialTools,\n logToolArgs: input.logToolArgs,\n defaultCurrency: input.defaultCurrency,\n trustThreshold: input.trustThreshold,\n onBlocked: input.onBlocked,\n });\n\n return { model: wrappedModel, kontext };\n}\n\n// ============================================================================\n// Next.js Route Handler\n// ============================================================================\n\n/**\n * Wraps a Next.js API route handler with Kontext audit logging.\n *\n * Every incoming request is logged with a unique request ID, and a\n * pre-configured `KontextAIContext` is passed to the handler. The context\n * provides a `wrapModel()` helper for wrapping AI models inside the handler.\n *\n * On completion, the request lifecycle (including duration and status code)\n * is logged to the digest chain.\n *\n * @param handler - The route handler function\n * @param options - Kontext configuration for the route\n * @returns A standard Next.js route handler function\n *\n * @example\n * ```typescript\n * // app/api/chat/route.ts\n * import { withKontext } from 'kontext-sdk';\n * import { openai } from '@ai-sdk/openai';\n * import { generateText } from 'ai';\n *\n * export const POST = withKontext(async (req, ctx) => {\n * const { messages } = await req.json();\n *\n * const model = ctx.wrapModel(openai('gpt-4o'), {\n * financialTools: ['transfer_usdc'],\n * });\n *\n * const result = await generateText({ model, messages });\n * return Response.json(result);\n * }, {\n * projectId: 'my-app',\n * environment: 'production',\n * });\n * ```\n */\nexport function withKontext(\n handler: (req: Request, ctx: KontextAIContext) => Promise<Response>,\n options?: WithKontextOptions,\n): (req: Request) => Promise<Response> {\n // Validate projectId: must be explicitly provided or set via env var\n const resolvedProjectId = options?.projectId ?? process.env['KONTEXT_PROJECT_ID'];\n if (!resolvedProjectId) {\n throw new Error('Kontext: projectId is required. Provide it via options or set KONTEXT_PROJECT_ID env var.');\n }\n\n // Validate apiKey: if explicitly provided, must not be empty/whitespace\n const resolvedApiKey = options?.apiKey ?? process.env['KONTEXT_API_KEY'];\n if (options?.apiKey !== undefined && options.apiKey.trim() === '') {\n throw new Error('Kontext: apiKey was provided but is empty.');\n }\n\n // Initialize a shared Kontext client for the route\n const kontext = Kontext.init({\n projectId: resolvedProjectId,\n environment: options?.environment ?? (process.env['NODE_ENV'] === 'production' ? 'production' : 'development') as Environment,\n apiKey: resolvedApiKey,\n debug: options?.debug,\n });\n\n const agentId = options?.agentId ?? 'nextjs-route';\n\n return async (req: Request): Promise<Response> => {\n const requestId = generateRequestId();\n const startTime = Date.now();\n\n // Log the incoming request\n await kontext.log({\n type: 'http_request',\n description: `${req.method} ${new URL(req.url).pathname}`,\n agentId,\n correlationId: requestId,\n metadata: {\n method: req.method,\n url: req.url,\n requestId,\n },\n });\n\n // Build the context\n const ctx: KontextAIContext = {\n kontext,\n requestId,\n wrapModel: (model: unknown, aiOptions?: KontextAIOptions) =>\n kontextWrapModel(model, kontext, {\n ...aiOptions,\n agentId: aiOptions?.agentId ?? agentId,\n }),\n };\n\n try {\n const response = await handler(req, ctx);\n const duration = Date.now() - startTime;\n\n // Log successful response\n await kontext.log({\n type: 'http_response',\n description: `Response ${response.status} in ${duration}ms`,\n agentId,\n correlationId: requestId,\n metadata: {\n status: response.status,\n duration,\n requestId,\n terminalDigest: kontext.getTerminalDigest(),\n },\n });\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n // Log the error\n await kontext.log({\n type: 'http_error',\n description: `Request failed after ${duration}ms: ${error instanceof Error ? error.message : 'Unknown error'}`,\n agentId,\n correlationId: requestId,\n metadata: {\n error: error instanceof Error ? error.message : String(error),\n duration,\n requestId,\n },\n });\n\n throw error;\n }\n };\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Extract a numeric amount from tool call arguments.\n *\n * Searches for common field names (`amount`, `value`, `total`, `payment`,\n * `transfer`) in the arguments object and returns the first valid number found.\n *\n * @param args - The tool call arguments (typically a JSON object)\n * @returns The extracted numeric amount, or `null` if no amount was found\n */\nexport function extractAmount(args: unknown): number | null {\n if (args === null || args === undefined) return null;\n\n if (typeof args === 'number') return args;\n if (typeof args === 'string') {\n const parsed = parseFloat(args);\n return isNaN(parsed) ? null : parsed;\n }\n\n if (typeof args === 'object') {\n const obj = args as Record<string, unknown>;\n const amountFields = ['amount', 'value', 'total', 'payment', 'transfer', 'sum'];\n\n for (const field of amountFields) {\n if (field in obj) {\n const value = obj[field];\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (!isNaN(parsed)) return parsed;\n }\n }\n }\n\n // Recurse into nested objects (one level deep)\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const nested = extractAmount(value);\n if (nested !== null) return nested;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Generate a unique request identifier for correlating log entries\n * within a single HTTP request lifecycle.\n */\nfunction generateRequestId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `req_${crypto.randomUUID()}`;\n }\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `req_${timestamp}-${random}`;\n}\n"]}
|