kontext-sdk 0.1.0

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.
@@ -0,0 +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/integrations/cctp.ts","../src/webhooks.ts"],"names":["KontextErrorCode","createHash","path","fs","REPORTING_THRESHOLD"],"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';\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) */\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}\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// 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\n// ============================================================================\n// This module provides an in-memory store used by the SDK in local mode.\n// In cloud mode, data is sent to the Kontext API instead.\n// For production persistence, this would be replaced by a database adapter\n// (e.g., PostgreSQL, Cloud Firestore, BigQuery).\n\nimport type {\n ActionLog,\n TransactionRecord,\n Task,\n AnomalyEvent,\n} from './types.js';\n\n/**\n * In-memory data store for the Kontext SDK.\n * Holds all action logs, transactions, tasks, and anomaly events.\n *\n * NOTE: This store is intentionally simple for the MVP. In production,\n * replace with a persistent store backed by Cloud Firestore, PostgreSQL,\n * or BigQuery for compliance-grade durability.\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\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'];\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://api.kontext.dev';\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/** OFAC/sanctions-related blocked address patterns (example -- in production these come from an API) */\nconst BLOCKED_ADDRESS_PREFIXES: string[] = [\n // These are examples. Real implementation would query an OFAC API.\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/**\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 (placeholder for OFAC integration)\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 * 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 // In production, this would query an OFAC/sanctions API.\n // For MVP, we check against a local blocklist.\n const isBlocked = BLOCKED_ADDRESS_PREFIXES.some((prefix) =>\n address.toLowerCase().startsWith(prefix.toLowerCase()),\n );\n\n return {\n name: `sanctions_${label}`,\n passed: !isBlocked,\n description: isBlocked\n ? `${label} address ${address} appears on sanctions list`\n : `${label} address passed sanctions screening`,\n severity: isBlocked ? '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 // 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} 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';\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 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 */\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 // 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 // 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 // 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 - CCTP (Cross-Chain Transfer Protocol) Integration\n// ============================================================================\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 */\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};\n\n/** CCTP message status */\nexport type CCTPMessageStatus =\n | 'pending'\n | 'attested'\n | 'confirmed'\n | 'failed';\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}\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// ============================================================================\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 * 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 // 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 - 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"]}