@thehoneyjar/sigil-anchor 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/lifecycle/fork-manager.ts","../../src/utils/rpc.ts","../../src/types.ts","../../src/lifecycle/snapshot-manager.ts","../../src/lifecycle/checkpoint-manager.ts","../../src/lifecycle/session-manager.ts","../../src/graph/task-graph.ts","../../src/warden/physics-loader.ts","../../src/warden/vocabulary-loader.ts","../../src/warden/grounding-gate.ts","../../src/warden/adversarial-warden.ts","../../src/warden/lens-validator.ts"],"names":["readFile","z","process","writeFile","mkdir","existsSync","readdir","join","DEFAULT_BASE_PATH","dirname","cachedPath","parseSyncStrategy","parseTiming","parseConfirmation"],"mappings":"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","sourcesContent":["/**\n * Anchor CLI\n *\n * Ground truth enforcement for Sigil design physics.\n */\n\nimport { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { ForkManager } from '../lifecycle/fork-manager.js';\nimport { SnapshotManager } from '../lifecycle/snapshot-manager.js';\nimport { CheckpointManager } from '../lifecycle/checkpoint-manager.js';\nimport { SessionManager } from '../lifecycle/session-manager.js';\nimport { TaskGraph } from '../graph/task-graph.js';\nimport {\n validateGrounding,\n getExitCode,\n loadPhysics,\n loadVocabulary,\n AdversarialWarden,\n getHierarchyDescription,\n validateLensContext,\n getLensExitCode,\n} from '../warden/index.js';\nimport { ZONE_HIERARCHY, LensContextSchema } from '../types.js';\nimport type { NetworkConfig, LensContext, Zone } from '../types.js';\n\nconst VERSION = '4.3.1';\n\n/** Known network configurations */\nconst NETWORKS: Record<string, NetworkConfig> = {\n mainnet: {\n name: 'mainnet',\n chainId: 1,\n rpcUrl: process.env['ETH_RPC_URL'] ?? 'https://eth.llamarpc.com',\n },\n sepolia: {\n name: 'sepolia',\n chainId: 11155111,\n rpcUrl: process.env['SEPOLIA_RPC_URL'] ?? 'https://rpc.sepolia.org',\n },\n arbitrum: {\n name: 'arbitrum',\n chainId: 42161,\n rpcUrl: process.env['ARBITRUM_RPC_URL'] ?? 'https://arb1.arbitrum.io/rpc',\n },\n optimism: {\n name: 'optimism',\n chainId: 10,\n rpcUrl: process.env['OPTIMISM_RPC_URL'] ?? 'https://mainnet.optimism.io',\n },\n polygon: {\n name: 'polygon',\n chainId: 137,\n rpcUrl: process.env['POLYGON_RPC_URL'] ?? 'https://polygon-rpc.com',\n },\n base: {\n name: 'base',\n chainId: 8453,\n rpcUrl: process.env['BASE_RPC_URL'] ?? 'https://mainnet.base.org',\n },\n};\n\nconst program = new Command();\n\nprogram\n .name('anchor')\n .description('Ground truth enforcement for Sigil design physics')\n .version(VERSION);\n\n// =============================================================================\n// Fork Commands\n// =============================================================================\n\nprogram\n .command('fork <network>')\n .description('Spawn an Anvil fork of the specified network')\n .option('-b, --block <number>', 'Block number to fork at')\n .option('-p, --port <number>', 'RPC port (auto-assigned if not specified)')\n .option('-s, --session <id>', 'Session ID to associate with fork')\n .option('--rpc-url <url>', 'Custom RPC URL (overrides network default)')\n .action(async (networkName: string, options: {\n block?: string;\n port?: string;\n session?: string;\n rpcUrl?: string;\n }) => {\n const manager = new ForkManager();\n await manager.init();\n\n // Get network config\n let network = NETWORKS[networkName.toLowerCase()];\n if (!network) {\n // Allow custom network with --rpc-url\n if (options.rpcUrl) {\n network = {\n name: networkName,\n chainId: 1, // Will be detected from RPC\n rpcUrl: options.rpcUrl,\n };\n } else {\n console.error(`Unknown network: ${networkName}`);\n console.error(`Available networks: ${Object.keys(NETWORKS).join(', ')}`);\n console.error('Or provide a custom RPC URL with --rpc-url');\n process.exit(1);\n }\n }\n\n // Override RPC URL if provided\n if (options.rpcUrl) {\n network = { ...network, rpcUrl: options.rpcUrl };\n }\n\n try {\n console.log(`Forking ${network.name}...`);\n\n const fork = await manager.fork({\n network,\n ...(options.block !== undefined && { blockNumber: parseInt(options.block, 10) }),\n ...(options.port !== undefined && { port: parseInt(options.port, 10) }),\n ...(options.session !== undefined && { sessionId: options.session }),\n });\n\n console.log('');\n console.log('Fork created successfully:');\n console.log('');\n console.log(` ID: ${fork.id}`);\n console.log(` Network: ${fork.network.name}`);\n console.log(` Chain ID: ${fork.network.chainId}`);\n console.log(` Block: ${fork.blockNumber}`);\n console.log(` RPC URL: ${fork.rpcUrl}`);\n console.log(` PID: ${fork.pid}`);\n console.log('');\n console.log('Environment variables:');\n const env = manager.exportEnv(fork.id);\n for (const [key, value] of Object.entries(env)) {\n console.log(` export ${key}=${value}`);\n }\n } catch (error) {\n console.error('Failed to create fork:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('forks')\n .description('List all active forks')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const manager = new ForkManager();\n await manager.init();\n\n const forks = manager.list();\n\n if (options.json) {\n console.log(JSON.stringify(forks, null, 2));\n return;\n }\n\n if (forks.length === 0) {\n console.log('No active forks.');\n return;\n }\n\n console.log('Active forks:');\n console.log('');\n\n for (const fork of forks) {\n const age = Math.round((Date.now() - fork.createdAt.getTime()) / 1000 / 60);\n console.log(` ${fork.id}`);\n console.log(` Network: ${fork.network.name} (chain ${fork.network.chainId})`);\n console.log(` Block: ${fork.blockNumber}`);\n console.log(` RPC: ${fork.rpcUrl}`);\n console.log(` Age: ${age} minutes`);\n if (fork.sessionId) {\n console.log(` Session: ${fork.sessionId}`);\n }\n console.log('');\n }\n });\n\nprogram\n .command('kill <fork-id>')\n .description('Kill a specific fork')\n .action(async (forkId: string) => {\n const manager = new ForkManager();\n await manager.init();\n\n const fork = manager.get(forkId);\n if (!fork) {\n console.error(`Fork not found: ${forkId}`);\n process.exit(1);\n }\n\n await manager.kill(forkId);\n console.log(`Fork ${forkId} terminated.`);\n });\n\nprogram\n .command('kill-all')\n .description('Kill all active forks')\n .action(async () => {\n const manager = new ForkManager();\n await manager.init();\n\n const forks = manager.list();\n if (forks.length === 0) {\n console.log('No active forks to kill.');\n return;\n }\n\n await manager.killAll();\n console.log(`Killed ${forks.length} fork(s).`);\n });\n\n// =============================================================================\n// Environment Export\n// =============================================================================\n\nprogram\n .command('env <fork-id>')\n .description('Export environment variables for a fork')\n .option('--format <type>', 'Output format: shell, fish, or json', 'shell')\n .action(async (forkId: string, options: { format: string }) => {\n const manager = new ForkManager();\n await manager.init();\n\n try {\n const env = manager.exportEnv(forkId);\n\n switch (options.format) {\n case 'json':\n console.log(JSON.stringify(env, null, 2));\n break;\n case 'fish':\n for (const [key, value] of Object.entries(env)) {\n console.log(`set -x ${key} ${value}`);\n }\n break;\n case 'shell':\n default:\n for (const [key, value] of Object.entries(env)) {\n console.log(`export ${key}=${value}`);\n }\n break;\n }\n } catch (error) {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Snapshot Commands\n// =============================================================================\n\nprogram\n .command('snapshot')\n .description('Create a new EVM snapshot')\n .requiredOption('-f, --fork <id>', 'Fork ID to snapshot')\n .requiredOption('-s, --session <id>', 'Session ID')\n .option('-t, --task <id>', 'Task ID to associate with snapshot')\n .option('-d, --description <text>', 'Description of the snapshot')\n .action(async (options: {\n fork: string;\n session: string;\n task?: string;\n description?: string;\n }) => {\n const forkManager = new ForkManager();\n await forkManager.init();\n\n const fork = forkManager.get(options.fork);\n if (!fork) {\n console.error(`Fork not found: ${options.fork}`);\n process.exit(1);\n }\n\n const snapshotManager = new SnapshotManager();\n await snapshotManager.init(options.session);\n\n try {\n const snapshot = await snapshotManager.create(\n {\n forkId: options.fork,\n sessionId: options.session,\n ...(options.task !== undefined && { taskId: options.task }),\n ...(options.description !== undefined && { description: options.description }),\n },\n fork.rpcUrl\n );\n\n console.log('Snapshot created:');\n console.log('');\n console.log(` ID: ${snapshot.id}`);\n console.log(` Block: ${snapshot.blockNumber}`);\n console.log(` Session: ${snapshot.sessionId}`);\n if (snapshot.taskId) {\n console.log(` Task: ${snapshot.taskId}`);\n }\n if (snapshot.description) {\n console.log(` Description: ${snapshot.description}`);\n }\n } catch (error) {\n console.error('Failed to create snapshot:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('revert <snapshot-id>')\n .description('Revert to a previous EVM snapshot')\n .requiredOption('-f, --fork <id>', 'Fork ID to revert')\n .requiredOption('-s, --session <id>', 'Session ID')\n .action(async (snapshotId: string, options: { fork: string; session: string }) => {\n const forkManager = new ForkManager();\n await forkManager.init();\n\n const fork = forkManager.get(options.fork);\n if (!fork) {\n console.error(`Fork not found: ${options.fork}`);\n process.exit(1);\n }\n\n const snapshotManager = new SnapshotManager();\n await snapshotManager.init(options.session);\n\n const snapshot = snapshotManager.get(snapshotId);\n if (!snapshot) {\n console.error(`Snapshot not found: ${snapshotId}`);\n process.exit(1);\n }\n\n try {\n const success = await snapshotManager.revert(fork.rpcUrl, snapshotId);\n\n if (success) {\n console.log(`Reverted to snapshot ${snapshotId}`);\n console.log(` Block: ${snapshot.blockNumber}`);\n } else {\n console.error('Revert failed');\n process.exit(1);\n }\n } catch (error) {\n console.error('Failed to revert:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('snapshots')\n .description('List all snapshots for a session')\n .requiredOption('-s, --session <id>', 'Session ID')\n .option('--json', 'Output as JSON')\n .action(async (options: { session: string; json?: boolean }) => {\n const snapshotManager = new SnapshotManager();\n await snapshotManager.init(options.session);\n\n const snapshots = snapshotManager.list();\n\n if (options.json) {\n console.log(JSON.stringify(snapshots, null, 2));\n return;\n }\n\n if (snapshots.length === 0) {\n console.log('No snapshots for this session.');\n return;\n }\n\n console.log(`Snapshots for session ${options.session}:`);\n console.log('');\n\n for (const snap of snapshots) {\n const age = Math.round((Date.now() - snap.createdAt.getTime()) / 1000 / 60);\n console.log(` ${snap.id}`);\n console.log(` Block: ${snap.blockNumber}`);\n console.log(` Fork: ${snap.forkId}`);\n console.log(` Age: ${age} minutes`);\n if (snap.taskId) {\n console.log(` Task: ${snap.taskId}`);\n }\n console.log('');\n }\n });\n\n// =============================================================================\n// Session Commands\n// =============================================================================\n\nprogram\n .command('session <network>')\n .description('Create a new Anchor session')\n .option('-b, --block <number>', 'Block number to fork at')\n .option('--rpc-url <url>', 'Custom RPC URL (overrides network default)')\n .action(async (networkName: string, options: { block?: string; rpcUrl?: string }) => {\n // Get network config\n let network = NETWORKS[networkName.toLowerCase()];\n if (!network) {\n if (options.rpcUrl) {\n network = {\n name: networkName,\n chainId: 1,\n rpcUrl: options.rpcUrl,\n };\n } else {\n console.error(`Unknown network: ${networkName}`);\n console.error(`Available networks: ${Object.keys(NETWORKS).join(', ')}`);\n process.exit(1);\n }\n }\n\n if (options.rpcUrl) {\n network = { ...network, rpcUrl: options.rpcUrl };\n }\n\n const sessionManager = new SessionManager();\n await sessionManager.init();\n\n try {\n console.log(`Creating session on ${network.name}...`);\n\n const session = await sessionManager.create(\n network,\n options.block ? { blockNumber: parseInt(options.block, 10) } : undefined\n );\n\n console.log('');\n console.log('Session created:');\n console.log('');\n console.log(` Session ID: ${session.metadata.id}`);\n console.log(` Network: ${session.metadata.network.name}`);\n console.log(` Fork ID: ${session.fork.id}`);\n console.log(` Block: ${session.fork.blockNumber}`);\n console.log(` RPC URL: ${session.fork.rpcUrl}`);\n console.log(` Status: ${session.metadata.status}`);\n console.log('');\n console.log('To resume this session later:');\n console.log(` anchor resume ${session.metadata.id}`);\n } catch (error) {\n console.error('Failed to create session:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('sessions')\n .description('List all sessions')\n .option('--status <status>', 'Filter by status (active, suspended, complete, failed)')\n .option('--json', 'Output as JSON')\n .action(async (options: { status?: string; json?: boolean }) => {\n const sessionManager = new SessionManager();\n await sessionManager.init();\n\n const filter = options.status\n ? { status: options.status as 'active' | 'suspended' | 'complete' | 'failed' }\n : undefined;\n\n const sessions = sessionManager.list(filter);\n\n if (options.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n if (sessions.length === 0) {\n console.log('No sessions found.');\n return;\n }\n\n console.log('Sessions:');\n console.log('');\n\n for (const session of sessions) {\n const age = Math.round((Date.now() - session.lastActivity.getTime()) / 1000 / 60);\n console.log(` ${session.id}`);\n console.log(` Network: ${session.network.name}`);\n console.log(` Status: ${session.status}`);\n console.log(` Block: ${session.initialBlock}`);\n console.log(` Age: ${age} minutes`);\n console.log('');\n }\n });\n\nprogram\n .command('resume <session-id>')\n .description('Resume an existing session')\n .action(async (sessionId: string) => {\n const sessionManager = new SessionManager();\n await sessionManager.init();\n\n try {\n console.log(`Resuming session ${sessionId}...`);\n\n const session = await sessionManager.resume(sessionId);\n\n console.log('');\n console.log('Session resumed:');\n console.log('');\n console.log(` Session ID: ${session.metadata.id}`);\n console.log(` Network: ${session.metadata.network.name}`);\n console.log(` Fork ID: ${session.fork.id}`);\n console.log(` Block: ${session.fork.blockNumber}`);\n console.log(` RPC URL: ${session.fork.rpcUrl}`);\n console.log(` Status: ${session.metadata.status}`);\n\n // Show task graph status\n const pending = session.taskGraph.getTasksByStatus('pending').length;\n const running = session.taskGraph.getTasksByStatus('running').length;\n const complete = session.taskGraph.getTasksByStatus('complete').length;\n const blocked = session.taskGraph.getTasksByStatus('blocked').length;\n\n console.log('');\n console.log('Task Graph:');\n console.log(` Pending: ${pending}`);\n console.log(` Running: ${running}`);\n console.log(` Complete: ${complete}`);\n console.log(` Blocked: ${blocked}`);\n } catch (error) {\n console.error('Failed to resume session:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('status <session-id>')\n .description('Show session status')\n .option('--json', 'Output as JSON')\n .action(async (sessionId: string, options: { json?: boolean }) => {\n const sessionManager = new SessionManager();\n await sessionManager.init();\n\n const metadata = sessionManager.get(sessionId);\n if (!metadata) {\n console.error(`Session not found: ${sessionId}`);\n process.exit(1);\n }\n\n if (options.json) {\n console.log(JSON.stringify(metadata, null, 2));\n return;\n }\n\n console.log('Session Status:');\n console.log('');\n console.log(` ID: ${metadata.id}`);\n console.log(` Network: ${metadata.network.name}`);\n console.log(` Status: ${metadata.status}`);\n console.log(` Initial Block: ${metadata.initialBlock}`);\n console.log(` Current Fork: ${metadata.forkId}`);\n console.log(` Created: ${metadata.createdAt.toISOString()}`);\n console.log(` Last Activity: ${metadata.lastActivity.toISOString()}`);\n });\n\nprogram\n .command('graph <session-id>')\n .description('Show task graph for a session')\n .option('--json', 'Output as JSON')\n .action(async (sessionId: string, options: { json?: boolean }) => {\n const taskGraph = new TaskGraph({ sessionId, autoSave: false });\n await taskGraph.init();\n\n const data = taskGraph.toJSON();\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data.tasks.length === 0) {\n console.log('No tasks in graph.');\n return;\n }\n\n console.log(`Task Graph for session ${sessionId}:`);\n console.log('');\n\n // Group by status\n const byStatus = new Map<string, typeof data.tasks>();\n for (const task of data.tasks) {\n const existing = byStatus.get(task.status) ?? [];\n existing.push(task);\n byStatus.set(task.status, existing);\n }\n\n const statusOrder = ['running', 'pending', 'complete', 'blocked', 'failed'];\n\n for (const status of statusOrder) {\n const tasks = byStatus.get(status);\n if (!tasks || tasks.length === 0) continue;\n\n console.log(` ${status.toUpperCase()} (${tasks.length}):`);\n\n for (const task of tasks) {\n console.log(` ${task.id}`);\n console.log(` Type: ${task.type}`);\n if (task.snapshotId) {\n console.log(` Snapshot: ${task.snapshotId}`);\n }\n if (task.dependencies.length > 0) {\n console.log(` Dependencies: ${task.dependencies.join(', ')}`);\n }\n }\n console.log('');\n }\n });\n\n// =============================================================================\n// Checkpoint Commands\n// =============================================================================\n\nprogram\n .command('checkpoint <session-id>')\n .description('Create a checkpoint for a session')\n .requiredOption('-f, --fork <id>', 'Fork ID to checkpoint')\n .action(async (sessionId: string, options: { fork: string }) => {\n const forkManager = new ForkManager();\n await forkManager.init();\n\n const fork = forkManager.get(options.fork);\n if (!fork) {\n console.error(`Fork not found: ${options.fork}`);\n process.exit(1);\n }\n\n const checkpointManager = new CheckpointManager();\n await checkpointManager.init(sessionId, options.fork);\n\n try {\n console.log('Creating checkpoint...');\n\n const checkpoint = await checkpointManager.create(fork.rpcUrl);\n\n console.log('');\n console.log('Checkpoint created:');\n console.log('');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Session: ${checkpoint.sessionId}`);\n console.log(` Fork: ${checkpoint.forkId}`);\n console.log(` Block: ${checkpoint.blockNumber}`);\n console.log(` Snapshot Range: ${checkpoint.snapshotRange.first} - ${checkpoint.snapshotRange.last}`);\n console.log(` Snapshot Count: ${checkpoint.snapshotCount}`);\n } catch (error) {\n console.error('Failed to create checkpoint:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('checkpoints <session-id>')\n .description('List checkpoints for a session')\n .option('--json', 'Output as JSON')\n .action(async (sessionId: string, options: { json?: boolean }) => {\n const checkpointManager = new CheckpointManager();\n // Initialize with dummy fork ID since we just want to list\n await checkpointManager.init(sessionId, 'list-only');\n\n const checkpoints = checkpointManager.list();\n\n if (options.json) {\n console.log(JSON.stringify(checkpoints, null, 2));\n return;\n }\n\n if (checkpoints.length === 0) {\n console.log('No checkpoints for this session.');\n return;\n }\n\n console.log(`Checkpoints for session ${sessionId}:`);\n console.log('');\n\n for (const cp of checkpoints) {\n const age = Math.round((Date.now() - cp.createdAt.getTime()) / 1000 / 60);\n console.log(` ${cp.id}`);\n console.log(` Block: ${cp.blockNumber}`);\n console.log(` Fork: ${cp.forkId}`);\n console.log(` Snapshot Range: ${cp.snapshotRange.first} - ${cp.snapshotRange.last}`);\n console.log(` Age: ${age} minutes`);\n console.log('');\n }\n });\n\nprogram\n .command('restore <checkpoint-id>')\n .description('Restore session from a checkpoint')\n .requiredOption('-s, --session <id>', 'Session ID')\n .action(async (checkpointId: string, options: { session: string }) => {\n const sessionManager = new SessionManager();\n await sessionManager.init();\n\n const metadata = sessionManager.get(options.session);\n if (!metadata) {\n console.error(`Session not found: ${options.session}`);\n process.exit(1);\n }\n\n const forkManager = new ForkManager();\n await forkManager.init();\n\n const checkpointManager = new CheckpointManager();\n await checkpointManager.init(options.session, metadata.forkId);\n\n const checkpoint = checkpointManager.get(checkpointId);\n if (!checkpoint) {\n console.error(`Checkpoint not found: ${checkpointId}`);\n process.exit(1);\n }\n\n try {\n console.log(`Restoring from checkpoint ${checkpointId}...`);\n\n const fork = await checkpointManager.restore(checkpointId, forkManager, metadata.network);\n\n console.log('');\n console.log('Restored successfully:');\n console.log('');\n console.log(` New Fork ID: ${fork.id}`);\n console.log(` Block: ${fork.blockNumber}`);\n console.log(` RPC URL: ${fork.rpcUrl}`);\n } catch (error) {\n console.error('Failed to restore:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Warden Commands\n// =============================================================================\n\nprogram\n .command('validate')\n .description('Validate a grounding statement against Sigil physics')\n .option('-f, --file <path>', 'Read statement from file')\n .option('-t, --text <statement>', 'Statement text to validate')\n .option('--physics <path>', 'Path to physics rules file')\n .option('--vocabulary <path>', 'Path to vocabulary file')\n .option('--lens <json>', 'Lens context JSON for data source validation')\n .option('--lens-file <path>', 'Read lens context from JSON file')\n .option('--zone <zone>', 'Zone for lens validation (critical, elevated, standard, local)')\n .option('--json', 'Output as JSON')\n .option('--exit-code', 'Exit with validation status code')\n .action(async (options: {\n file?: string;\n text?: string;\n physics?: string;\n vocabulary?: string;\n lens?: string;\n lensFile?: string;\n zone?: string;\n json?: boolean;\n exitCode?: boolean;\n }) => {\n let statement: string | undefined;\n let lensContext: LensContext | undefined;\n let zone: Zone | undefined;\n\n // Parse zone if provided\n if (options.zone) {\n const validZones = ['critical', 'elevated', 'standard', 'local'];\n if (!validZones.includes(options.zone)) {\n console.error(`Invalid zone: ${options.zone}. Must be one of: ${validZones.join(', ')}`);\n process.exit(1);\n }\n zone = options.zone as Zone;\n }\n\n // Parse lens context if provided\n if (options.lens) {\n try {\n const parsed = JSON.parse(options.lens);\n const validated = LensContextSchema.safeParse(parsed);\n if (!validated.success) {\n console.error('Invalid lens context:', validated.error.message);\n process.exit(1);\n }\n lensContext = validated.data as LensContext;\n } catch {\n console.error('Failed to parse lens context JSON');\n process.exit(1);\n }\n } else if (options.lensFile) {\n try {\n const content = await readFile(options.lensFile, 'utf-8');\n const parsed = JSON.parse(content);\n const validated = LensContextSchema.safeParse(parsed);\n if (!validated.success) {\n console.error('Invalid lens context:', validated.error.message);\n process.exit(1);\n }\n lensContext = validated.data as LensContext;\n } catch {\n console.error(`Failed to read lens context file: ${options.lensFile}`);\n process.exit(1);\n }\n }\n\n // Read grounding statement\n if (options.file) {\n try {\n statement = await readFile(options.file, 'utf-8');\n } catch {\n console.error(`Failed to read file: ${options.file}`);\n process.exit(1);\n }\n } else if (options.text) {\n statement = options.text;\n }\n\n // Must have either statement or lens context\n if (!statement && !lensContext) {\n console.error('Provide a statement with -f (file) or -t (text), or lens context with --lens or --lens-file');\n process.exit(1);\n }\n\n try {\n const validateOptions: { physicsPath?: string; vocabularyPath?: string } = {};\n if (options.physics) validateOptions.physicsPath = options.physics;\n if (options.vocabulary) validateOptions.vocabularyPath = options.vocabulary;\n\n // Run grounding validation if statement provided\n let groundingResult;\n if (statement) {\n groundingResult = await validateGrounding(statement, validateOptions);\n }\n\n // Run lens validation if lens context provided\n let lensResult;\n if (lensContext) {\n // Use zone from grounding result if not explicitly provided\n const effectiveZone = zone ?? groundingResult?.requiredZone ?? 'standard';\n lensResult = validateLensContext(lensContext, effectiveZone);\n }\n\n // Build combined result\n const combinedResult = {\n ...(groundingResult && {\n status: groundingResult.status,\n checks: groundingResult.checks,\n requiredZone: groundingResult.requiredZone,\n citedZone: groundingResult.citedZone,\n correction: groundingResult.correction,\n }),\n ...(lensResult && {\n lens_validation: {\n valid: lensResult.valid,\n issues: lensResult.issues,\n summary: lensResult.summary,\n },\n }),\n };\n\n if (options.json) {\n console.log(JSON.stringify(combinedResult, null, 2));\n } else {\n // Show grounding validation results\n if (groundingResult) {\n const statusEmoji = groundingResult.status === 'VALID' ? '✓' : groundingResult.status === 'DRIFT' ? '⚠' : '✗';\n console.log(`${statusEmoji} Status: ${groundingResult.status}`);\n console.log('');\n console.log('Grounding Checks:');\n console.log(` Relevance: ${groundingResult.checks.relevance.passed ? '✓' : '✗'} ${groundingResult.checks.relevance.reason}`);\n console.log(` Hierarchy: ${groundingResult.checks.hierarchy.passed ? '✓' : '✗'} ${groundingResult.checks.hierarchy.reason}`);\n console.log(` Rules: ${groundingResult.checks.rules.passed ? '✓' : '✗'} ${groundingResult.checks.rules.reason}`);\n console.log('');\n console.log(`Required Zone: ${groundingResult.requiredZone}`);\n console.log(`Cited Zone: ${groundingResult.citedZone ?? '(none)'}`);\n\n if (groundingResult.correction) {\n console.log('');\n console.log(`Correction: ${groundingResult.correction}`);\n }\n }\n\n // Show lens validation results\n if (lensResult) {\n if (groundingResult) console.log('');\n const lensEmoji = lensResult.valid ? '✓' : '✗';\n console.log(`${lensEmoji} Lens Validation: ${lensResult.summary}`);\n\n if (lensResult.issues.length > 0) {\n console.log('');\n console.log('Lens Issues:');\n for (const issue of lensResult.issues) {\n const severityEmoji = issue.severity === 'error' ? '✗' : issue.severity === 'warning' ? '⚠' : 'ℹ';\n console.log(` ${severityEmoji} [${issue.type}] ${issue.message}`);\n if (issue.suggestion) {\n console.log(` → ${issue.suggestion}`);\n }\n }\n }\n }\n }\n\n if (options.exitCode) {\n // Return the most severe exit code\n let exitCode = 0;\n if (groundingResult) {\n exitCode = Math.max(exitCode, getExitCode(groundingResult));\n }\n if (lensResult) {\n exitCode = Math.max(exitCode, getLensExitCode(lensResult));\n }\n process.exit(exitCode);\n }\n } catch (error) {\n console.error('Validation error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('physics')\n .description('Show loaded physics rules')\n .option('-p, --path <path>', 'Path to physics file')\n .option('--json', 'Output as JSON')\n .action(async (options: { path?: string; json?: boolean }) => {\n try {\n const physics = await loadPhysics(options.path);\n\n if (options.json) {\n const obj: Record<string, unknown> = {};\n for (const [key, value] of physics) {\n obj[key] = value;\n }\n console.log(JSON.stringify(obj, null, 2));\n return;\n }\n\n console.log('Physics Rules:');\n console.log('');\n console.log(' Effect Sync Timing Confirmation');\n console.log(' ────────────── ──────────── ─────── ────────────');\n\n for (const [effect, rule] of physics) {\n const effectPad = effect.padEnd(14);\n const syncPad = rule.sync.padEnd(12);\n const timingPad = `${rule.timing}ms`.padEnd(7);\n console.log(` ${effectPad} ${syncPad} ${timingPad} ${rule.confirmation}`);\n }\n } catch (error) {\n console.error('Failed to load physics:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram\n .command('vocabulary')\n .description('Show loaded vocabulary')\n .option('-p, --path <path>', 'Path to vocabulary file')\n .option('--json', 'Output as JSON')\n .action(async (options: { path?: string; json?: boolean }) => {\n try {\n const vocabulary = await loadVocabulary(options.path);\n\n if (options.json) {\n const obj = {\n effects: Object.fromEntries(vocabulary.effects),\n typeOverrides: Object.fromEntries(vocabulary.typeOverrides),\n domainDefaults: Object.fromEntries(vocabulary.domainDefaults),\n };\n console.log(JSON.stringify(obj, null, 2));\n return;\n }\n\n console.log('Vocabulary:');\n console.log('');\n\n console.log('Effect Keywords:');\n for (const [effect, entry] of vocabulary.effects) {\n console.log(` ${effect}: ${entry.keywords.slice(0, 8).join(', ')}${entry.keywords.length > 8 ? '...' : ''}`);\n }\n\n console.log('');\n console.log('Type Overrides:');\n for (const [type, effect] of vocabulary.typeOverrides) {\n console.log(` ${type} → ${effect}`);\n }\n } catch (error) {\n console.error('Failed to load vocabulary:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Adversarial Warden Commands\n// =============================================================================\n\nprogram\n .command('warden')\n .description('Run adversarial warden validation')\n .option('-f, --file <path>', 'Read statement from file')\n .option('-t, --text <statement>', 'Statement text to test')\n .option('--hierarchy', 'Show zone hierarchy')\n .option('--physics <path>', 'Path to physics rules file')\n .option('--vocabulary <path>', 'Path to vocabulary file')\n .option('--json', 'Output as JSON')\n .option('--exit-code', 'Exit with validation status code')\n .action(async (options: {\n file?: string;\n text?: string;\n hierarchy?: boolean;\n physics?: string;\n vocabulary?: string;\n json?: boolean;\n exitCode?: boolean;\n }) => {\n // Show hierarchy if requested\n if (options.hierarchy) {\n console.log('Zone Hierarchy:');\n console.log('');\n console.log(` ${getHierarchyDescription()}`);\n console.log('');\n console.log('Zones:');\n for (const zone of ZONE_HIERARCHY) {\n const index = ZONE_HIERARCHY.indexOf(zone);\n const restriction = index === 0 ? '(most restrictive)' : index === ZONE_HIERARCHY.length - 1 ? '(least restrictive)' : '';\n console.log(` ${index + 1}. ${zone} ${restriction}`);\n }\n return;\n }\n\n // Validate statement\n let statement: string;\n\n if (options.file) {\n try {\n statement = await readFile(options.file, 'utf-8');\n } catch {\n console.error(`Failed to read file: ${options.file}`);\n process.exit(1);\n }\n } else if (options.text) {\n statement = options.text;\n } else {\n console.error('Provide a statement with -f (file) or -t (text), or use --hierarchy');\n process.exit(1);\n }\n\n try {\n const warden = new AdversarialWarden();\n\n const validateOptions: { physicsPath?: string; vocabularyPath?: string } = {};\n if (options.physics) validateOptions.physicsPath = options.physics;\n if (options.vocabulary) validateOptions.vocabularyPath = options.vocabulary;\n\n const result = await warden.validate(statement, validateOptions);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n const statusEmoji = result.status === 'VALID' ? '✓' : result.status === 'DRIFT' ? '⚠' : '✗';\n console.log(`${statusEmoji} Status: ${result.status}`);\n console.log('');\n console.log('Grounding Checks:');\n console.log(` Relevance: ${result.checks.relevance.passed ? '✓' : '✗'} ${result.checks.relevance.reason}`);\n console.log(` Hierarchy: ${result.checks.hierarchy.passed ? '✓' : '✗'} ${result.checks.hierarchy.reason}`);\n console.log(` Rules: ${result.checks.rules.passed ? '✓' : '✗'} ${result.checks.rules.reason}`);\n console.log('');\n console.log('Adversarial Checks:');\n console.log(` Relevance: ${result.adversarialChecks.relevance.passed ? '✓' : '✗'} ${result.adversarialChecks.relevance.reason}`);\n console.log(` Learned Rules: ${result.adversarialChecks.learnedRules.passed ? '✓' : '✗'} ${result.adversarialChecks.learnedRules.reason}`);\n console.log('');\n console.log(`Required Zone: ${result.requiredZone}`);\n console.log(`Cited Zone: ${result.citedZone ?? '(none)'}`);\n\n if (result.correction) {\n console.log('');\n console.log(`Correction: ${result.correction}`);\n }\n }\n\n if (options.exitCode) {\n process.exit(getExitCode(result));\n }\n } catch (error) {\n console.error('Warden error:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// =============================================================================\n// Version Info\n// =============================================================================\n\nprogram\n .command('version')\n .description('Show Anchor version')\n .action(() => {\n console.log(`Anchor v${VERSION}`);\n console.log('Ground truth enforcement for Sigil design physics.');\n });\n\n// Parse and run\nprogram.parse();\n","/**\n * ForkManager - Anvil fork lifecycle management\n *\n * Manages spawning, tracking, and killing Anvil fork processes.\n * Persists fork registry to grimoires/anchor/forks.json.\n */\n\nimport { spawn, ChildProcess } from 'node:child_process';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { EventEmitter } from 'eventemitter3';\nimport { rpcCall, waitForRpc } from '../utils/rpc.js';\nimport type { Fork, ForkConfig, ForkRegistry } from '../types.js';\nimport { ForkRegistrySchema } from '../types.js';\n\n/** ForkManager events */\ninterface ForkManagerEvents {\n 'fork:created': (fork: Fork) => void;\n 'fork:exit': (forkId: string, code: number | null) => void;\n 'fork:error': (forkId: string, error: Error) => void;\n}\n\n/** Default port range for Anvil forks */\nconst DEFAULT_PORT_START = 8545;\nconst DEFAULT_PORT_END = 8600;\n\n/** Path to fork registry file */\nconst DEFAULT_REGISTRY_PATH = 'grimoires/anchor/forks.json';\n\n/**\n * ForkManager class for managing Anvil fork lifecycle\n */\nexport class ForkManager extends EventEmitter<ForkManagerEvents> {\n private forks: Map<string, Fork> = new Map();\n private processes: Map<string, ChildProcess> = new Map();\n private usedPorts: Set<number> = new Set();\n private registryPath: string;\n\n constructor(options?: { registryPath?: string }) {\n super();\n this.registryPath = options?.registryPath ?? DEFAULT_REGISTRY_PATH;\n }\n\n /**\n * Initialize the ForkManager by loading persisted registry\n */\n async init(): Promise<void> {\n await this.loadRegistry();\n }\n\n /**\n * Spawn a new Anvil fork\n *\n * @param config - Fork configuration\n * @returns Promise resolving to the created Fork\n */\n async fork(config: ForkConfig): Promise<Fork> {\n const port = config.port ?? this.findAvailablePort();\n const forkId = this.generateForkId();\n\n // Build Anvil arguments\n const args = [\n '--fork-url',\n config.network.rpcUrl,\n '--port',\n port.toString(),\n '--chain-id',\n config.network.chainId.toString(),\n ];\n\n if (config.blockNumber !== undefined) {\n args.push('--fork-block-number', config.blockNumber.toString());\n }\n\n // Spawn Anvil process\n const process = spawn('anvil', args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n detached: false,\n });\n\n const pid = process.pid;\n if (!pid) {\n throw new Error('Failed to spawn Anvil process');\n }\n\n const rpcUrl = `http://127.0.0.1:${port}`;\n\n // Wait for RPC to be ready\n try {\n await waitForRpc(rpcUrl, 30, 500);\n } catch {\n process.kill();\n throw new Error(`Anvil fork failed to become ready at ${rpcUrl}`);\n }\n\n // Get actual block number\n const blockNumberHex = await rpcCall<string>(rpcUrl, 'eth_blockNumber');\n const blockNumber = config.blockNumber ?? parseInt(blockNumberHex, 16);\n\n const fork: Fork = {\n id: forkId,\n network: config.network,\n blockNumber,\n rpcUrl,\n port,\n pid,\n createdAt: new Date(),\n ...(config.sessionId !== undefined && { sessionId: config.sessionId }),\n };\n\n // Track fork\n this.forks.set(forkId, fork);\n this.processes.set(forkId, process);\n this.usedPorts.add(port);\n\n // Handle process exit\n process.on('exit', (code) => {\n this.handleProcessExit(forkId, code);\n });\n\n process.on('error', (error) => {\n this.emit('fork:error', forkId, error);\n });\n\n // Persist registry\n await this.saveRegistry();\n\n this.emit('fork:created', fork);\n return fork;\n }\n\n /**\n * Wait for a fork to be ready\n *\n * @param forkId - Fork ID to wait for\n * @param timeoutMs - Timeout in milliseconds\n */\n async waitForReady(forkId: string, timeoutMs: number = 30000): Promise<void> {\n const fork = this.forks.get(forkId);\n if (!fork) {\n throw new Error(`Fork ${forkId} not found`);\n }\n await waitForRpc(fork.rpcUrl, Math.ceil(timeoutMs / 500), 500);\n }\n\n /**\n * Kill a specific fork\n *\n * @param forkId - Fork ID to kill\n */\n async kill(forkId: string): Promise<void> {\n const process = this.processes.get(forkId);\n const fork = this.forks.get(forkId);\n\n if (process) {\n process.kill('SIGTERM');\n // Give it time to terminate gracefully\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (!process.killed) {\n process.kill('SIGKILL');\n }\n }\n\n if (fork) {\n this.usedPorts.delete(fork.port);\n }\n\n this.forks.delete(forkId);\n this.processes.delete(forkId);\n\n await this.saveRegistry();\n }\n\n /**\n * Kill all forks\n */\n async killAll(): Promise<void> {\n const forkIds = Array.from(this.forks.keys());\n await Promise.all(forkIds.map((id) => this.kill(id)));\n }\n\n /**\n * List all active forks\n *\n * @returns Array of active forks\n */\n list(): Fork[] {\n return Array.from(this.forks.values());\n }\n\n /**\n * Get a fork by ID\n *\n * @param forkId - Fork ID\n * @returns Fork if found, undefined otherwise\n */\n get(forkId: string): Fork | undefined {\n return this.forks.get(forkId);\n }\n\n /**\n * Export environment variables for a fork\n *\n * @param forkId - Fork ID\n * @returns Environment variables object\n */\n exportEnv(forkId: string): Record<string, string> {\n const fork = this.forks.get(forkId);\n if (!fork) {\n throw new Error(`Fork ${forkId} not found`);\n }\n\n return {\n RPC_URL: fork.rpcUrl,\n CHAIN_ID: fork.network.chainId.toString(),\n FORK_BLOCK: fork.blockNumber.toString(),\n FORK_ID: fork.id,\n };\n }\n\n /**\n * Load fork registry from disk\n */\n private async loadRegistry(): Promise<void> {\n try {\n if (!existsSync(this.registryPath)) {\n return;\n }\n\n const content = await readFile(this.registryPath, 'utf-8');\n const data = JSON.parse(content);\n const registry = ForkRegistrySchema.parse(data);\n\n // Only load forks that are still running (by checking if process exists)\n for (const registryFork of registry.forks) {\n try {\n // Check if process is still running\n process.kill(registryFork.pid, 0);\n\n // Build Fork object with proper types\n const fork: Fork = {\n id: registryFork.id,\n network: registryFork.network,\n blockNumber: registryFork.blockNumber,\n rpcUrl: registryFork.rpcUrl,\n port: registryFork.port,\n pid: registryFork.pid,\n createdAt: registryFork.createdAt,\n ...(registryFork.sessionId !== undefined && { sessionId: registryFork.sessionId }),\n };\n\n // Check if RPC is responsive\n const ready = await this.checkForkHealth(fork);\n if (ready) {\n this.forks.set(fork.id, fork);\n this.usedPorts.add(fork.port);\n }\n } catch {\n // Process not running, skip\n }\n }\n } catch {\n // Registry doesn't exist or is corrupt, start fresh\n }\n }\n\n /**\n * Save fork registry to disk\n */\n private async saveRegistry(): Promise<void> {\n const registry: ForkRegistry = {\n forks: Array.from(this.forks.values()).map((fork) => ({\n ...fork,\n createdAt: fork.createdAt.toISOString() as unknown as Date,\n })),\n lastUpdated: new Date().toISOString() as unknown as Date,\n };\n\n // Ensure directory exists\n const dir = dirname(this.registryPath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(this.registryPath, JSON.stringify(registry, null, 2));\n }\n\n /**\n * Check if a fork is still healthy\n */\n private async checkForkHealth(fork: Fork): Promise<boolean> {\n try {\n await rpcCall<string>(fork.rpcUrl, 'eth_chainId', [], 2000);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Handle process exit\n */\n private handleProcessExit(forkId: string, code: number | null): void {\n const fork = this.forks.get(forkId);\n if (fork) {\n this.usedPorts.delete(fork.port);\n }\n this.forks.delete(forkId);\n this.processes.delete(forkId);\n this.emit('fork:exit', forkId, code);\n void this.saveRegistry();\n }\n\n /**\n * Find an available port\n */\n private findAvailablePort(): number {\n for (let port = DEFAULT_PORT_START; port <= DEFAULT_PORT_END; port++) {\n if (!this.usedPorts.has(port)) {\n return port;\n }\n }\n throw new Error('No available ports in range');\n }\n\n /**\n * Generate a unique fork ID\n */\n private generateForkId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `fork-${timestamp}-${random}`;\n }\n}\n\n/** Singleton instance for convenience */\nlet defaultManager: ForkManager | null = null;\n\n/**\n * Get the default ForkManager instance\n */\nexport function getForkManager(): ForkManager {\n if (!defaultManager) {\n defaultManager = new ForkManager();\n }\n return defaultManager;\n}\n\n/**\n * Reset the default ForkManager (for testing)\n */\nexport function resetForkManager(): void {\n defaultManager = null;\n}\n","/**\n * JSON-RPC helper for Anvil communication\n *\n * Provides type-safe RPC calls with timeout handling and error management.\n */\n\nimport { z } from 'zod';\n\n/** JSON-RPC 2.0 request format */\ninterface JsonRpcRequest {\n jsonrpc: '2.0';\n id: number;\n method: string;\n params?: unknown[];\n}\n\n/** JSON-RPC 2.0 response format */\ninterface JsonRpcResponse<T> {\n jsonrpc: '2.0';\n id: number;\n result?: T;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\n/** RPC error with code and message */\nexport class RpcError extends Error {\n constructor(\n public readonly code: number,\n message: string,\n public readonly data?: unknown\n ) {\n super(message);\n this.name = 'RpcError';\n }\n}\n\n/** RPC timeout error */\nexport class RpcTimeoutError extends Error {\n constructor(\n public readonly method: string,\n public readonly timeoutMs: number\n ) {\n super(`RPC call '${method}' timed out after ${timeoutMs}ms`);\n this.name = 'RpcTimeoutError';\n }\n}\n\n/** Default timeout for RPC calls (30 seconds) */\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Internal request ID counter */\nlet requestId = 0;\n\n/**\n * Make a JSON-RPC call to an Anvil node\n *\n * @param url - RPC endpoint URL\n * @param method - RPC method name (e.g., 'eth_blockNumber', 'evm_snapshot')\n * @param params - Optional method parameters\n * @param timeoutMs - Timeout in milliseconds (default: 30000)\n * @returns Promise resolving to the result\n * @throws {RpcError} If the RPC returns an error\n * @throws {RpcTimeoutError} If the request times out\n */\nexport async function rpcCall<T>(\n url: string,\n method: string,\n params: unknown[] = [],\n timeoutMs: number = DEFAULT_TIMEOUT_MS\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: ++requestId,\n method,\n params,\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new RpcError(-32000, `HTTP error: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as JsonRpcResponse<T>;\n\n if (data.error) {\n throw new RpcError(data.error.code, data.error.message, data.error.data);\n }\n\n if (data.result === undefined) {\n throw new RpcError(-32000, 'RPC response missing result');\n }\n\n return data.result;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new RpcTimeoutError(method, timeoutMs);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Check if an RPC endpoint is ready by calling eth_chainId\n *\n * @param url - RPC endpoint URL\n * @param timeoutMs - Timeout for the check\n * @returns Promise resolving to true if ready, false otherwise\n */\nexport async function isRpcReady(url: string, timeoutMs: number = 5000): Promise<boolean> {\n try {\n await rpcCall<string>(url, 'eth_chainId', [], timeoutMs);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Poll until RPC is ready\n *\n * @param url - RPC endpoint URL\n * @param maxAttempts - Maximum number of polling attempts\n * @param intervalMs - Interval between attempts in ms\n * @returns Promise resolving when ready\n * @throws Error if max attempts exceeded\n */\nexport async function waitForRpc(\n url: string,\n maxAttempts: number = 30,\n intervalMs: number = 1000\n): Promise<void> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (await isRpcReady(url)) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n throw new Error(`RPC at ${url} not ready after ${maxAttempts} attempts`);\n}\n\n/** Zod schema for validating hex strings */\nexport const hexStringSchema = z.string().regex(/^0x[0-9a-fA-F]*$/);\n\n/** Zod schema for validating block numbers */\nexport const blockNumberSchema = z.union([hexStringSchema, z.literal('latest'), z.literal('pending'), z.literal('earliest')]);\n","/**\n * Anchor Core Types\n *\n * Type definitions for the Anchor ground truth enforcement layer.\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// Fork Types\n// =============================================================================\n\n/** Network configuration for forking */\nexport interface NetworkConfig {\n /** Network name (e.g., 'mainnet', 'sepolia') */\n name: string;\n /** Chain ID */\n chainId: number;\n /** RPC URL to fork from */\n rpcUrl: string;\n}\n\n/** Fork configuration */\nexport interface ForkConfig {\n /** Network to fork */\n network: NetworkConfig;\n /** Block number to fork at (optional, defaults to latest) */\n blockNumber?: number;\n /** Local RPC port (optional, auto-assigned if not specified) */\n port?: number;\n /** Session ID this fork belongs to */\n sessionId?: string;\n}\n\n/** Active fork instance */\nexport interface Fork {\n /** Unique fork identifier */\n id: string;\n /** Network configuration */\n network: NetworkConfig;\n /** Block number fork was created at */\n blockNumber: number;\n /** Local RPC URL */\n rpcUrl: string;\n /** Local RPC port */\n port: number;\n /** Process ID */\n pid: number;\n /** Creation timestamp */\n createdAt: Date;\n /** Session ID this fork belongs to */\n sessionId?: string;\n}\n\n/** Fork registry schema for persistence */\nexport const ForkSchema = z.object({\n id: z.string(),\n network: z.object({\n name: z.string(),\n chainId: z.number(),\n rpcUrl: z.string(),\n }),\n blockNumber: z.number(),\n rpcUrl: z.string(),\n port: z.number(),\n pid: z.number(),\n createdAt: z.string().transform((s: string) => new Date(s)),\n sessionId: z.string().optional(),\n});\n\nexport const ForkRegistrySchema = z.object({\n forks: z.array(ForkSchema),\n lastUpdated: z.string().transform((s: string) => new Date(s)),\n});\n\nexport type ForkRegistry = z.infer<typeof ForkRegistrySchema>;\n\n// =============================================================================\n// Snapshot Types\n// =============================================================================\n\n/** Snapshot metadata */\nexport interface SnapshotMetadata {\n /** Snapshot ID (from Anvil) */\n id: string;\n /** Fork ID this snapshot belongs to */\n forkId: string;\n /** Session ID */\n sessionId: string;\n /** Task ID that created this snapshot */\n taskId?: string;\n /** Block number at snapshot time */\n blockNumber: number;\n /** Creation timestamp */\n createdAt: Date;\n /** Description */\n description?: string;\n}\n\n/** Snapshot configuration */\nexport interface SnapshotConfig {\n /** Fork ID to snapshot */\n forkId: string;\n /** Session ID */\n sessionId: string;\n /** Task ID */\n taskId?: string;\n /** Description */\n description?: string;\n}\n\n// =============================================================================\n// Checkpoint Types\n// =============================================================================\n\n/** Checkpoint metadata */\nexport interface CheckpointMetadata {\n /** Checkpoint ID */\n id: string;\n /** Session ID */\n sessionId: string;\n /** Fork ID this checkpoint was created from */\n forkId: string;\n /** Snapshot range covered by this checkpoint */\n snapshotRange: {\n first: string;\n last: string;\n };\n /** Block number at checkpoint time */\n blockNumber: number;\n /** Creation timestamp */\n createdAt: Date;\n /** Number of snapshots since last checkpoint */\n snapshotCount: number;\n}\n\n/** Checkpoint configuration */\nexport interface CheckpointConfig {\n /** Session ID */\n sessionId: string;\n /** Fork ID */\n forkId: string;\n /** Snapshot interval before checkpointing */\n interval?: number;\n}\n\n// =============================================================================\n// Task Graph Types\n// =============================================================================\n\n/** Task types in the Anchor pipeline */\nexport type TaskType = 'fork' | 'ground' | 'warden' | 'generate' | 'validate' | 'write';\n\n/** Task status */\nexport type TaskStatus = 'pending' | 'running' | 'complete' | 'blocked' | 'failed';\n\n/** Task in the state-pinned graph */\nexport interface Task {\n /** Unique task ID */\n id: string;\n /** Task type */\n type: TaskType;\n /** Current status */\n status: TaskStatus;\n /** Snapshot ID binding this task to EVM state */\n snapshotId?: string;\n /** Checkpoint ID for recovery */\n checkpointId?: string;\n /** IDs of tasks this depends on */\n dependencies: string[];\n /** Task input data */\n input: unknown;\n /** Task output data */\n output?: unknown;\n /** Error if failed */\n error?: string;\n /** Creation timestamp */\n createdAt: Date;\n /** Completion timestamp */\n completedAt?: Date;\n}\n\n/** Task graph data for persistence */\nexport interface TaskGraphData {\n /** Session ID */\n sessionId: string;\n /** All tasks */\n tasks: Task[];\n /** Current head task ID */\n headTaskId?: string;\n /** Last updated timestamp */\n lastUpdated: Date;\n}\n\n// =============================================================================\n// Warden Types\n// =============================================================================\n\n/** Zone hierarchy for physics validation */\nexport type Zone = 'critical' | 'elevated' | 'standard' | 'local';\n\n/** Zone hierarchy order (most restrictive first) */\nexport const ZONE_HIERARCHY: Zone[] = ['critical', 'elevated', 'standard', 'local'];\n\n/** Warden validation input */\nexport interface WardenInput {\n /** Component or action being validated */\n component: string;\n /** Cited zone in grounding statement */\n citedZone: Zone | null;\n /** Keywords detected in the component */\n keywords: string[];\n /** Grounding statement from agent */\n groundingStatement: string;\n /** Physics rules being applied */\n appliedPhysics?: {\n sync?: string;\n timing?: string;\n confirmation?: string;\n };\n}\n\n/** Individual check result */\nexport interface CheckResult {\n /** Whether the check passed */\n passed: boolean;\n /** Reason for pass/fail */\n reason: string;\n}\n\n/** Warden validation result */\nexport interface WardenResult {\n /** Overall validation status */\n status: 'VALID' | 'DRIFT' | 'DECEPTIVE';\n /** Individual check results */\n checks: {\n relevance: CheckResult;\n hierarchy: CheckResult;\n rules: CheckResult;\n };\n /** Required zone based on analysis */\n requiredZone: Zone;\n /** Zone cited by agent */\n citedZone: Zone | null;\n /** Correction message if needed */\n correction?: string;\n}\n\n// =============================================================================\n// Learned Rules Types\n// =============================================================================\n\n/** Learned rule trigger conditions */\nexport interface LearnedRuleTrigger {\n /** Component name patterns to match */\n component_name_contains?: string[];\n /** Zone to match */\n zone?: Zone;\n /** Effect type to match */\n effect?: string;\n /** Props to check for */\n has_props?: string[];\n}\n\n/** Learned rule constraint */\nexport interface LearnedRuleConstraint {\n /** Constraint type */\n type: 'timing' | 'sync' | 'easing' | 'confirmation' | 'custom';\n /** Operator for comparison */\n operator: '==' | '!=' | '>' | '>=' | '<' | '<=' | 'contains' | 'matches';\n /** Expected value */\n expected: string | number;\n /** Message on violation */\n message: string;\n}\n\n/** Grounding requirement for a rule */\nexport interface LearnedRuleGroundingRequirement {\n /** Fields that must be cited */\n must_cite?: {\n zone?: Zone;\n physics?: string[];\n };\n /** Warden check questions */\n warden_check?: string[];\n}\n\n/** A learned rule from pattern detection or manual definition */\nexport interface LearnedRule {\n /** Unique rule ID */\n id: string;\n /** Rule version */\n version: string;\n /** Human-readable description */\n description: string;\n /** How the rule was created */\n created_from: 'manual' | 'pattern_detection' | 'import';\n /** Pattern ID if created from pattern */\n pattern_id?: string;\n /** Rule definition */\n rule: {\n trigger: LearnedRuleTrigger;\n constraint: LearnedRuleConstraint;\n };\n /** Grounding requirements */\n grounding_requirement?: LearnedRuleGroundingRequirement;\n /** Creation timestamp */\n created_at: string;\n /** Last updated timestamp */\n updated_at: string;\n}\n\n// =============================================================================\n// Exit Codes\n// =============================================================================\n\n/** Anchor exit codes */\nexport const ExitCode = {\n PASS: 0,\n DRIFT: 1,\n DECEPTIVE: 2,\n VIOLATION: 3,\n REVERT: 4,\n CORRUPT: 5,\n SCHEMA: 6,\n} as const;\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode];\n\n// =============================================================================\n// Lens Context Types (Sprint 4)\n// =============================================================================\n\n/**\n * Lens context for User Lens impersonation validation\n * Used to verify data source consistency when viewing as another address\n */\nexport interface LensContext {\n /** Address being impersonated */\n impersonatedAddress: string;\n /** Real user address (for signing) */\n realAddress?: string;\n /** Component being validated */\n component: string;\n /** Value observed in the UI */\n observedValue?: string;\n /** Value from on-chain read */\n onChainValue?: string;\n /** Value from indexer (Envio, Subgraph) */\n indexedValue?: string;\n /** Data source used by component */\n dataSource?: 'on-chain' | 'indexed' | 'mixed' | 'unknown';\n}\n\n/** Lens context schema for validation */\nexport const LensContextSchema = z.object({\n impersonatedAddress: z.string(),\n realAddress: z.string().optional(),\n component: z.string(),\n observedValue: z.string().optional(),\n onChainValue: z.string().optional(),\n indexedValue: z.string().optional(),\n dataSource: z.enum(['on-chain', 'indexed', 'mixed', 'unknown']).optional(),\n});\n\n/**\n * Lens validation issue types\n */\nexport type LensIssueType =\n | 'data_source_mismatch' // observed != on_chain\n | 'stale_indexed_data' // indexed != on_chain\n | 'lens_financial_check' // Financial zone using indexed source\n | 'impersonation_leak'; // Real address used where impersonated expected\n\n/**\n * Lens validation issue severity\n */\nexport type LensIssueSeverity = 'error' | 'warning' | 'info';\n\n/**\n * Individual lens validation issue\n */\nexport interface LensValidationIssue {\n /** Issue type */\n type: LensIssueType;\n /** Severity (varies by zone) */\n severity: LensIssueSeverity;\n /** Human-readable message */\n message: string;\n /** Component where issue was found */\n component: string;\n /** Zone context */\n zone?: Zone;\n /** Expected value */\n expected?: string;\n /** Actual value */\n actual?: string;\n /** Suggested fix */\n suggestion?: string;\n}\n\n/** Lens validation issue schema */\nexport const LensValidationIssueSchema = z.object({\n type: z.enum(['data_source_mismatch', 'stale_indexed_data', 'lens_financial_check', 'impersonation_leak']),\n severity: z.enum(['error', 'warning', 'info']),\n message: z.string(),\n component: z.string(),\n zone: z.enum(['critical', 'elevated', 'standard', 'local']).optional(),\n expected: z.string().optional(),\n actual: z.string().optional(),\n suggestion: z.string().optional(),\n});\n\n/**\n * Lens validation result\n */\nexport interface LensValidationResult {\n /** Whether validation passed */\n valid: boolean;\n /** List of issues found */\n issues: LensValidationIssue[];\n /** Summary message */\n summary: string;\n}\n\n/** Extended exit codes for lens validation */\nexport const LensExitCode = {\n ...ExitCode,\n LENS_WARNING: 11,\n LENS_ERROR: 10,\n} as const;\n\nexport type LensExitCodeValue = (typeof LensExitCode)[keyof typeof LensExitCode];\n","/**\n * SnapshotManager - Anvil snapshot lifecycle management\n *\n * Manages creating, reverting, and tracking EVM snapshots.\n * Persists snapshot metadata to grimoires/anchor/sessions/{sessionId}/snapshots/\n */\n\nimport { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { rpcCall } from '../utils/rpc.js';\nimport type { SnapshotMetadata, SnapshotConfig } from '../types.js';\n\n/** Snapshot manager configuration */\nexport interface SnapshotManagerConfig {\n /** Base path for session data */\n basePath?: string;\n}\n\n/** Default base path for session data */\nconst DEFAULT_BASE_PATH = 'grimoires/anchor/sessions';\n\n/**\n * SnapshotManager class for managing Anvil snapshots\n */\nexport class SnapshotManager {\n private snapshots: Map<string, SnapshotMetadata> = new Map();\n private taskToSnapshot: Map<string, string> = new Map();\n private basePath: string;\n private sessionId: string | null = null;\n\n constructor(config?: SnapshotManagerConfig) {\n this.basePath = config?.basePath ?? DEFAULT_BASE_PATH;\n }\n\n /**\n * Initialize the manager for a session\n *\n * @param sessionId - Session ID to manage snapshots for\n */\n async init(sessionId: string): Promise<void> {\n this.sessionId = sessionId;\n await this.loadSnapshots();\n }\n\n /**\n * Create a new snapshot\n *\n * @param config - Snapshot configuration\n * @param rpcUrl - RPC URL of the fork\n * @returns Promise resolving to snapshot metadata\n */\n async create(config: SnapshotConfig, rpcUrl: string): Promise<SnapshotMetadata> {\n // Call evm_snapshot\n const snapshotId = await rpcCall<string>(rpcUrl, 'evm_snapshot');\n\n // Get current block number\n const blockNumberHex = await rpcCall<string>(rpcUrl, 'eth_blockNumber');\n const blockNumber = parseInt(blockNumberHex, 16);\n\n const metadata: SnapshotMetadata = {\n id: snapshotId,\n forkId: config.forkId,\n sessionId: config.sessionId,\n blockNumber,\n createdAt: new Date(),\n ...(config.taskId !== undefined && { taskId: config.taskId }),\n ...(config.description !== undefined && { description: config.description }),\n };\n\n // Store in memory\n this.snapshots.set(snapshotId, metadata);\n if (config.taskId) {\n this.taskToSnapshot.set(config.taskId, snapshotId);\n }\n\n // Persist to disk\n await this.saveSnapshot(metadata);\n\n return metadata;\n }\n\n /**\n * Revert to a snapshot\n *\n * @param rpcUrl - RPC URL of the fork\n * @param snapshotId - Snapshot ID to revert to\n * @returns Promise resolving to true if successful\n */\n async revert(rpcUrl: string, snapshotId: string): Promise<boolean> {\n const result = await rpcCall<boolean>(rpcUrl, 'evm_revert', [snapshotId]);\n return result;\n }\n\n /**\n * Get snapshot metadata by ID\n *\n * @param snapshotId - Snapshot ID\n * @returns Snapshot metadata if found\n */\n get(snapshotId: string): SnapshotMetadata | undefined {\n return this.snapshots.get(snapshotId);\n }\n\n /**\n * List all snapshots sorted by creation time\n *\n * @returns Array of snapshot metadata\n */\n list(): SnapshotMetadata[] {\n return Array.from(this.snapshots.values()).sort(\n (a, b) => a.createdAt.getTime() - b.createdAt.getTime()\n );\n }\n\n /**\n * Get snapshot for a specific task\n *\n * @param taskId - Task ID\n * @returns Snapshot metadata if found\n */\n getForTask(taskId: string): SnapshotMetadata | undefined {\n const snapshotId = this.taskToSnapshot.get(taskId);\n if (!snapshotId) return undefined;\n return this.snapshots.get(snapshotId);\n }\n\n /**\n * Get the count of snapshots\n *\n * @returns Number of snapshots\n */\n count(): number {\n return this.snapshots.size;\n }\n\n /**\n * Cleanup old snapshots, keeping the most recent\n *\n * @param keepLast - Number of recent snapshots to keep\n */\n async cleanup(keepLast: number): Promise<void> {\n const sorted = this.list();\n const toDelete = sorted.slice(0, -keepLast);\n\n for (const snapshot of toDelete) {\n await this.deleteSnapshot(snapshot.id);\n }\n }\n\n /**\n * Get snapshot directory path for current session\n */\n private getSnapshotDir(): string {\n if (!this.sessionId) {\n throw new Error('SnapshotManager not initialized with session ID');\n }\n return join(this.basePath, this.sessionId, 'snapshots');\n }\n\n /**\n * Get file path for a snapshot\n */\n private getSnapshotPath(snapshotId: string): string {\n return join(this.getSnapshotDir(), `${snapshotId}.json`);\n }\n\n /**\n * Load existing snapshots from disk\n */\n private async loadSnapshots(): Promise<void> {\n const dir = this.getSnapshotDir();\n\n if (!existsSync(dir)) {\n return;\n }\n\n try {\n const files = await readdir(dir);\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n try {\n const content = await readFile(join(dir, file), 'utf-8');\n const data = JSON.parse(content) as SnapshotMetadata;\n data.createdAt = new Date(data.createdAt);\n\n this.snapshots.set(data.id, data);\n if (data.taskId) {\n this.taskToSnapshot.set(data.taskId, data.id);\n }\n } catch {\n // Skip corrupt files\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n\n /**\n * Save snapshot metadata to disk\n */\n private async saveSnapshot(metadata: SnapshotMetadata): Promise<void> {\n const dir = this.getSnapshotDir();\n\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(\n this.getSnapshotPath(metadata.id),\n JSON.stringify(metadata, null, 2)\n );\n }\n\n /**\n * Delete a snapshot from memory and disk\n */\n private async deleteSnapshot(snapshotId: string): Promise<void> {\n const metadata = this.snapshots.get(snapshotId);\n\n this.snapshots.delete(snapshotId);\n if (metadata?.taskId) {\n this.taskToSnapshot.delete(metadata.taskId);\n }\n\n try {\n await unlink(this.getSnapshotPath(snapshotId));\n } catch {\n // File might not exist\n }\n }\n}\n\n/** Singleton instance for convenience */\nlet defaultManager: SnapshotManager | null = null;\n\n/**\n * Get the default SnapshotManager instance\n */\nexport function getSnapshotManager(): SnapshotManager {\n if (!defaultManager) {\n defaultManager = new SnapshotManager();\n }\n return defaultManager;\n}\n\n/**\n * Reset the default SnapshotManager (for testing)\n */\nexport function resetSnapshotManager(): void {\n defaultManager = null;\n}\n","/**\n * CheckpointManager - Hard restart strategy for Anvil memory management\n *\n * Creates periodic checkpoints via anvil_dumpState to prevent memory bloat.\n * Restores checkpoints via anvil_loadState for crash recovery.\n */\n\nimport { readFile, writeFile, mkdir, readdir, rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { rpcCall } from '../utils/rpc.js';\nimport { ForkManager } from './fork-manager.js';\nimport type { CheckpointMetadata, Fork, NetworkConfig } from '../types.js';\n\n/** Checkpoint manager configuration */\nexport interface CheckpointManagerConfig {\n /** Base path for checkpoint data */\n basePath?: string;\n /** Snapshot interval before creating checkpoint */\n snapshotInterval?: number;\n /** Maximum checkpoints to retain */\n maxCheckpoints?: number;\n}\n\n/** Default configuration values */\nconst DEFAULT_BASE_PATH = 'grimoires/anchor/checkpoints';\nconst DEFAULT_SNAPSHOT_INTERVAL = 10;\nconst DEFAULT_MAX_CHECKPOINTS = 5;\n\n/**\n * CheckpointManager class for hard restart strategy\n */\nexport class CheckpointManager {\n private checkpoints: Map<string, CheckpointMetadata> = new Map();\n private snapshotCount: number = 0;\n private firstSnapshotId: string | null = null;\n private lastSnapshotId: string | null = null;\n private basePath: string;\n private snapshotInterval: number;\n private maxCheckpoints: number;\n private sessionId: string | null = null;\n private forkId: string | null = null;\n\n constructor(config?: CheckpointManagerConfig) {\n this.basePath = config?.basePath ?? DEFAULT_BASE_PATH;\n this.snapshotInterval = config?.snapshotInterval ?? DEFAULT_SNAPSHOT_INTERVAL;\n this.maxCheckpoints = config?.maxCheckpoints ?? DEFAULT_MAX_CHECKPOINTS;\n }\n\n /**\n * Initialize the manager for a session\n *\n * @param sessionId - Session ID\n * @param forkId - Fork ID\n */\n async init(sessionId: string, forkId: string): Promise<void> {\n this.sessionId = sessionId;\n this.forkId = forkId;\n await this.loadCheckpoints();\n }\n\n /**\n * Called when a snapshot is created. May trigger checkpoint.\n *\n * @param snapshotId - ID of the created snapshot\n * @param rpcUrl - RPC URL of the fork\n * @returns True if checkpoint was created\n */\n async onSnapshot(snapshotId: string, rpcUrl: string): Promise<boolean> {\n this.snapshotCount++;\n\n if (!this.firstSnapshotId) {\n this.firstSnapshotId = snapshotId;\n }\n this.lastSnapshotId = snapshotId;\n\n // Check if we should create a checkpoint\n if (this.snapshotCount >= this.snapshotInterval) {\n await this.create(rpcUrl);\n return true;\n }\n\n return false;\n }\n\n /**\n * Create a checkpoint by exporting state\n *\n * @param rpcUrl - RPC URL of the fork\n * @returns Checkpoint metadata\n */\n async create(rpcUrl: string): Promise<CheckpointMetadata> {\n if (!this.sessionId || !this.forkId) {\n throw new Error('CheckpointManager not initialized');\n }\n\n // Export state via anvil_dumpState\n const state = await rpcCall<string>(rpcUrl, 'anvil_dumpState');\n\n // Get current block number\n const blockNumberHex = await rpcCall<string>(rpcUrl, 'eth_blockNumber');\n const blockNumber = parseInt(blockNumberHex, 16);\n\n // Generate checkpoint ID\n const checkpointId = this.generateCheckpointId();\n\n const metadata: CheckpointMetadata = {\n id: checkpointId,\n sessionId: this.sessionId,\n forkId: this.forkId,\n snapshotRange: {\n first: this.firstSnapshotId ?? '',\n last: this.lastSnapshotId ?? '',\n },\n blockNumber,\n createdAt: new Date(),\n snapshotCount: this.snapshotCount,\n };\n\n // Save to disk\n await this.saveCheckpoint(checkpointId, state, metadata);\n\n // Store in memory\n this.checkpoints.set(checkpointId, metadata);\n\n // Reset snapshot counter\n this.snapshotCount = 0;\n this.firstSnapshotId = null;\n this.lastSnapshotId = null;\n\n // Cleanup old checkpoints\n await this.cleanup();\n\n return metadata;\n }\n\n /**\n * Restore from a checkpoint\n *\n * @param checkpointId - Checkpoint ID to restore\n * @param forkManager - ForkManager instance\n * @param network - Network configuration\n * @returns New fork with restored state\n */\n async restore(\n checkpointId: string,\n forkManager: ForkManager,\n network: NetworkConfig\n ): Promise<Fork> {\n if (!this.sessionId) {\n throw new Error('CheckpointManager not initialized');\n }\n\n const checkpoint = this.checkpoints.get(checkpointId);\n if (!checkpoint) {\n throw new Error(`Checkpoint ${checkpointId} not found`);\n }\n\n // Load state from disk\n const statePath = this.getStatePath(checkpointId);\n const state = await readFile(statePath, 'utf-8');\n\n // Kill existing forks\n await forkManager.killAll();\n\n // Spawn new fork\n const fork = await forkManager.fork({\n network,\n blockNumber: checkpoint.blockNumber,\n sessionId: this.sessionId,\n });\n\n // Load state via anvil_loadState\n await rpcCall<boolean>(fork.rpcUrl, 'anvil_loadState', [state]);\n\n // Update fork ID\n this.forkId = fork.id;\n\n return fork;\n }\n\n /**\n * Find the checkpoint containing a specific snapshot\n *\n * @param snapshotId - Snapshot ID to find\n * @returns Checkpoint metadata if found\n */\n findCheckpointForSnapshot(snapshotId: string): CheckpointMetadata | undefined {\n // Sort checkpoints by creation time (newest first)\n const sorted = this.list().sort(\n (a, b) => b.createdAt.getTime() - a.createdAt.getTime()\n );\n\n // Find the checkpoint whose range contains this snapshot\n // Note: This is a simplified check - in production, you'd need proper range tracking\n for (const checkpoint of sorted) {\n if (\n checkpoint.snapshotRange.first <= snapshotId &&\n checkpoint.snapshotRange.last >= snapshotId\n ) {\n return checkpoint;\n }\n }\n\n // Fall back to latest checkpoint\n return sorted[0];\n }\n\n /**\n * Get checkpoint by ID\n *\n * @param checkpointId - Checkpoint ID\n * @returns Checkpoint metadata if found\n */\n get(checkpointId: string): CheckpointMetadata | undefined {\n return this.checkpoints.get(checkpointId);\n }\n\n /**\n * List all checkpoints sorted by time\n *\n * @returns Array of checkpoint metadata\n */\n list(): CheckpointMetadata[] {\n return Array.from(this.checkpoints.values()).sort(\n (a, b) => a.createdAt.getTime() - b.createdAt.getTime()\n );\n }\n\n /**\n * Get the latest checkpoint\n *\n * @returns Latest checkpoint metadata\n */\n latest(): CheckpointMetadata | undefined {\n const sorted = this.list();\n return sorted[sorted.length - 1];\n }\n\n /**\n * Cleanup old checkpoints, keeping only the most recent\n */\n async cleanup(): Promise<void> {\n const sorted = this.list();\n\n if (sorted.length <= this.maxCheckpoints) {\n return;\n }\n\n const toDelete = sorted.slice(0, sorted.length - this.maxCheckpoints);\n\n for (const checkpoint of toDelete) {\n await this.deleteCheckpoint(checkpoint.id);\n }\n }\n\n /**\n * Get session directory path\n */\n private getSessionDir(): string {\n if (!this.sessionId) {\n throw new Error('Session ID not set');\n }\n return join(this.basePath, this.sessionId);\n }\n\n /**\n * Get checkpoint directory path\n */\n private getCheckpointDir(checkpointId: string): string {\n return join(this.getSessionDir(), checkpointId);\n }\n\n /**\n * Get state file path\n */\n private getStatePath(checkpointId: string): string {\n return join(this.getCheckpointDir(checkpointId), 'state.json');\n }\n\n /**\n * Get metadata file path\n */\n private getMetaPath(checkpointId: string): string {\n return join(this.getCheckpointDir(checkpointId), 'meta.json');\n }\n\n /**\n * Load checkpoints from disk\n */\n private async loadCheckpoints(): Promise<void> {\n const dir = this.getSessionDir();\n\n if (!existsSync(dir)) {\n return;\n }\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const metaPath = this.getMetaPath(entry.name);\n if (!existsSync(metaPath)) continue;\n\n try {\n const content = await readFile(metaPath, 'utf-8');\n const data = JSON.parse(content) as CheckpointMetadata;\n data.createdAt = new Date(data.createdAt);\n this.checkpoints.set(data.id, data);\n } catch {\n // Skip corrupt metadata\n }\n }\n } catch {\n // Directory can't be read\n }\n }\n\n /**\n * Save checkpoint to disk\n */\n private async saveCheckpoint(\n checkpointId: string,\n state: string,\n metadata: CheckpointMetadata\n ): Promise<void> {\n const dir = this.getCheckpointDir(checkpointId);\n\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n // Save state\n await writeFile(this.getStatePath(checkpointId), state);\n\n // Save metadata\n await writeFile(this.getMetaPath(checkpointId), JSON.stringify(metadata, null, 2));\n }\n\n /**\n * Delete a checkpoint from disk\n */\n private async deleteCheckpoint(checkpointId: string): Promise<void> {\n this.checkpoints.delete(checkpointId);\n\n const dir = this.getCheckpointDir(checkpointId);\n if (existsSync(dir)) {\n await rm(dir, { recursive: true });\n }\n }\n\n /**\n * Generate a unique checkpoint ID\n */\n private generateCheckpointId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n return `cp-${timestamp}-${random}`;\n }\n}\n\n/** Singleton instance */\nlet defaultManager: CheckpointManager | null = null;\n\n/**\n * Get the default CheckpointManager instance\n */\nexport function getCheckpointManager(): CheckpointManager {\n if (!defaultManager) {\n defaultManager = new CheckpointManager();\n }\n return defaultManager;\n}\n\n/**\n * Reset the default CheckpointManager (for testing)\n */\nexport function resetCheckpointManager(): void {\n defaultManager = null;\n}\n","/**\n * SessionManager - Session lifecycle management\n *\n * Manages session creation, persistence, and recovery.\n * Coordinates ForkManager, SnapshotManager, CheckpointManager, and TaskGraph.\n */\n\nimport { readFile, writeFile, mkdir, readdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { ForkManager } from './fork-manager.js';\nimport { SnapshotManager } from './snapshot-manager.js';\nimport { CheckpointManager } from './checkpoint-manager.js';\nimport { TaskGraph } from '../graph/task-graph.js';\nimport type { Fork, NetworkConfig, Task } from '../types.js';\n\n/** Session metadata */\nexport interface SessionMetadata {\n /** Session ID */\n id: string;\n /** Network configuration */\n network: NetworkConfig;\n /** Current fork ID */\n forkId: string;\n /** Creation timestamp */\n createdAt: Date;\n /** Last activity timestamp */\n lastActivity: Date;\n /** Session status */\n status: 'active' | 'suspended' | 'complete' | 'failed';\n /** Initial block number */\n initialBlock: number;\n}\n\n/** Session manager configuration */\nexport interface SessionManagerConfig {\n /** Base path for session data */\n basePath?: string;\n}\n\n/** Session state with all managers */\nexport interface Session {\n metadata: SessionMetadata;\n fork: Fork;\n forkManager: ForkManager;\n snapshotManager: SnapshotManager;\n checkpointManager: CheckpointManager;\n taskGraph: TaskGraph;\n}\n\n/** Default base path */\nconst DEFAULT_BASE_PATH = 'grimoires/anchor/sessions';\n\n/**\n * SessionManager class for session lifecycle\n */\nexport class SessionManager {\n private sessions: Map<string, SessionMetadata> = new Map();\n private currentSession: Session | null = null;\n private basePath: string;\n\n constructor(config?: SessionManagerConfig) {\n this.basePath = config?.basePath ?? DEFAULT_BASE_PATH;\n }\n\n /**\n * Initialize the manager by loading session index\n */\n async init(): Promise<void> {\n await this.loadSessionIndex();\n }\n\n /**\n * Create a new session\n *\n * @param network - Network to fork\n * @param options - Session options\n * @returns Created session\n */\n async create(\n network: NetworkConfig,\n options?: { blockNumber?: number }\n ): Promise<Session> {\n const sessionId = this.generateSessionId();\n\n // Create fork manager and spawn fork\n const forkManager = new ForkManager();\n await forkManager.init();\n\n const fork = await forkManager.fork({\n network,\n sessionId,\n ...(options?.blockNumber !== undefined && { blockNumber: options.blockNumber }),\n });\n\n // Create snapshot manager\n const snapshotManager = new SnapshotManager();\n await snapshotManager.init(sessionId);\n\n // Create checkpoint manager\n const checkpointManager = new CheckpointManager();\n await checkpointManager.init(sessionId, fork.id);\n\n // Create task graph\n const taskGraph = new TaskGraph({\n sessionId,\n basePath: this.basePath,\n autoSave: true,\n });\n await taskGraph.init();\n\n // Create initial snapshot\n const initialSnapshot = await snapshotManager.create(\n {\n forkId: fork.id,\n sessionId,\n description: 'Initial session snapshot',\n },\n fork.rpcUrl\n );\n\n // Create fork task in graph\n const forkTask: Task = {\n id: `fork-${fork.id}`,\n type: 'fork',\n status: 'complete',\n snapshotId: initialSnapshot.id,\n dependencies: [],\n input: { network, blockNumber: fork.blockNumber },\n output: { forkId: fork.id, rpcUrl: fork.rpcUrl },\n createdAt: new Date(),\n completedAt: new Date(),\n };\n await taskGraph.addTask(forkTask);\n\n // Create session metadata\n const metadata: SessionMetadata = {\n id: sessionId,\n network,\n forkId: fork.id,\n createdAt: new Date(),\n lastActivity: new Date(),\n status: 'active',\n initialBlock: fork.blockNumber,\n };\n\n // Save session\n this.sessions.set(sessionId, metadata);\n await this.saveSession(metadata);\n await this.saveSessionIndex();\n\n // Set as current session\n this.currentSession = {\n metadata,\n fork,\n forkManager,\n snapshotManager,\n checkpointManager,\n taskGraph,\n };\n\n return this.currentSession;\n }\n\n /**\n * Resume an existing session\n *\n * @param sessionId - Session ID to resume\n * @returns Resumed session\n */\n async resume(sessionId: string): Promise<Session> {\n const metadata = this.sessions.get(sessionId);\n if (!metadata) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n // Initialize fork manager\n const forkManager = new ForkManager();\n await forkManager.init();\n\n // Initialize snapshot manager\n const snapshotManager = new SnapshotManager();\n await snapshotManager.init(sessionId);\n\n // Initialize checkpoint manager\n const checkpointManager = new CheckpointManager();\n\n // Initialize task graph\n const taskGraph = new TaskGraph({\n sessionId,\n basePath: this.basePath,\n autoSave: true,\n });\n await taskGraph.init();\n\n // Check for recovery needs\n let fork = forkManager.get(metadata.forkId);\n\n if (!fork || taskGraph.hasBlocked()) {\n // Need recovery\n fork = await this.recover(\n sessionId,\n metadata,\n forkManager,\n snapshotManager,\n checkpointManager,\n taskGraph\n );\n }\n\n if (!fork) {\n throw new Error(`Failed to restore fork for session ${sessionId}`);\n }\n\n // Update checkpoint manager with fork\n await checkpointManager.init(sessionId, fork.id);\n\n // Update metadata\n metadata.lastActivity = new Date();\n metadata.forkId = fork.id;\n metadata.status = 'active';\n await this.saveSession(metadata);\n\n // Set as current session\n this.currentSession = {\n metadata,\n fork,\n forkManager,\n snapshotManager,\n checkpointManager,\n taskGraph,\n };\n\n return this.currentSession;\n }\n\n /**\n * Recover a session from checkpoint or snapshot\n */\n private async recover(\n sessionId: string,\n metadata: SessionMetadata,\n forkManager: ForkManager,\n snapshotManager: SnapshotManager,\n checkpointManager: CheckpointManager,\n taskGraph: TaskGraph\n ): Promise<Fork> {\n // First, try to find a checkpoint\n const latestCheckpoint = checkpointManager.latest();\n\n if (latestCheckpoint) {\n // Restore from checkpoint\n console.log(`Recovering session ${sessionId} from checkpoint ${latestCheckpoint.id}`);\n return await checkpointManager.restore(\n latestCheckpoint.id,\n forkManager,\n metadata.network\n );\n }\n\n // No checkpoint - find recovery point in task graph\n const blockedTasks = taskGraph.getTasksByStatus('blocked');\n const failedTasks = taskGraph.getTasksByStatus('failed');\n const problematicTask = blockedTasks[0] ?? failedTasks[0];\n\n if (problematicTask) {\n const recoveryPoint = taskGraph.findRecoveryPoint(problematicTask.id);\n\n if (recoveryPoint?.snapshotId) {\n // Spawn new fork and revert to snapshot\n const fork = await forkManager.fork({\n network: metadata.network,\n blockNumber: metadata.initialBlock,\n sessionId,\n });\n\n const success = await snapshotManager.revert(fork.rpcUrl, recoveryPoint.snapshotId);\n if (!success) {\n throw new Error(`Failed to revert to snapshot ${recoveryPoint.snapshotId}`);\n }\n\n // Mark problematic tasks as pending for retry\n for (const task of [...blockedTasks, ...failedTasks]) {\n await taskGraph.updateStatus(task.id, 'pending');\n }\n\n return fork;\n }\n }\n\n // No recovery point found - create fresh fork\n console.log(`No recovery point found, creating fresh fork for session ${sessionId}`);\n return await forkManager.fork({\n network: metadata.network,\n blockNumber: metadata.initialBlock,\n sessionId,\n });\n }\n\n /**\n * Get current session\n *\n * @returns Current session or null\n */\n current(): Session | null {\n return this.currentSession;\n }\n\n /**\n * List all sessions\n *\n * @param filter - Optional filter for status\n * @returns Array of session metadata\n */\n list(filter?: { status?: SessionMetadata['status']; blocked?: boolean }): SessionMetadata[] {\n let sessions = Array.from(this.sessions.values());\n\n if (filter?.status) {\n sessions = sessions.filter((s) => s.status === filter.status);\n }\n\n return sessions.sort((a, b) => b.lastActivity.getTime() - a.lastActivity.getTime());\n }\n\n /**\n * Get session by ID\n *\n * @param sessionId - Session ID\n * @returns Session metadata if found\n */\n get(sessionId: string): SessionMetadata | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Update session status\n *\n * @param sessionId - Session ID\n * @param status - New status\n */\n async updateStatus(sessionId: string, status: SessionMetadata['status']): Promise<void> {\n const metadata = this.sessions.get(sessionId);\n if (!metadata) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n metadata.status = status;\n metadata.lastActivity = new Date();\n await this.saveSession(metadata);\n }\n\n /**\n * Get session directory path\n */\n private getSessionDir(sessionId: string): string {\n return join(this.basePath, sessionId);\n }\n\n /**\n * Get session metadata path\n */\n private getSessionPath(sessionId: string): string {\n return join(this.getSessionDir(sessionId), 'session.json');\n }\n\n /**\n * Load session index\n */\n private async loadSessionIndex(): Promise<void> {\n if (!existsSync(this.basePath)) {\n return;\n }\n\n try {\n const entries = await readdir(this.basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const sessionPath = this.getSessionPath(entry.name);\n if (!existsSync(sessionPath)) continue;\n\n try {\n const content = await readFile(sessionPath, 'utf-8');\n const data = JSON.parse(content) as SessionMetadata;\n data.createdAt = new Date(data.createdAt);\n data.lastActivity = new Date(data.lastActivity);\n this.sessions.set(data.id, data);\n } catch {\n // Skip corrupt session\n }\n }\n } catch {\n // Can't read sessions directory\n }\n }\n\n /**\n * Save session index\n */\n private async saveSessionIndex(): Promise<void> {\n if (!existsSync(this.basePath)) {\n await mkdir(this.basePath, { recursive: true });\n }\n\n const index = Array.from(this.sessions.values()).map((s) => ({\n id: s.id,\n status: s.status,\n lastActivity: s.lastActivity,\n }));\n\n await writeFile(\n join(this.basePath, 'index.json'),\n JSON.stringify(index, null, 2)\n );\n }\n\n /**\n * Save session metadata\n */\n private async saveSession(metadata: SessionMetadata): Promise<void> {\n const dir = this.getSessionDir(metadata.id);\n\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(this.getSessionPath(metadata.id), JSON.stringify(metadata, null, 2));\n }\n\n /**\n * Generate unique session ID\n */\n private generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n return `session-${timestamp}-${random}`;\n }\n}\n\n/** Singleton instance */\nlet defaultManager: SessionManager | null = null;\n\n/**\n * Get the default SessionManager instance\n */\nexport function getSessionManager(): SessionManager {\n if (!defaultManager) {\n defaultManager = new SessionManager();\n }\n return defaultManager;\n}\n\n/**\n * Reset the default SessionManager (for testing)\n */\nexport function resetSessionManager(): void {\n defaultManager = null;\n}\n","/**\n * TaskGraph - State-pinned DAG for task management\n *\n * Manages task dependencies, status tracking, and snapshot binding.\n * Persists graph state to grimoires/anchor/sessions/{sessionId}/graph.json\n */\n\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { z } from 'zod';\nimport type { Task, TaskType, TaskStatus, TaskGraphData } from '../types.js';\n\n/** Zod schema for task validation */\nconst TaskSchema = z.object({\n id: z.string(),\n type: z.enum(['fork', 'ground', 'warden', 'generate', 'validate', 'write']),\n status: z.enum(['pending', 'running', 'complete', 'blocked', 'failed']),\n snapshotId: z.string().optional(),\n checkpointId: z.string().optional(),\n dependencies: z.array(z.string()),\n input: z.unknown(),\n output: z.unknown().optional(),\n error: z.string().optional(),\n createdAt: z.string().transform((s: string) => new Date(s)),\n completedAt: z\n .string()\n .transform((s: string) => new Date(s))\n .optional(),\n});\n\nconst TaskGraphDataSchema = z.object({\n sessionId: z.string(),\n tasks: z.array(TaskSchema),\n headTaskId: z.string().optional(),\n lastUpdated: z.string().transform((s: string) => new Date(s)),\n});\n\n/** Task graph configuration */\nexport interface TaskGraphConfig {\n /** Session ID */\n sessionId: string;\n /** Base path for session data */\n basePath?: string;\n /** Auto-save on changes */\n autoSave?: boolean;\n}\n\n/** Default base path */\nconst DEFAULT_BASE_PATH = 'grimoires/anchor/sessions';\n\n/** Task ID counter for generating unique IDs */\nlet taskCounter = 0;\n\n/**\n * Generate a unique task ID\n */\nexport function generateTaskId(type: TaskType): string {\n return `${type}-${Date.now().toString(36)}-${(++taskCounter).toString(36)}`;\n}\n\n/**\n * Reset the task counter (for testing)\n */\nexport function resetTaskCounter(): void {\n taskCounter = 0;\n}\n\n/**\n * TaskGraph class for managing state-pinned task DAG\n */\nexport class TaskGraph {\n private tasks: Map<string, Task> = new Map();\n private dependents: Map<string, Set<string>> = new Map();\n private sessionId: string;\n private basePath: string;\n private autoSave: boolean;\n private headTaskId: string | undefined;\n\n constructor(config: TaskGraphConfig) {\n this.sessionId = config.sessionId;\n this.basePath = config.basePath ?? DEFAULT_BASE_PATH;\n this.autoSave = config.autoSave ?? true;\n }\n\n /**\n * Initialize the graph by loading persisted state\n */\n async init(): Promise<void> {\n await this.load();\n }\n\n /**\n * Add a task to the graph\n *\n * @param task - Task to add\n */\n async addTask(task: Task): Promise<void> {\n // Validate no circular dependencies\n this.validateNoCycle(task);\n\n this.tasks.set(task.id, task);\n\n // Track reverse dependencies\n for (const depId of task.dependencies) {\n if (!this.dependents.has(depId)) {\n this.dependents.set(depId, new Set());\n }\n this.dependents.get(depId)!.add(task.id);\n }\n\n this.headTaskId = task.id;\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Update task status\n *\n * @param taskId - Task ID\n * @param status - New status\n */\n async updateStatus(taskId: string, status: TaskStatus): Promise<void> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n task.status = status;\n if (status === 'complete' || status === 'failed') {\n task.completedAt = new Date();\n }\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Set the snapshot binding for a task\n *\n * @param taskId - Task ID\n * @param snapshotId - Snapshot ID\n */\n async setSnapshot(taskId: string, snapshotId: string): Promise<void> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n task.snapshotId = snapshotId;\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Set the checkpoint binding for a task\n *\n * @param taskId - Task ID\n * @param checkpointId - Checkpoint ID\n */\n async setCheckpoint(taskId: string, checkpointId: string): Promise<void> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n task.checkpointId = checkpointId;\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Set task output\n *\n * @param taskId - Task ID\n * @param output - Task output\n */\n async setOutput(taskId: string, output: unknown): Promise<void> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n task.output = output;\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Set task error\n *\n * @param taskId - Task ID\n * @param error - Error message\n */\n async setError(taskId: string, error: string): Promise<void> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task ${taskId} not found`);\n }\n\n task.error = error;\n task.status = 'failed';\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Get a task by ID\n *\n * @param taskId - Task ID\n * @returns Task if found\n */\n getTask(taskId: string): Task | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Get all tasks\n *\n * @returns Array of all tasks\n */\n getAllTasks(): Task[] {\n return Array.from(this.tasks.values());\n }\n\n /**\n * Get tasks by status\n *\n * @param status - Status to filter by\n * @returns Array of matching tasks\n */\n getTasksByStatus(status: TaskStatus): Task[] {\n return Array.from(this.tasks.values()).filter((t) => t.status === status);\n }\n\n /**\n * Check if a task can run (all dependencies complete)\n *\n * @param taskId - Task ID\n * @returns True if all dependencies are complete\n */\n canRun(taskId: string): boolean {\n const task = this.tasks.get(taskId);\n if (!task) return false;\n if (task.status !== 'pending') return false;\n\n for (const depId of task.dependencies) {\n const dep = this.tasks.get(depId);\n if (!dep || dep.status !== 'complete') {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get the next runnable task (pending with all deps complete)\n *\n * @returns Next runnable task or undefined\n */\n getNextRunnable(): Task | undefined {\n for (const task of this.tasks.values()) {\n if (this.canRun(task.id)) {\n return task;\n }\n }\n return undefined;\n }\n\n /**\n * Propagate blocked status to all dependents of a failed task\n *\n * @param taskId - ID of the failed task\n */\n async propagateBlocked(taskId: string): Promise<void> {\n const dependentIds = this.dependents.get(taskId);\n if (!dependentIds) return;\n\n for (const depId of dependentIds) {\n const task = this.tasks.get(depId);\n if (task && task.status === 'pending') {\n task.status = 'blocked';\n await this.propagateBlocked(depId);\n }\n }\n\n if (this.autoSave) {\n await this.save();\n }\n }\n\n /**\n * Find the recovery point for a failed task\n *\n * @param taskId - ID of the task needing recovery\n * @returns Last complete task with snapshot, or undefined\n */\n findRecoveryPoint(taskId: string): Task | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n // Walk back through dependencies to find last complete with snapshot\n const visited = new Set<string>();\n const queue = [...task.dependencies];\n\n let bestRecovery: Task | undefined;\n\n while (queue.length > 0) {\n const id = queue.pop()!;\n if (visited.has(id)) continue;\n visited.add(id);\n\n const dep = this.tasks.get(id);\n if (!dep) continue;\n\n if (dep.status === 'complete' && dep.snapshotId) {\n if (!bestRecovery || dep.createdAt > bestRecovery.createdAt) {\n bestRecovery = dep;\n }\n }\n\n queue.push(...dep.dependencies);\n }\n\n return bestRecovery;\n }\n\n /**\n * Check if there are any blocked tasks\n *\n * @returns True if any tasks are blocked\n */\n hasBlocked(): boolean {\n for (const task of this.tasks.values()) {\n if (task.status === 'blocked') {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if all tasks are complete\n *\n * @returns True if all tasks are complete\n */\n isComplete(): boolean {\n for (const task of this.tasks.values()) {\n if (task.status !== 'complete') {\n return false;\n }\n }\n return this.tasks.size > 0;\n }\n\n /**\n * Get the graph file path\n */\n private getGraphPath(): string {\n return join(this.basePath, this.sessionId, 'graph.json');\n }\n\n /**\n * Export graph data as JSON-serializable object\n *\n * @returns Task graph data\n */\n toJSON(): TaskGraphData {\n return {\n sessionId: this.sessionId,\n tasks: Array.from(this.tasks.values()),\n lastUpdated: new Date(),\n ...(this.headTaskId !== undefined && { headTaskId: this.headTaskId }),\n };\n }\n\n /**\n * Save the graph to disk\n */\n async save(): Promise<void> {\n const data = this.toJSON();\n\n const path = this.getGraphPath();\n const dir = dirname(path);\n\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(path, JSON.stringify(data, null, 2));\n }\n\n /**\n * Load the graph from disk\n */\n async load(): Promise<void> {\n const path = this.getGraphPath();\n\n if (!existsSync(path)) {\n return;\n }\n\n try {\n const content = await readFile(path, 'utf-8');\n const raw = JSON.parse(content);\n const data = TaskGraphDataSchema.parse(raw);\n\n this.tasks.clear();\n this.dependents.clear();\n\n for (const task of data.tasks) {\n this.tasks.set(task.id, task as Task);\n\n for (const depId of task.dependencies) {\n if (!this.dependents.has(depId)) {\n this.dependents.set(depId, new Set());\n }\n this.dependents.get(depId)!.add(task.id);\n }\n }\n\n this.headTaskId = data.headTaskId;\n } catch {\n // Corrupt file, start fresh\n }\n }\n\n /**\n * Validate that adding a task doesn't create a cycle\n */\n private validateNoCycle(newTask: Task): void {\n const visited = new Set<string>();\n const stack = new Set<string>();\n\n const hasCycle = (taskId: string): boolean => {\n if (stack.has(taskId)) return true;\n if (visited.has(taskId)) return false;\n\n visited.add(taskId);\n stack.add(taskId);\n\n const task = taskId === newTask.id ? newTask : this.tasks.get(taskId);\n if (task) {\n for (const depId of task.dependencies) {\n if (hasCycle(depId)) return true;\n }\n }\n\n stack.delete(taskId);\n return false;\n };\n\n if (hasCycle(newTask.id)) {\n throw new Error(`Adding task ${newTask.id} would create a circular dependency`);\n }\n }\n}\n","/**\n * PhysicsLoader - Load Sigil physics rules from markdown\n *\n * Parses .claude/rules/01-sigil-physics.md to extract the physics table.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport type {\n PhysicsTable,\n PhysicsRule,\n EffectType,\n SyncStrategy,\n ConfirmationType,\n} from './types.js';\n\n/** Default physics rules path */\nconst DEFAULT_PHYSICS_PATH = '.claude/rules/01-sigil-physics.md';\n\n/** Cached physics table */\nlet cachedPhysics: PhysicsTable | null = null;\nlet cachedPath: string | null = null;\n\n/**\n * Parse sync strategy from string\n */\nfunction parseSyncStrategy(value: string): SyncStrategy {\n const normalized = value.toLowerCase().trim();\n if (normalized === 'pessimistic') return 'pessimistic';\n if (normalized === 'optimistic') return 'optimistic';\n if (normalized === 'immediate') return 'immediate';\n return 'optimistic'; // Default\n}\n\n/**\n * Parse timing from string (e.g., \"800ms\" -> 800)\n */\nfunction parseTiming(value: string): number {\n const match = value.match(/(\\d+)\\s*ms/i);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n // Try plain number\n const num = parseInt(value, 10);\n return isNaN(num) ? 200 : num;\n}\n\n/**\n * Parse confirmation type from string\n */\nfunction parseConfirmation(value: string): ConfirmationType {\n const normalized = value.toLowerCase().trim();\n if (normalized === 'required' || normalized === 'yes') return 'required';\n if (normalized.includes('toast') || normalized.includes('undo')) return 'toast_undo';\n if (normalized === 'none' || normalized === 'no') return 'none';\n return 'none';\n}\n\n/**\n * Parse effect type from string\n */\nfunction parseEffectType(value: string): EffectType | null {\n const normalized = value.toLowerCase().replace(/[\\s-]/g, '_').trim();\n\n const mapping: Record<string, EffectType> = {\n financial: 'financial',\n destructive: 'destructive',\n soft_delete: 'soft_delete',\n 'soft delete': 'soft_delete',\n standard: 'standard',\n navigation: 'navigation',\n query: 'query',\n local_state: 'local',\n 'local state': 'local',\n local: 'local',\n high_freq: 'high_freq',\n 'high-freq': 'high_freq',\n highfreq: 'high_freq',\n };\n\n return mapping[normalized] ?? null;\n}\n\n/**\n * Parse physics table from markdown content\n */\nfunction parsePhysicsTable(content: string): PhysicsTable {\n const physics: PhysicsTable = new Map();\n\n // Find the physics table section\n const tableMatch = content.match(\n /<physics_table>[\\s\\S]*?\\|[\\s\\S]*?<\\/physics_table>/\n );\n\n if (!tableMatch) {\n console.warn('Physics table not found in content');\n return getDefaultPhysics();\n }\n\n const tableContent = tableMatch[0];\n\n // Parse markdown table rows\n // Format: | Effect | Sync | Timing | Confirmation | Why |\n const lines = tableContent.split('\\n');\n\n for (const line of lines) {\n // Skip header and separator lines\n if (!line.includes('|') || line.includes('---') || line.includes('Effect')) {\n continue;\n }\n\n const cells = line\n .split('|')\n .map((c) => c.trim())\n .filter((c) => c.length > 0);\n\n if (cells.length < 4) continue;\n\n const effectStr = cells[0];\n const syncStr = cells[1];\n const timingStr = cells[2];\n const confirmStr = cells[3];\n const whyParts = cells.slice(4);\n\n if (!effectStr || !syncStr || !timingStr || !confirmStr) continue;\n\n const effect = parseEffectType(effectStr);\n if (!effect) continue;\n\n const rule: PhysicsRule = {\n effect,\n sync: parseSyncStrategy(syncStr),\n timing: parseTiming(timingStr),\n confirmation: parseConfirmation(confirmStr),\n rationale: whyParts.join(' ').trim(),\n };\n\n physics.set(effect, rule);\n }\n\n return physics;\n}\n\n/**\n * Get default physics table (fallback when file not found)\n */\nexport function getDefaultPhysics(): PhysicsTable {\n const physics: PhysicsTable = new Map();\n\n physics.set('financial', {\n effect: 'financial',\n sync: 'pessimistic',\n timing: 800,\n confirmation: 'required',\n rationale: \"Money can't roll back. Users need time to verify.\",\n });\n\n physics.set('destructive', {\n effect: 'destructive',\n sync: 'pessimistic',\n timing: 600,\n confirmation: 'required',\n rationale: 'Permanent actions need deliberation.',\n });\n\n physics.set('soft_delete', {\n effect: 'soft_delete',\n sync: 'optimistic',\n timing: 200,\n confirmation: 'toast_undo',\n rationale: 'Undo exists, so we can be fast.',\n });\n\n physics.set('standard', {\n effect: 'standard',\n sync: 'optimistic',\n timing: 200,\n confirmation: 'none',\n rationale: 'Low stakes = snappy feedback.',\n });\n\n physics.set('navigation', {\n effect: 'navigation',\n sync: 'immediate',\n timing: 150,\n confirmation: 'none',\n rationale: 'URL changes feel instant.',\n });\n\n physics.set('query', {\n effect: 'query',\n sync: 'optimistic',\n timing: 150,\n confirmation: 'none',\n rationale: 'Data retrieval, no state change.',\n });\n\n physics.set('local', {\n effect: 'local',\n sync: 'immediate',\n timing: 100,\n confirmation: 'none',\n rationale: 'No server = instant expected.',\n });\n\n physics.set('high_freq', {\n effect: 'high_freq',\n sync: 'immediate',\n timing: 0,\n confirmation: 'none',\n rationale: 'Animation becomes friction.',\n });\n\n return physics;\n}\n\n/**\n * Load physics from file\n *\n * @param path - Path to physics markdown file (default: .claude/rules/01-sigil-physics.md)\n * @returns Parsed physics table\n */\nexport async function loadPhysics(path?: string): Promise<PhysicsTable> {\n const physicsPath = path ?? DEFAULT_PHYSICS_PATH;\n\n // Return cached if same path\n if (cachedPhysics && cachedPath === physicsPath) {\n return cachedPhysics;\n }\n\n // Check if file exists\n if (!existsSync(physicsPath)) {\n console.warn(`Physics file not found at ${physicsPath}, using defaults`);\n cachedPhysics = getDefaultPhysics();\n cachedPath = physicsPath;\n return cachedPhysics;\n }\n\n try {\n const content = await readFile(physicsPath, 'utf-8');\n cachedPhysics = parsePhysicsTable(content);\n cachedPath = physicsPath;\n\n // If parsing found nothing, use defaults\n if (cachedPhysics.size === 0) {\n console.warn('No physics rules parsed, using defaults');\n cachedPhysics = getDefaultPhysics();\n }\n\n return cachedPhysics;\n } catch (error) {\n console.warn(`Error loading physics from ${physicsPath}:`, error);\n cachedPhysics = getDefaultPhysics();\n cachedPath = physicsPath;\n return cachedPhysics;\n }\n}\n\n/**\n * Get physics rule for an effect type\n *\n * @param effect - Effect type to look up\n * @param physics - Physics table (will load if not provided)\n * @returns Physics rule or undefined\n */\nexport async function getPhysicsRule(\n effect: EffectType,\n physics?: PhysicsTable\n): Promise<PhysicsRule | undefined> {\n const table = physics ?? (await loadPhysics());\n return table.get(effect);\n}\n\n/**\n * Clear physics cache (for testing)\n */\nexport function clearPhysicsCache(): void {\n cachedPhysics = null;\n cachedPath = null;\n}\n\n/**\n * Check if physics are cached\n */\nexport function isPhysicsCached(): boolean {\n return cachedPhysics !== null;\n}\n","/**\n * VocabularyLoader - Load Sigil vocabulary from markdown\n *\n * Parses .claude/rules/08-sigil-lexicon.md to extract keyword → effect mappings.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport type { Vocabulary, VocabularyEntry, EffectType } from './types.js';\n\n/** Default vocabulary path */\nconst DEFAULT_VOCABULARY_PATH = '.claude/rules/08-sigil-lexicon.md';\n\n/** Cached vocabulary */\nlet cachedVocabulary: Vocabulary | null = null;\nlet cachedPath: string | null = null;\n\n/**\n * Parse keywords from a code block section\n */\nfunction parseKeywordsFromBlock(block: string): string[] {\n const keywords: string[] = [];\n\n // Split by lines and extract keywords\n const lines = block.split('\\n');\n for (const line of lines) {\n // Skip category labels like \"Primary:\", \"Extended:\", etc.\n const colonIndex = line.indexOf(':');\n const content = colonIndex >= 0 ? line.slice(colonIndex + 1) : line;\n\n // Split by comma and extract individual keywords\n const words = content\n .split(/[,\\s]+/)\n .map((w) => w.trim().toLowerCase())\n .filter((w) => w.length > 0 && !w.includes('```'));\n\n keywords.push(...words);\n }\n\n return [...new Set(keywords)]; // Deduplicate\n}\n\n/**\n * Parse effect keywords section\n */\nfunction parseEffectKeywords(content: string): Map<EffectType, VocabularyEntry> {\n const effects = new Map<EffectType, VocabularyEntry>();\n\n // Find the effect_keywords section\n const sectionMatch = content.match(\n /<effect_keywords>[\\s\\S]*?<\\/effect_keywords>/\n );\n\n if (!sectionMatch) {\n return effects;\n }\n\n const section = sectionMatch[0];\n\n // Define effect patterns with their headers\n const effectPatterns: Array<{ effect: EffectType; pattern: RegExp }> = [\n {\n effect: 'financial',\n pattern: /###\\s*Financial[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n {\n effect: 'destructive',\n pattern: /###\\s*Destructive[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n {\n effect: 'soft_delete',\n pattern: /###\\s*Soft\\s*Delete[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n {\n effect: 'standard',\n pattern: /###\\s*Standard[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n {\n effect: 'local',\n pattern: /###\\s*Local\\s*State[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n {\n effect: 'navigation',\n pattern: /###\\s*Navigation[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n {\n effect: 'query',\n pattern: /###\\s*Query[\\s\\S]*?```([\\s\\S]*?)```/i,\n },\n ];\n\n for (const { effect, pattern } of effectPatterns) {\n const match = section.match(pattern);\n if (match && match[1]) {\n const keywords = parseKeywordsFromBlock(match[1]);\n if (keywords.length > 0) {\n effects.set(effect, {\n keywords,\n effect,\n category: 'lexicon',\n });\n }\n }\n }\n\n return effects;\n}\n\n/**\n * Parse type overrides section\n */\nfunction parseTypeOverrides(content: string): Map<string, EffectType> {\n const overrides = new Map<string, EffectType>();\n\n // Find the type_overrides section\n const sectionMatch = content.match(\n /<type_overrides>[\\s\\S]*?<\\/type_overrides>/\n );\n\n if (!sectionMatch) {\n return overrides;\n }\n\n const section = sectionMatch[0];\n\n // Parse table rows: | Type Pattern | Forced Effect | Why |\n const lines = section.split('\\n');\n for (const line of lines) {\n if (!line.includes('|') || line.includes('---') || line.includes('Type Pattern')) {\n continue;\n }\n\n const cells = line\n .split('|')\n .map((c) => c.trim())\n .filter((c) => c.length > 0);\n\n if (cells.length < 2) continue;\n\n const typePattern = cells[0];\n const forcedEffect = cells[1];\n\n if (!typePattern || !forcedEffect) continue;\n\n // Parse type patterns (may contain backticks and commas)\n const types = typePattern\n .replace(/`/g, '')\n .split(',')\n .map((t) => t.trim().toLowerCase())\n .filter((t) => t.length > 0);\n\n // Map effect string to EffectType\n const effect = mapEffectString(forcedEffect);\n if (effect) {\n for (const type of types) {\n overrides.set(type, effect);\n }\n }\n }\n\n return overrides;\n}\n\n/**\n * Parse domain context defaults\n */\nfunction parseDomainDefaults(content: string): Map<string, EffectType> {\n const defaults = new Map<string, EffectType>();\n\n // Find the domain_context section\n const sectionMatch = content.match(\n /<domain_context>[\\s\\S]*?<\\/domain_context>/\n );\n\n if (!sectionMatch) {\n return defaults;\n }\n\n const section = sectionMatch[0];\n\n // Look for domain headers and their defaults\n const domainHeaderPattern = /###\\s*([\\w\\/]+)\\s*\\n```([\\s\\S]*?)```/gi;\n let match;\n\n while ((match = domainHeaderPattern.exec(section)) !== null) {\n const domainName = match[1];\n const domainContent = match[2];\n\n if (!domainName || !domainContent) continue;\n\n // Look for \"Default:\" line\n const defaultMatch = domainContent.match(/Default:\\s*([\\w\\s()]+)/i);\n if (defaultMatch && defaultMatch[1]) {\n const effect = mapEffectString(defaultMatch[1]);\n if (effect) {\n // Add domain keywords\n const keywordMatch = domainContent.match(/Keywords:\\s*([\\w,\\s]+)/i);\n if (keywordMatch && keywordMatch[1]) {\n const keywords = keywordMatch[1]\n .split(',')\n .map((k) => k.trim().toLowerCase())\n .filter((k) => k.length > 0);\n\n for (const keyword of keywords) {\n defaults.set(keyword, effect);\n }\n }\n // Also add domain name itself\n defaults.set(domainName.toLowerCase().replace('/', '_'), effect);\n }\n }\n }\n\n return defaults;\n}\n\n/**\n * Map effect string to EffectType\n */\nfunction mapEffectString(value: string): EffectType | null {\n const normalized = value.toLowerCase().trim();\n\n if (normalized.includes('financial')) return 'financial';\n if (normalized.includes('destructive')) return 'destructive';\n if (normalized.includes('soft') && normalized.includes('delete')) return 'soft_delete';\n if (normalized.includes('standard')) return 'standard';\n if (normalized.includes('local')) return 'local';\n if (normalized.includes('navigation')) return 'navigation';\n if (normalized.includes('query')) return 'query';\n if (normalized.includes('immediate')) return 'local';\n\n return null;\n}\n\n/**\n * Get default vocabulary (fallback)\n */\nexport function getDefaultVocabulary(): Vocabulary {\n const effects = new Map<EffectType, VocabularyEntry>();\n\n effects.set('financial', {\n keywords: [\n 'claim', 'deposit', 'withdraw', 'transfer', 'swap', 'send', 'pay', 'purchase',\n 'mint', 'burn', 'stake', 'unstake', 'bridge', 'approve', 'redeem', 'harvest',\n ],\n effect: 'financial',\n category: 'default',\n });\n\n effects.set('destructive', {\n keywords: [\n 'delete', 'remove', 'destroy', 'revoke', 'terminate', 'purge', 'erase', 'wipe',\n ],\n effect: 'destructive',\n category: 'default',\n });\n\n effects.set('soft_delete', {\n keywords: ['archive', 'hide', 'trash', 'dismiss', 'snooze', 'mute'],\n effect: 'soft_delete',\n category: 'default',\n });\n\n effects.set('standard', {\n keywords: [\n 'save', 'update', 'edit', 'create', 'add', 'like', 'follow', 'bookmark',\n ],\n effect: 'standard',\n category: 'default',\n });\n\n effects.set('local', {\n keywords: ['toggle', 'switch', 'expand', 'collapse', 'select', 'focus'],\n effect: 'local',\n category: 'default',\n });\n\n effects.set('navigation', {\n keywords: ['navigate', 'go', 'back', 'forward', 'link', 'route'],\n effect: 'navigation',\n category: 'default',\n });\n\n effects.set('query', {\n keywords: ['fetch', 'load', 'get', 'list', 'search', 'find'],\n effect: 'query',\n category: 'default',\n });\n\n const typeOverrides = new Map<string, EffectType>([\n ['currency', 'financial'],\n ['money', 'financial'],\n ['amount', 'financial'],\n ['wei', 'financial'],\n ['bigint', 'financial'],\n ['token', 'financial'],\n ['balance', 'financial'],\n ['price', 'financial'],\n ['fee', 'financial'],\n ['password', 'destructive'],\n ['secret', 'destructive'],\n ['key', 'destructive'],\n ['permission', 'destructive'],\n ['role', 'destructive'],\n ['access', 'destructive'],\n ['theme', 'local'],\n ['preference', 'local'],\n ['setting', 'local'],\n ['filter', 'local'],\n ['sort', 'local'],\n ['view', 'local'],\n ]);\n\n const domainDefaults = new Map<string, EffectType>([\n ['wallet', 'financial'],\n ['token', 'financial'],\n ['nft', 'financial'],\n ['contract', 'financial'],\n ['chain', 'financial'],\n ['gas', 'financial'],\n ['cart', 'standard'],\n ['checkout', 'financial'],\n ['payment', 'financial'],\n ]);\n\n return { effects, typeOverrides, domainDefaults };\n}\n\n/**\n * Load vocabulary from file\n *\n * @param path - Path to vocabulary markdown file\n * @returns Parsed vocabulary\n */\nexport async function loadVocabulary(path?: string): Promise<Vocabulary> {\n const vocabPath = path ?? DEFAULT_VOCABULARY_PATH;\n\n // Return cached if same path\n if (cachedVocabulary && cachedPath === vocabPath) {\n return cachedVocabulary;\n }\n\n // Check if file exists\n if (!existsSync(vocabPath)) {\n console.warn(`Vocabulary file not found at ${vocabPath}, using defaults`);\n cachedVocabulary = getDefaultVocabulary();\n cachedPath = vocabPath;\n return cachedVocabulary;\n }\n\n try {\n const content = await readFile(vocabPath, 'utf-8');\n\n const effects = parseEffectKeywords(content);\n const typeOverrides = parseTypeOverrides(content);\n const domainDefaults = parseDomainDefaults(content);\n\n // Use defaults if parsing failed\n if (effects.size === 0) {\n console.warn('No vocabulary parsed, using defaults');\n cachedVocabulary = getDefaultVocabulary();\n } else {\n cachedVocabulary = { effects, typeOverrides, domainDefaults };\n }\n\n cachedPath = vocabPath;\n return cachedVocabulary;\n } catch (error) {\n console.warn(`Error loading vocabulary from ${vocabPath}:`, error);\n cachedVocabulary = getDefaultVocabulary();\n cachedPath = vocabPath;\n return cachedVocabulary;\n }\n}\n\n/**\n * Resolve effect from keywords\n *\n * @param keywords - Keywords to look up\n * @param vocabulary - Vocabulary (will load if not provided)\n * @returns Most specific effect type found, or null\n */\nexport async function resolveEffectFromKeywords(\n keywords: string[],\n vocabulary?: Vocabulary\n): Promise<EffectType | null> {\n const vocab = vocabulary ?? (await loadVocabulary());\n\n // Normalize keywords\n const normalizedKeywords = keywords.map((k) => k.toLowerCase().trim());\n\n // Priority order: financial > destructive > soft_delete > standard > local > navigation > query\n const priorityOrder: EffectType[] = [\n 'financial',\n 'destructive',\n 'soft_delete',\n 'standard',\n 'local',\n 'navigation',\n 'query',\n 'high_freq',\n ];\n\n for (const effect of priorityOrder) {\n const entry = vocab.effects.get(effect);\n if (entry) {\n for (const keyword of normalizedKeywords) {\n if (entry.keywords.includes(keyword)) {\n return effect;\n }\n }\n }\n }\n\n // Check type overrides\n for (const keyword of normalizedKeywords) {\n const override = vocab.typeOverrides.get(keyword);\n if (override) {\n return override;\n }\n }\n\n // Check domain defaults\n for (const keyword of normalizedKeywords) {\n const domainDefault = vocab.domainDefaults.get(keyword);\n if (domainDefault) {\n return domainDefault;\n }\n }\n\n return null;\n}\n\n/**\n * Clear vocabulary cache (for testing)\n */\nexport function clearVocabularyCache(): void {\n cachedVocabulary = null;\n cachedPath = null;\n}\n\n/**\n * Check if vocabulary is cached\n */\nexport function isVocabularyCached(): boolean {\n return cachedVocabulary !== null;\n}\n","/**\n * GroundingGate - Validate agent grounding statements\n *\n * Parses agent output for grounding statements and validates them\n * against Sigil physics rules.\n */\n\nimport { loadPhysics } from './physics-loader.js';\nimport { loadVocabulary, resolveEffectFromKeywords } from './vocabulary-loader.js';\nimport { ZONE_HIERARCHY } from '../types.js';\nimport type { Zone, WardenResult, CheckResult } from '../types.js';\nimport type {\n GroundingStatement,\n PhysicsTable,\n Vocabulary,\n EffectType,\n SyncStrategy,\n ConfirmationType,\n} from './types.js';\n\n/** Zone to effect type mapping */\nconst ZONE_TO_EFFECT: Record<Zone, EffectType> = {\n critical: 'financial',\n elevated: 'destructive',\n standard: 'standard',\n local: 'local',\n};\n\n/** Effect type to zone mapping */\nconst EFFECT_TO_ZONE: Record<EffectType, Zone> = {\n financial: 'critical',\n destructive: 'elevated',\n soft_delete: 'standard',\n standard: 'standard',\n navigation: 'local',\n query: 'local',\n local: 'local',\n high_freq: 'local',\n};\n\n/**\n * Parse zone from string\n */\nfunction parseZone(value: string): Zone | null {\n const normalized = value.toLowerCase().trim();\n if (normalized === 'critical') return 'critical';\n if (normalized === 'elevated') return 'elevated';\n if (normalized === 'standard') return 'standard';\n if (normalized === 'local') return 'local';\n return null;\n}\n\n/**\n * Parse sync strategy from string\n */\nfunction parseSyncStrategy(value: string): SyncStrategy | undefined {\n const normalized = value.toLowerCase().trim();\n if (normalized.includes('pessimistic')) return 'pessimistic';\n if (normalized.includes('optimistic')) return 'optimistic';\n if (normalized.includes('immediate')) return 'immediate';\n return undefined;\n}\n\n/**\n * Parse timing from string\n */\nfunction parseTiming(value: string): number | undefined {\n const match = value.match(/(\\d+)\\s*ms/i);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n return undefined;\n}\n\n/**\n * Parse confirmation from string\n */\nfunction parseConfirmation(value: string): ConfirmationType | undefined {\n const normalized = value.toLowerCase().trim();\n if (normalized.includes('required') || normalized === 'yes') return 'required';\n if (normalized.includes('toast') || normalized.includes('undo')) return 'toast_undo';\n if (normalized.includes('none') || normalized === 'no') return 'none';\n return undefined;\n}\n\n/**\n * Extract keywords from text\n * Note: Only extracts action keywords, not zone/effect labels from structured fields\n */\nfunction extractKeywords(text: string): string[] {\n // Remove structured field labels to avoid false positives\n // e.g., \"Zone: standard\" should not detect \"standard\" as an action keyword\n const cleanedText = text\n .replace(/Zone:\\s*\\w+/gi, '')\n .replace(/Effect:\\s*[\\w\\s]+/gi, '')\n .replace(/Sync:\\s*\\w+/gi, '')\n .replace(/Confirmation:\\s*[\\w\\s+]+/gi, '');\n\n // Common keywords to look for\n const keywordPatterns = [\n // Financial\n 'claim', 'deposit', 'withdraw', 'transfer', 'swap', 'send', 'pay', 'purchase',\n 'mint', 'burn', 'stake', 'unstake', 'bridge', 'approve', 'redeem', 'harvest',\n // Destructive\n 'delete', 'remove', 'destroy', 'revoke', 'terminate', 'purge', 'erase', 'wipe',\n // Soft delete\n 'archive', 'hide', 'trash', 'dismiss', 'snooze', 'mute',\n // Standard\n 'save', 'update', 'edit', 'create', 'add', 'like', 'follow', 'bookmark',\n // Local\n 'toggle', 'switch', 'expand', 'collapse', 'select', 'focus',\n // Navigation\n 'navigate', 'go', 'back', 'forward', 'link', 'route',\n // Query\n 'fetch', 'load', 'get', 'list', 'search', 'find',\n // Domain/type hints\n 'wallet', 'token', 'nft', 'contract', 'chain', 'gas',\n 'currency', 'money', 'amount', 'balance', 'price', 'fee',\n // Effect type names (for inline detection in prose)\n 'financial', 'destructive',\n ];\n\n const words = cleanedText.toLowerCase().split(/[\\s,.:;!?()\\[\\]{}]+/);\n const foundKeywords: string[] = [];\n\n for (const word of words) {\n if (keywordPatterns.includes(word)) {\n foundKeywords.push(word);\n }\n }\n\n return [...new Set(foundKeywords)];\n}\n\n/**\n * Parse grounding statement from text\n *\n * Looks for patterns like:\n * - \"Zone: critical\"\n * - \"Effect: Financial\"\n * - \"Sync: pessimistic\"\n * - \"Timing: 800ms\"\n * - Physics analysis boxes\n */\nexport function parseGroundingStatement(text: string): GroundingStatement {\n const statement: GroundingStatement = {\n component: '',\n citedZone: null,\n detectedKeywords: [],\n inferredEffect: null,\n claimedPhysics: {},\n raw: text,\n };\n\n // Extract component name\n // Handle analysis box format with trailing whitespace and box characters\n const componentMatch = text.match(/(?:Component|Button|Modal|Form|Dialog):\\s*[\"']?([^\\s\"'│|]+)/i);\n if (componentMatch && componentMatch[1]) {\n statement.component = componentMatch[1].trim();\n } else {\n // Try to find component name from context\n const buttonMatch = text.match(/[\"']?(\\w+(?:Button|Modal|Form|Dialog|Card|Input))[\"']?/);\n if (buttonMatch && buttonMatch[1]) {\n statement.component = buttonMatch[1];\n }\n }\n\n // Extract zone\n const zoneMatch = text.match(/Zone:\\s*(\\w+)/i);\n if (zoneMatch && zoneMatch[1]) {\n statement.citedZone = parseZone(zoneMatch[1]);\n }\n\n // Extract effect\n const effectMatch = text.match(/Effect:\\s*(\\w+(?:\\s+\\w+)?)/i);\n if (effectMatch && effectMatch[1]) {\n const effectStr = effectMatch[1].toLowerCase();\n if (effectStr.includes('financial')) statement.inferredEffect = 'financial';\n else if (effectStr.includes('destructive')) statement.inferredEffect = 'destructive';\n else if (effectStr.includes('soft')) statement.inferredEffect = 'soft_delete';\n else if (effectStr.includes('standard')) statement.inferredEffect = 'standard';\n else if (effectStr.includes('local')) statement.inferredEffect = 'local';\n else if (effectStr.includes('navigation')) statement.inferredEffect = 'navigation';\n else if (effectStr.includes('query')) statement.inferredEffect = 'query';\n }\n\n // Extract sync strategy\n const syncMatch = text.match(/Sync:\\s*(\\w+)/i);\n if (syncMatch && syncMatch[1]) {\n const parsed = parseSyncStrategy(syncMatch[1]);\n if (parsed) statement.claimedPhysics.sync = parsed;\n } else {\n // Look for inline mentions\n if (text.toLowerCase().includes('pessimistic')) {\n statement.claimedPhysics.sync = 'pessimistic';\n } else if (text.toLowerCase().includes('optimistic')) {\n statement.claimedPhysics.sync = 'optimistic';\n } else if (text.toLowerCase().includes('immediate')) {\n statement.claimedPhysics.sync = 'immediate';\n }\n }\n\n // Extract timing\n const timingMatch = text.match(/Timing:\\s*(\\d+\\s*ms)/i);\n if (timingMatch && timingMatch[1]) {\n const parsed = parseTiming(timingMatch[1]);\n if (parsed !== undefined) statement.claimedPhysics.timing = parsed;\n } else {\n // Look for inline timing\n const inlineTiming = text.match(/(\\d+)\\s*ms/);\n if (inlineTiming && inlineTiming[1]) {\n statement.claimedPhysics.timing = parseInt(inlineTiming[1], 10);\n }\n }\n\n // Extract confirmation\n const confirmMatch = text.match(/Confirm(?:ation)?:\\s*(\\w+(?:\\s*\\+\\s*\\w+)?)/i);\n if (confirmMatch && confirmMatch[1]) {\n const parsed = parseConfirmation(confirmMatch[1]);\n if (parsed) statement.claimedPhysics.confirmation = parsed;\n } else {\n // Look for inline mentions\n if (text.toLowerCase().includes('confirmation required')) {\n statement.claimedPhysics.confirmation = 'required';\n } else if (text.toLowerCase().includes('toast') && text.toLowerCase().includes('undo')) {\n statement.claimedPhysics.confirmation = 'toast_undo';\n }\n }\n\n // Extract keywords\n statement.detectedKeywords = extractKeywords(text);\n\n return statement;\n}\n\n/**\n * Determine required zone based on keywords and effect\n */\nfunction determineRequiredZone(\n keywords: string[],\n effect: EffectType | null,\n vocabulary: Vocabulary\n): Zone {\n // If we have an explicit effect, use its zone\n if (effect) {\n return EFFECT_TO_ZONE[effect];\n }\n\n // Check for type overrides (highest priority)\n for (const keyword of keywords) {\n const override = vocabulary.typeOverrides.get(keyword.toLowerCase());\n if (override) {\n return EFFECT_TO_ZONE[override];\n }\n }\n\n // Check for financial keywords (critical zone)\n const financialKeywords = vocabulary.effects.get('financial')?.keywords ?? [];\n for (const keyword of keywords) {\n if (financialKeywords.includes(keyword.toLowerCase())) {\n return 'critical';\n }\n }\n\n // Check for destructive keywords (elevated zone)\n const destructiveKeywords = vocabulary.effects.get('destructive')?.keywords ?? [];\n for (const keyword of keywords) {\n if (destructiveKeywords.includes(keyword.toLowerCase())) {\n return 'elevated';\n }\n }\n\n // Default to standard\n return 'standard';\n}\n\n/**\n * Check keyword relevance\n */\nfunction checkRelevance(\n statement: GroundingStatement,\n vocabulary: Vocabulary\n): CheckResult {\n const { detectedKeywords, component } = statement;\n\n // If no keywords detected, check if component name contains hints\n if (detectedKeywords.length === 0) {\n const componentLower = component.toLowerCase();\n const allKeywords: string[] = [];\n\n for (const entry of vocabulary.effects.values()) {\n allKeywords.push(...entry.keywords);\n }\n\n const hasRelevantComponent = allKeywords.some((k) => componentLower.includes(k));\n\n if (!hasRelevantComponent) {\n return {\n passed: false,\n reason: 'No relevant keywords detected in statement or component name',\n };\n }\n }\n\n return {\n passed: true,\n reason: `Keywords detected: ${detectedKeywords.join(', ') || 'from component name'}`,\n };\n}\n\n/**\n * Check zone hierarchy compliance\n */\nfunction checkHierarchy(\n statement: GroundingStatement,\n requiredZone: Zone\n): CheckResult {\n const { citedZone } = statement;\n\n if (!citedZone) {\n return {\n passed: false,\n reason: 'No zone cited in statement',\n };\n }\n\n const requiredIndex = ZONE_HIERARCHY.indexOf(requiredZone);\n const citedIndex = ZONE_HIERARCHY.indexOf(citedZone);\n\n // Cited zone must be at least as restrictive as required\n // Lower index = more restrictive (critical=0, local=3)\n if (citedIndex > requiredIndex) {\n return {\n passed: false,\n reason: `Zone \"${citedZone}\" is less restrictive than required \"${requiredZone}\"`,\n };\n }\n\n if (citedIndex < requiredIndex) {\n return {\n passed: true,\n reason: `Zone \"${citedZone}\" is more restrictive than required \"${requiredZone}\" (OK)`,\n };\n }\n\n return {\n passed: true,\n reason: `Zone \"${citedZone}\" matches required zone`,\n };\n}\n\n/**\n * Check physics rules compliance\n */\nasync function checkRules(\n statement: GroundingStatement,\n requiredZone: Zone,\n physics: PhysicsTable\n): Promise<CheckResult> {\n const { claimedPhysics } = statement;\n const requiredEffect = ZONE_TO_EFFECT[requiredZone];\n const rule = physics.get(requiredEffect);\n\n if (!rule) {\n return {\n passed: false,\n reason: `No physics rule found for effect \"${requiredEffect}\"`,\n };\n }\n\n const violations: string[] = [];\n\n // Check sync strategy\n if (claimedPhysics.sync && claimedPhysics.sync !== rule.sync) {\n // Pessimistic is always acceptable for lower zones\n if (claimedPhysics.sync !== 'pessimistic') {\n violations.push(`Sync: claimed \"${claimedPhysics.sync}\", required \"${rule.sync}\"`);\n }\n }\n\n // Check timing (allow some tolerance)\n if (claimedPhysics.timing !== undefined) {\n const timingDiff = Math.abs(claimedPhysics.timing - rule.timing);\n // Allow 100ms tolerance for deliberate adjustments\n if (timingDiff > 100 && claimedPhysics.timing < rule.timing) {\n violations.push(\n `Timing: claimed ${claimedPhysics.timing}ms, required minimum ${rule.timing}ms`\n );\n }\n }\n\n // Check confirmation\n if (claimedPhysics.confirmation) {\n // \"required\" is always acceptable\n if (\n rule.confirmation === 'required' &&\n claimedPhysics.confirmation !== 'required'\n ) {\n violations.push(\n `Confirmation: claimed \"${claimedPhysics.confirmation}\", required \"${rule.confirmation}\"`\n );\n }\n }\n\n if (violations.length > 0) {\n return {\n passed: false,\n reason: violations.join('; '),\n };\n }\n\n return {\n passed: true,\n reason: 'Physics rules validated',\n };\n}\n\n/**\n * Validate a grounding statement\n *\n * @param input - Raw text or parsed statement\n * @param options - Validation options\n * @returns Warden validation result\n */\nexport async function validateGrounding(\n input: string | GroundingStatement,\n options?: {\n physicsPath?: string;\n vocabularyPath?: string;\n }\n): Promise<WardenResult> {\n // Load physics and vocabulary\n const physics = await loadPhysics(options?.physicsPath);\n const vocabulary = await loadVocabulary(options?.vocabularyPath);\n\n // Parse statement if string\n const statement =\n typeof input === 'string' ? parseGroundingStatement(input) : input;\n\n // Resolve effect from keywords if not already set\n if (!statement.inferredEffect && statement.detectedKeywords.length > 0) {\n statement.inferredEffect = await resolveEffectFromKeywords(\n statement.detectedKeywords,\n vocabulary\n );\n }\n\n // Determine required zone\n const requiredZone = determineRequiredZone(\n statement.detectedKeywords,\n statement.inferredEffect,\n vocabulary\n );\n\n // Run validation checks\n const relevanceCheck = checkRelevance(statement, vocabulary);\n const hierarchyCheck = checkHierarchy(statement, requiredZone);\n const rulesCheck = await checkRules(statement, requiredZone, physics);\n\n // Determine overall status\n let status: WardenResult['status'] = 'VALID';\n let correction: string | undefined;\n\n if (!relevanceCheck.passed) {\n status = 'DRIFT';\n correction = 'Statement lacks relevant keywords for effect detection.';\n } else if (!hierarchyCheck.passed) {\n status = 'DECEPTIVE';\n correction = `Zone mismatch: cited \"${statement.citedZone}\", required \"${requiredZone}\".`;\n } else if (!rulesCheck.passed) {\n status = 'DRIFT';\n correction = `Physics violation: ${rulesCheck.reason}`;\n }\n\n return {\n status,\n checks: {\n relevance: relevanceCheck,\n hierarchy: hierarchyCheck,\n rules: rulesCheck,\n },\n requiredZone,\n citedZone: statement.citedZone,\n ...(correction !== undefined && { correction }),\n };\n}\n\n/**\n * Quick validation check - returns true if valid\n */\nexport async function isGroundingValid(\n input: string | GroundingStatement,\n options?: {\n physicsPath?: string;\n vocabularyPath?: string;\n }\n): Promise<boolean> {\n const result = await validateGrounding(input, options);\n return result.status === 'VALID';\n}\n\n/**\n * Get exit code for validation result\n */\nexport function getExitCode(result: WardenResult): number {\n switch (result.status) {\n case 'VALID':\n return 0; // PASS\n case 'DRIFT':\n return 1; // DRIFT\n case 'DECEPTIVE':\n return 2; // DECEPTIVE\n default:\n return 3; // VIOLATION\n }\n}\n","/**\n * AdversarialWarden - Detect deceptive grounding claims\n *\n * Implements adversarial testing to catch agents citing lenient physics\n * when stricter physics are required.\n */\n\nimport type { Zone, WardenResult, CheckResult, LearnedRule } from '../types.js';\nimport { ZONE_HIERARCHY } from '../types.js';\nimport type { GroundingStatement } from './types.js';\nimport { validateGrounding, parseGroundingStatement } from './grounding-gate.js';\n\n/** Component types that can use each zone */\nconst ZONE_RELEVANCE: Record<Zone, string[]> = {\n critical: [\n 'button',\n 'form',\n 'modal',\n 'dialog',\n 'action',\n 'input',\n 'transaction',\n 'payment',\n 'claim',\n 'withdraw',\n 'deposit',\n 'transfer',\n 'swap',\n 'stake',\n 'mint',\n 'burn',\n ],\n elevated: [\n 'button',\n 'form',\n 'modal',\n 'dialog',\n 'action',\n 'delete',\n 'remove',\n 'revoke',\n 'terminate',\n 'confirmation',\n ],\n standard: [\n 'button',\n 'form',\n 'modal',\n 'dialog',\n 'action',\n 'input',\n 'card',\n 'list',\n 'table',\n 'save',\n 'edit',\n 'create',\n 'update',\n ],\n local: [\n 'toggle',\n 'switch',\n 'checkbox',\n 'radio',\n 'select',\n 'dropdown',\n 'tooltip',\n 'accordion',\n 'tab',\n 'theme',\n 'preference',\n 'filter',\n 'sort',\n ],\n};\n\n/**\n * AdversarialWarden class for detecting deceptive grounding\n */\nexport class AdversarialWarden {\n private learnedRules: LearnedRule[] = [];\n\n /**\n * Add a learned rule to the warden\n *\n * @param rule - The learned rule to add\n */\n addLearnedRule(rule: LearnedRule): void {\n this.learnedRules.push(rule);\n }\n\n /**\n * Clear all learned rules\n */\n clearLearnedRules(): void {\n this.learnedRules = [];\n }\n\n /**\n * Get all learned rules\n */\n getLearnedRules(): LearnedRule[] {\n return [...this.learnedRules];\n }\n\n /**\n * Check if cited zone is relevant to the component type\n *\n * Critical zone should only be cited for buttons, forms, modals, actions\n * Citing critical for a tooltip is suspicious\n *\n * @param citedZone - The zone cited by the agent\n * @param componentName - The component name\n * @returns Check result\n */\n checkRelevance(citedZone: Zone, componentName: string): CheckResult {\n const componentLower = componentName.toLowerCase();\n const relevantTypes = ZONE_RELEVANCE[citedZone];\n\n // Check if component name contains any relevant type\n const isRelevant = relevantTypes.some((type) =>\n componentLower.includes(type)\n );\n\n if (!isRelevant) {\n // Check if it's over-claiming (critical for non-critical component)\n const zoneIndex = ZONE_HIERARCHY.indexOf(citedZone);\n if (zoneIndex <= 1) {\n // critical or elevated\n return {\n passed: false,\n reason: `Zone \"${citedZone}\" is unnecessarily restrictive for component \"${componentName}\"`,\n };\n }\n }\n\n return {\n passed: true,\n reason: `Zone \"${citedZone}\" is appropriate for component \"${componentName}\"`,\n };\n }\n\n /**\n * Check learned rules against a grounding statement\n *\n * @param statement - Parsed grounding statement\n * @returns Check result with missing rule citations\n */\n checkLearnedRules(statement: GroundingStatement): CheckResult {\n const missingRules: string[] = [];\n\n for (const rule of this.learnedRules) {\n if (!rule.grounding_requirement?.must_cite) continue;\n\n // Check if rule trigger matches the statement\n const triggerMatches = this.checkRuleTrigger(rule, statement);\n if (!triggerMatches) continue;\n\n // Check if the required citation is present\n const citationPresent = this.checkCitationPresent(rule, statement);\n if (!citationPresent) {\n missingRules.push(rule.id);\n }\n }\n\n if (missingRules.length > 0) {\n return {\n passed: false,\n reason: `Missing required rule citations: ${missingRules.join(', ')}`,\n };\n }\n\n return {\n passed: true,\n reason: 'All required rule citations present',\n };\n }\n\n /**\n * Check if a rule's trigger matches the statement\n */\n private checkRuleTrigger(\n rule: LearnedRule,\n statement: GroundingStatement\n ): boolean {\n const trigger = rule.rule.trigger;\n\n // Check component name pattern\n if (trigger.component_name_contains) {\n const matches = trigger.component_name_contains.some((pattern) =>\n statement.component.toLowerCase().includes(pattern.toLowerCase())\n );\n if (!matches) return false;\n }\n\n // Check zone pattern\n if (trigger.zone) {\n if (statement.citedZone !== trigger.zone) return false;\n }\n\n // Check effect pattern\n if (trigger.effect && statement.inferredEffect !== trigger.effect) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if required citation is present in statement\n */\n private checkCitationPresent(\n rule: LearnedRule,\n statement: GroundingStatement\n ): boolean {\n const mustCite = rule.grounding_requirement?.must_cite;\n if (!mustCite) return true;\n\n // Check if the statement's raw text contains the required citation\n const rawLower = statement.raw.toLowerCase();\n\n // Check for zone citation\n if (mustCite.zone && statement.citedZone !== mustCite.zone) {\n return false;\n }\n\n // Check for physics citations\n if (mustCite.physics) {\n for (const physics of mustCite.physics) {\n if (!rawLower.includes(physics.toLowerCase())) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Run full adversarial validation\n *\n * @param input - Raw text or parsed statement\n * @param options - Validation options\n * @returns Extended warden result with adversarial checks\n */\n async validate(\n input: string | GroundingStatement,\n options?: {\n physicsPath?: string;\n vocabularyPath?: string;\n }\n ): Promise<AdversarialWardenResult> {\n // Parse statement if string\n const statement =\n typeof input === 'string' ? parseGroundingStatement(input) : input;\n\n // Run base grounding validation\n const baseResult = await validateGrounding(statement, options);\n\n // Run adversarial checks\n const relevanceCheck = statement.component\n ? this.checkRelevance(\n statement.citedZone ?? 'standard',\n statement.component\n )\n : { passed: true, reason: 'No component to check' };\n\n const learnedRulesCheck = this.checkLearnedRules(statement);\n\n // Determine final status\n let status = baseResult.status;\n let correction = baseResult.correction;\n\n // Relevance failure indicates DRIFT (over-claiming)\n if (!relevanceCheck.passed && status === 'VALID') {\n status = 'DRIFT';\n correction = relevanceCheck.reason;\n }\n\n // Learned rules failure indicates DRIFT\n if (!learnedRulesCheck.passed && status === 'VALID') {\n status = 'DRIFT';\n correction = learnedRulesCheck.reason;\n }\n\n return {\n ...baseResult,\n status,\n ...(correction !== undefined && { correction }),\n adversarialChecks: {\n relevance: relevanceCheck,\n learnedRules: learnedRulesCheck,\n },\n };\n }\n}\n\n/**\n * Extended result with adversarial checks\n */\nexport interface AdversarialWardenResult extends WardenResult {\n adversarialChecks: {\n relevance: CheckResult;\n learnedRules: CheckResult;\n };\n}\n\n/**\n * Check if zone A is more restrictive than zone B\n *\n * @param a - First zone\n * @param b - Second zone\n * @returns True if A is more restrictive (lower index in hierarchy)\n */\nexport function isMoreRestrictive(a: Zone, b: Zone): boolean {\n const indexA = ZONE_HIERARCHY.indexOf(a);\n const indexB = ZONE_HIERARCHY.indexOf(b);\n return indexA < indexB;\n}\n\n/**\n * Check if zone A is at least as restrictive as zone B\n *\n * @param a - First zone\n * @param b - Second zone\n * @returns True if A is equal to or more restrictive than B\n */\nexport function isAtLeastAsRestrictive(a: Zone, b: Zone): boolean {\n const indexA = ZONE_HIERARCHY.indexOf(a);\n const indexB = ZONE_HIERARCHY.indexOf(b);\n return indexA <= indexB;\n}\n\n/**\n * Get the zone hierarchy as a readable string\n */\nexport function getHierarchyDescription(): string {\n return ZONE_HIERARCHY.map((zone, i) => {\n const restrictiveness =\n i === 0 ? 'most restrictive' : i === ZONE_HIERARCHY.length - 1 ? 'least restrictive' : '';\n return `${zone}${restrictiveness ? ` (${restrictiveness})` : ''}`;\n }).join(' > ');\n}\n\n/**\n * Create a singleton warden instance\n */\nlet wardenInstance: AdversarialWarden | null = null;\n\n/**\n * Get or create the singleton warden instance\n */\nexport function getWarden(): AdversarialWarden {\n if (!wardenInstance) {\n wardenInstance = new AdversarialWarden();\n }\n return wardenInstance;\n}\n\n/**\n * Reset the singleton warden instance (for testing)\n */\nexport function resetWarden(): void {\n wardenInstance = null;\n}\n","/**\n * LensValidator - Validate User Lens impersonation data sources\n *\n * Validates that data displayed in User Lens mode is consistent\n * between observed values, on-chain reads, and indexed data.\n */\n\nimport type {\n LensContext,\n LensValidationIssue,\n LensIssueSeverity,\n LensValidationResult,\n Zone,\n LensExitCodeValue,\n} from '../types.js';\nimport { LensExitCode } from '../types.js';\n\n/**\n * Zone severity mapping for data source mismatches\n * Critical/Elevated zones require stricter data accuracy\n */\nconst ZONE_SEVERITY: Record<Zone, LensIssueSeverity> = {\n critical: 'error',\n elevated: 'error',\n standard: 'warning',\n local: 'info',\n};\n\n/**\n * Check for data source mismatch (observed != on_chain)\n *\n * When the UI shows a different value than what's on-chain,\n * the user may be making decisions based on stale data.\n */\nfunction checkDataSourceMismatch(\n context: LensContext,\n zone?: Zone\n): LensValidationIssue | null {\n const { observedValue, onChainValue, component } = context;\n\n // Skip if we don't have both values to compare\n if (observedValue === undefined || onChainValue === undefined) {\n return null;\n }\n\n // Normalize values for comparison (handle BigInt string representation)\n const normalizedObserved = normalizeValue(observedValue);\n const normalizedOnChain = normalizeValue(onChainValue);\n\n if (normalizedObserved !== normalizedOnChain) {\n const severity = zone ? ZONE_SEVERITY[zone] : 'warning';\n return {\n type: 'data_source_mismatch',\n severity,\n message: `Displayed value \"${observedValue}\" doesn't match on-chain value \"${onChainValue}\"`,\n component,\n ...(zone !== undefined && { zone }),\n expected: onChainValue,\n actual: observedValue,\n suggestion: 'Use on-chain data source for accuracy, or add refresh mechanism',\n };\n }\n\n return null;\n}\n\n/**\n * Check for stale indexed data (indexed != on_chain)\n *\n * Indexed data from Envio/Subgraph may lag behind on-chain state.\n * This is acceptable for display but not for transaction amounts.\n */\nfunction checkStaleIndexedData(\n context: LensContext,\n zone?: Zone\n): LensValidationIssue | null {\n const { indexedValue, onChainValue, component } = context;\n\n // Skip if we don't have both values to compare\n if (indexedValue === undefined || onChainValue === undefined) {\n return null;\n }\n\n const normalizedIndexed = normalizeValue(indexedValue);\n const normalizedOnChain = normalizeValue(onChainValue);\n\n if (normalizedIndexed !== normalizedOnChain) {\n // Stale indexed data is warning for standard, info for local\n // but error for critical/elevated zones\n const severity = zone ? ZONE_SEVERITY[zone] : 'warning';\n return {\n type: 'stale_indexed_data',\n severity,\n message: `Indexed value \"${indexedValue}\" doesn't match on-chain value \"${onChainValue}\"`,\n component,\n ...(zone !== undefined && { zone }),\n expected: onChainValue,\n actual: indexedValue,\n suggestion: 'Consider using on-chain reads for critical data or reducing indexer lag',\n };\n }\n\n return null;\n}\n\n/**\n * Check for financial zone using indexed data source\n *\n * Financial operations (critical zone) should NEVER use indexed data\n * as the source of truth for transaction amounts.\n */\nfunction checkLensFinancialSource(\n context: LensContext,\n zone?: Zone\n): LensValidationIssue | null {\n const { dataSource, component } = context;\n\n // Only applies to critical (financial) zone\n if (zone !== 'critical') {\n return null;\n }\n\n // Check if using indexed data for financial operations\n if (dataSource === 'indexed' || dataSource === 'mixed') {\n return {\n type: 'lens_financial_check',\n severity: 'error',\n message: `Financial component \"${component}\" uses ${dataSource} data source`,\n component,\n zone,\n suggestion: 'Financial operations must use on-chain data for transaction amounts',\n };\n }\n\n return null;\n}\n\n/**\n * Check for impersonation address leak\n *\n * Ensures the real address isn't being used where the impersonated\n * address should be displayed/used.\n */\nfunction checkImpersonationLeak(\n context: LensContext\n): LensValidationIssue | null {\n const { impersonatedAddress, realAddress, observedValue, component } = context;\n\n // Skip if no real address to compare\n if (!realAddress || !observedValue) {\n return null;\n }\n\n // Check if the observed value contains the real address when it should show impersonated\n const normalizedReal = realAddress.toLowerCase();\n const normalizedObserved = observedValue.toLowerCase();\n\n if (\n normalizedObserved.includes(normalizedReal) &&\n !normalizedObserved.includes(impersonatedAddress.toLowerCase())\n ) {\n return {\n type: 'impersonation_leak',\n severity: 'error',\n message: `Component \"${component}\" shows real address instead of impersonated address`,\n component,\n expected: impersonatedAddress,\n actual: observedValue,\n suggestion: 'Use lens-aware account hook to get the correct address context',\n };\n }\n\n return null;\n}\n\n/**\n * Normalize value for comparison\n * Handles BigInt strings, hex values, and decimal precision\n */\nfunction normalizeValue(value: string): string {\n // Remove whitespace\n let normalized = value.trim();\n\n // Handle BigInt representation (e.g., \"1000000000000000000n\")\n if (normalized.endsWith('n')) {\n normalized = normalized.slice(0, -1);\n }\n\n // Handle hex values (normalize to lowercase)\n if (normalized.startsWith('0x')) {\n normalized = normalized.toLowerCase();\n }\n\n // Handle potential decimal precision differences\n // e.g., \"1.0\" vs \"1.00\" vs \"1\"\n if (normalized.includes('.')) {\n // Remove trailing zeros after decimal\n normalized = normalized.replace(/\\.?0+$/, '');\n }\n\n return normalized;\n}\n\n/**\n * Validate LensContext for data source consistency\n *\n * @param context - The lens context to validate\n * @param zone - Optional zone for severity determination\n * @returns Validation result with any issues found\n */\nexport function validateLensContext(\n context: LensContext,\n zone?: Zone\n): LensValidationResult {\n const issues: LensValidationIssue[] = [];\n\n // Run all validation checks\n const dataSourceMismatch = checkDataSourceMismatch(context, zone);\n if (dataSourceMismatch) issues.push(dataSourceMismatch);\n\n const staleIndexed = checkStaleIndexedData(context, zone);\n if (staleIndexed) issues.push(staleIndexed);\n\n const financialSource = checkLensFinancialSource(context, zone);\n if (financialSource) issues.push(financialSource);\n\n const impersonationLeak = checkImpersonationLeak(context);\n if (impersonationLeak) issues.push(impersonationLeak);\n\n // Determine overall validity (errors = invalid, warnings/info = valid with warnings)\n const hasErrors = issues.some((issue) => issue.severity === 'error');\n const hasWarnings = issues.some((issue) => issue.severity === 'warning');\n\n let summary: string;\n if (issues.length === 0) {\n summary = 'All lens validation checks passed';\n } else if (hasErrors) {\n const errorCount = issues.filter((i) => i.severity === 'error').length;\n summary = `${errorCount} error(s) found in lens validation`;\n } else if (hasWarnings) {\n const warningCount = issues.filter((i) => i.severity === 'warning').length;\n summary = `${warningCount} warning(s) found in lens validation`;\n } else {\n summary = `${issues.length} informational issue(s) found`;\n }\n\n return {\n valid: !hasErrors,\n issues,\n summary,\n };\n}\n\n/**\n * Get exit code for lens validation result\n */\nexport function getLensExitCode(result: LensValidationResult): LensExitCodeValue {\n if (result.valid && result.issues.length === 0) {\n return LensExitCode.PASS;\n }\n\n const hasErrors = result.issues.some((issue) => issue.severity === 'error');\n if (hasErrors) {\n return LensExitCode.LENS_ERROR;\n }\n\n const hasWarnings = result.issues.some((issue) => issue.severity === 'warning');\n if (hasWarnings) {\n return LensExitCode.LENS_WARNING;\n }\n\n return LensExitCode.PASS;\n}\n\n/**\n * Quick validation check - returns true if no errors\n */\nexport function isLensContextValid(\n context: LensContext,\n zone?: Zone\n): boolean {\n const result = validateLensContext(context, zone);\n return result.valid;\n}\n\n/**\n * Batch validate multiple lens contexts\n */\nexport function validateMultipleLensContexts(\n contexts: Array<{ context: LensContext; zone?: Zone }>\n): LensValidationResult {\n const allIssues: LensValidationIssue[] = [];\n\n for (const { context, zone } of contexts) {\n const result = validateLensContext(context, zone);\n allIssues.push(...result.issues);\n }\n\n const hasErrors = allIssues.some((issue) => issue.severity === 'error');\n\n let summary: string;\n if (allIssues.length === 0) {\n summary = `All ${contexts.length} lens contexts validated successfully`;\n } else {\n const errorCount = allIssues.filter((i) => i.severity === 'error').length;\n const warningCount = allIssues.filter((i) => i.severity === 'warning').length;\n summary = `Validated ${contexts.length} contexts: ${errorCount} error(s), ${warningCount} warning(s)`;\n }\n\n return {\n valid: !hasErrors,\n issues: allIssues,\n summary,\n };\n}\n"]}