@triedotdev/mcp 1.0.94 → 1.0.99

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.
Files changed (83) hide show
  1. package/README.md +145 -137
  2. package/dist/{chunk-JAAIHNOE.js → chunk-APMV77PU.js} +21 -6
  3. package/dist/chunk-APMV77PU.js.map +1 -0
  4. package/dist/{chunk-HLSBTOVE.js → chunk-B3MNN3XB.js} +13 -18
  5. package/dist/{chunk-HLSBTOVE.js.map → chunk-B3MNN3XB.js.map} +1 -1
  6. package/dist/{chunk-IIF5XDCJ.js → chunk-DIZFGLXE.js} +787 -4696
  7. package/dist/chunk-DIZFGLXE.js.map +1 -0
  8. package/dist/{chunk-JO6RVXS6.js → chunk-F4NJ4CBP.js} +2 -2
  9. package/dist/{chunk-AZRCKBGF.js → chunk-FNCCZ3XB.js} +1222 -75
  10. package/dist/chunk-FNCCZ3XB.js.map +1 -0
  11. package/dist/chunk-G76DYVGX.js +136 -0
  12. package/dist/chunk-G76DYVGX.js.map +1 -0
  13. package/dist/chunk-HSNE46VE.js +956 -0
  14. package/dist/chunk-HSNE46VE.js.map +1 -0
  15. package/dist/{chunk-STEFLYPR.js → chunk-IXO4G4D3.js} +2 -2
  16. package/dist/{chunk-OEYIOOYB.js → chunk-JDHR5BDR.js} +2 -3
  17. package/dist/chunk-NIASHOAB.js +1304 -0
  18. package/dist/chunk-NIASHOAB.js.map +1 -0
  19. package/dist/{chunk-CKM6A3G6.js → chunk-OVRG5RP3.js} +6 -7
  20. package/dist/chunk-OVRG5RP3.js.map +1 -0
  21. package/dist/{chunk-RYRVEO2B.js → chunk-R3I2GCZC.js} +3 -3
  22. package/dist/{chunk-WT3XQCG2.js → chunk-R4AAPFXC.js} +2 -2
  23. package/dist/cli/create-agent.js +931 -7
  24. package/dist/cli/create-agent.js.map +1 -1
  25. package/dist/cli/main.js +151 -383
  26. package/dist/cli/main.js.map +1 -1
  27. package/dist/cli/yolo-daemon.js +13 -20
  28. package/dist/cli/yolo-daemon.js.map +1 -1
  29. package/dist/{goal-manager-HOZ7R2QV.js → goal-manager-LAOT4QQX.js} +6 -6
  30. package/dist/guardian-agent-M352CBE5.js +19 -0
  31. package/dist/index.js +1025 -1550
  32. package/dist/index.js.map +1 -1
  33. package/dist/{issue-store-DXIOP6AK.js → issue-store-W2X33X2X.js} +4 -4
  34. package/dist/{progress-LHI66U7B.js → progress-PQVEM7BR.js} +2 -2
  35. package/dist/{vibe-code-signatures-C5A4BHXD.js → vibe-code-signatures-ELEWJFGZ.js} +3 -3
  36. package/dist/{vulnerability-signatures-SVIHJQO5.js → vulnerability-signatures-EIJQX2TS.js} +3 -3
  37. package/dist/workers/agent-worker.js +2 -11
  38. package/dist/workers/agent-worker.js.map +1 -1
  39. package/package.json +2 -2
  40. package/dist/agent-smith-MYQ35URL.js +0 -14
  41. package/dist/agent-smith-runner-4TBONXCP.js +0 -573
  42. package/dist/agent-smith-runner-4TBONXCP.js.map +0 -1
  43. package/dist/cache-manager-RMPRPD5T.js +0 -10
  44. package/dist/chunk-AZRCKBGF.js.map +0 -1
  45. package/dist/chunk-CKM6A3G6.js.map +0 -1
  46. package/dist/chunk-E2ZATINO.js +0 -10879
  47. package/dist/chunk-E2ZATINO.js.map +0 -1
  48. package/dist/chunk-FFWNZUG2.js +0 -266
  49. package/dist/chunk-FFWNZUG2.js.map +0 -1
  50. package/dist/chunk-FK6DQKDY.js +0 -175
  51. package/dist/chunk-FK6DQKDY.js.map +0 -1
  52. package/dist/chunk-IFGF33R5.js +0 -279
  53. package/dist/chunk-IFGF33R5.js.map +0 -1
  54. package/dist/chunk-IIF5XDCJ.js.map +0 -1
  55. package/dist/chunk-JAAIHNOE.js.map +0 -1
  56. package/dist/chunk-ODWDESYP.js +0 -141
  57. package/dist/chunk-ODWDESYP.js.map +0 -1
  58. package/dist/chunk-OWBWNXSC.js +0 -955
  59. package/dist/chunk-OWBWNXSC.js.map +0 -1
  60. package/dist/chunk-Q764X2WD.js +0 -2124
  61. package/dist/chunk-Q764X2WD.js.map +0 -1
  62. package/dist/chunk-RE6ZWXJC.js +0 -279
  63. package/dist/chunk-RE6ZWXJC.js.map +0 -1
  64. package/dist/chunk-RNJ6JKMA.js +0 -2270
  65. package/dist/chunk-RNJ6JKMA.js.map +0 -1
  66. package/dist/chunk-Y62VM3ER.js +0 -536
  67. package/dist/chunk-Y62VM3ER.js.map +0 -1
  68. package/dist/git-45LZUUYA.js +0 -29
  69. package/dist/guardian-agent-RB2UQP5V.js +0 -21
  70. package/dist/progress-LHI66U7B.js.map +0 -1
  71. package/dist/vibe-code-signatures-C5A4BHXD.js.map +0 -1
  72. package/dist/vulnerability-signatures-SVIHJQO5.js.map +0 -1
  73. /package/dist/{chunk-JO6RVXS6.js.map → chunk-F4NJ4CBP.js.map} +0 -0
  74. /package/dist/{chunk-STEFLYPR.js.map → chunk-IXO4G4D3.js.map} +0 -0
  75. /package/dist/{chunk-OEYIOOYB.js.map → chunk-JDHR5BDR.js.map} +0 -0
  76. /package/dist/{chunk-RYRVEO2B.js.map → chunk-R3I2GCZC.js.map} +0 -0
  77. /package/dist/{chunk-WT3XQCG2.js.map → chunk-R4AAPFXC.js.map} +0 -0
  78. /package/dist/{agent-smith-MYQ35URL.js.map → goal-manager-LAOT4QQX.js.map} +0 -0
  79. /package/dist/{cache-manager-RMPRPD5T.js.map → guardian-agent-M352CBE5.js.map} +0 -0
  80. /package/dist/{git-45LZUUYA.js.map → issue-store-W2X33X2X.js.map} +0 -0
  81. /package/dist/{goal-manager-HOZ7R2QV.js.map → progress-PQVEM7BR.js.map} +0 -0
  82. /package/dist/{guardian-agent-RB2UQP5V.js.map → vibe-code-signatures-ELEWJFGZ.js.map} +0 -0
  83. /package/dist/{issue-store-DXIOP6AK.js.map → vulnerability-signatures-EIJQX2TS.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/checkpoint.ts","../src/utils/autonomy-config.ts","../src/types/autonomy.ts","../src/agent/perceive.ts","../src/agent/diff-analyzer.ts","../src/agent/risk-scorer.ts","../src/agent/pattern-matcher.ts","../src/agent/reason.ts","../src/bootstrap/files.ts","../src/utils/errors.ts","../src/context/sync.ts","../src/context/incident-index.ts","../src/context/file-trie.ts","../src/agent/confidence.ts","../src/agent/pattern-discovery.ts","../src/agent/learning.ts","../src/guardian/learning-engine.ts","../src/ingest/linear-ingester.ts"],"sourcesContent":["/**\n * Checkpoint CLI\n * \n * Save your work context to .trie/ without running a full scan.\n * Think of it as a quick save - captures what you're working on.\n */\n\nimport { existsSync } from 'fs';\nimport { mkdir, writeFile, readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\n\nexport interface Checkpoint {\n id: string;\n timestamp: string;\n message?: string;\n files: string[];\n notes?: string;\n createdBy: 'cli' | 'mcp';\n}\n\nexport interface CheckpointLog {\n checkpoints: Checkpoint[];\n lastCheckpoint?: string;\n}\n\n/**\n * Save a checkpoint\n */\nexport async function saveCheckpoint(options: {\n message?: string;\n files?: string[];\n notes?: string;\n workDir?: string;\n createdBy?: 'cli' | 'mcp';\n}): Promise<Checkpoint> {\n const workDir = options.workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(workDir);\n const checkpointPath = join(trieDir, 'checkpoints.json');\n \n await mkdir(trieDir, { recursive: true });\n \n // Load existing checkpoints\n let log: CheckpointLog = { checkpoints: [] };\n try {\n if (existsSync(checkpointPath)) {\n log = JSON.parse(await readFile(checkpointPath, 'utf-8'));\n }\n } catch {\n log = { checkpoints: [] };\n }\n \n // Create new checkpoint\n const checkpoint: Checkpoint = {\n id: `cp-${Date.now().toString(36)}`,\n timestamp: new Date().toISOString(),\n files: options.files || [],\n createdBy: options.createdBy || 'cli',\n };\n if (options.message) checkpoint.message = options.message;\n if (options.notes) checkpoint.notes = options.notes;\n \n // Add to log\n log.checkpoints.push(checkpoint);\n log.lastCheckpoint = checkpoint.id;\n \n // Keep last 50 checkpoints\n if (log.checkpoints.length > 50) {\n log.checkpoints = log.checkpoints.slice(-50);\n }\n \n // Save\n await writeFile(checkpointPath, JSON.stringify(log, null, 2));\n \n // Also update AGENTS.md with checkpoint note\n await updateAgentsMdWithCheckpoint(checkpoint, workDir);\n \n return checkpoint;\n}\n\n/**\n * List checkpoints\n */\nexport async function listCheckpoints(workDir?: string): Promise<Checkpoint[]> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const checkpointPath = join(getTrieDirectory(dir), 'checkpoints.json');\n \n try {\n if (existsSync(checkpointPath)) {\n const log: CheckpointLog = JSON.parse(await readFile(checkpointPath, 'utf-8'));\n return log.checkpoints;\n }\n } catch {\n // File doesn't exist or is corrupted\n }\n \n return [];\n}\n\n/**\n * Get the last checkpoint\n */\nexport async function getLastCheckpoint(workDir?: string): Promise<Checkpoint | null> {\n const checkpoints = await listCheckpoints(workDir);\n const last = checkpoints[checkpoints.length - 1];\n return last ?? null;\n}\n\n/**\n * Update AGENTS.md with checkpoint info\n */\nasync function updateAgentsMdWithCheckpoint(checkpoint: Checkpoint, workDir: string): Promise<void> {\n const agentsPath = join(getTrieDirectory(workDir), 'AGENTS.md');\n \n let content = '';\n try {\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n }\n } catch {\n content = '';\n }\n \n // Find or create checkpoint section\n const checkpointSection = `\n## Last Checkpoint\n\n- **ID:** ${checkpoint.id}\n- **Time:** ${checkpoint.timestamp}\n${checkpoint.message ? `- **Message:** ${checkpoint.message}` : ''}\n${checkpoint.files.length > 0 ? `- **Files:** ${checkpoint.files.length} files` : ''}\n${checkpoint.notes ? `- **Notes:** ${checkpoint.notes}` : ''}\n`;\n \n // Replace existing checkpoint section or append\n const checkpointRegex = /## Last Checkpoint[\\s\\S]*?(?=\\n## |\\n---|\\Z)/;\n if (checkpointRegex.test(content)) {\n content = content.replace(checkpointRegex, checkpointSection.trim());\n } else {\n content = content.trim() + '\\n\\n' + checkpointSection.trim() + '\\n';\n }\n \n await writeFile(agentsPath, content);\n}\n\n/**\n * CLI handler for checkpoint command\n */\nexport async function handleCheckpointCommand(args: string[]): Promise<void> {\n const subcommand = args[0] || 'save';\n \n switch (subcommand) {\n case 'save': {\n // Parse options\n let message: string | undefined;\n let notes: string | undefined;\n const files: string[] = [];\n \n for (let i = 1; i < args.length; i++) {\n const arg = args[i];\n if (arg === '-m' || arg === '--message') {\n message = args[++i] ?? '';\n } else if (arg === '-n' || arg === '--notes') {\n notes = args[++i] ?? '';\n } else if (arg === '-f' || arg === '--file') {\n const file = args[++i];\n if (file) files.push(file);\n } else if (arg && !arg.startsWith('-')) {\n // Treat as message if no flag\n message = arg;\n }\n }\n \n const opts: { message?: string; files?: string[]; notes?: string } = { files };\n if (message) opts.message = message;\n if (notes) opts.notes = notes;\n const checkpoint = await saveCheckpoint(opts);\n \n console.log('\\n Checkpoint saved\\n');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Time: ${checkpoint.timestamp}`);\n if (checkpoint.message) {\n console.log(` Message: ${checkpoint.message}`);\n }\n if (checkpoint.files.length > 0) {\n console.log(` Files: ${checkpoint.files.join(', ')}`);\n }\n console.log('\\n Context saved to .trie/\\n');\n break;\n }\n \n case 'list': {\n const checkpoints = await listCheckpoints();\n \n if (checkpoints.length === 0) {\n console.log('\\n No checkpoints yet. Run `trie checkpoint` to save one.\\n');\n return;\n }\n \n console.log('\\n Checkpoints:\\n');\n for (const cp of checkpoints.slice(-10).reverse()) {\n const date = new Date(cp.timestamp).toLocaleString();\n console.log(` ${cp.id} ${date} ${cp.message || '(no message)'}`);\n }\n console.log('');\n break;\n }\n \n case 'last': {\n const checkpoint = await getLastCheckpoint();\n \n if (!checkpoint) {\n console.log('\\n No checkpoints yet. Run `trie checkpoint` to save one.\\n');\n return;\n }\n \n console.log('\\n Last Checkpoint:\\n');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Time: ${new Date(checkpoint.timestamp).toLocaleString()}`);\n if (checkpoint.message) {\n console.log(` Message: ${checkpoint.message}`);\n }\n if (checkpoint.notes) {\n console.log(` Notes: ${checkpoint.notes}`);\n }\n if (checkpoint.files.length > 0) {\n console.log(` Files: ${checkpoint.files.join(', ')}`);\n }\n console.log('');\n break;\n }\n \n default:\n console.log(`\n Usage: trie checkpoint [command] [options]\n\n Commands:\n save [message] Save a checkpoint (default)\n list List recent checkpoints\n last Show the last checkpoint\n\n Options:\n -m, --message Checkpoint message\n -n, --notes Additional notes\n -f, --file File to include (can be repeated)\n\n Examples:\n trie checkpoint \"finished auth flow\"\n trie checkpoint save -m \"WIP: payment integration\" -n \"needs testing\"\n trie checkpoint list\n`);\n }\n}\n","/**\n * Autonomy Configuration Loader\n * \n * Loads, saves, and manages autonomy settings from .trie/config.json\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getTrieDirectory } from './workspace.js';\nimport type { \n AutonomyConfig, \n IssueOccurrence,\n AutoFixAction,\n PushBlockResult \n} from '../types/autonomy.js';\nimport { DEFAULT_AUTONOMY_CONFIG } from '../types/autonomy.js';\nimport { createHash } from 'crypto';\n\n// ============================================================================\n// Config Loading/Saving\n// ============================================================================\n\n/**\n * Load autonomy config from .trie/config.json\n */\nexport async function loadAutonomyConfig(projectPath: string): Promise<AutonomyConfig> {\n const configPath = join(getTrieDirectory(projectPath), 'config.json');\n \n try {\n if (!existsSync(configPath)) {\n return { ...DEFAULT_AUTONOMY_CONFIG };\n }\n \n const content = await readFile(configPath, 'utf-8');\n const config = JSON.parse(content);\n \n // Merge with defaults to ensure all fields exist\n return mergeWithDefaults(config.autonomy || {});\n } catch (error) {\n console.error('Failed to load autonomy config:', error);\n return { ...DEFAULT_AUTONOMY_CONFIG };\n }\n}\n\n/**\n * Save autonomy config to .trie/config.json\n */\nexport async function saveAutonomyConfig(\n projectPath: string, \n autonomyConfig: Partial<AutonomyConfig>\n): Promise<void> {\n const configPath = join(getTrieDirectory(projectPath), 'config.json');\n const trieDir = getTrieDirectory(projectPath);\n \n try {\n // Ensure .trie directory exists\n if (!existsSync(trieDir)) {\n await mkdir(trieDir, { recursive: true });\n }\n \n // Load existing config\n let fullConfig: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n const content = await readFile(configPath, 'utf-8');\n fullConfig = JSON.parse(content);\n }\n \n // Merge autonomy config\n fullConfig.autonomy = mergeWithDefaults(autonomyConfig);\n \n // Save atomically\n const tempPath = configPath + '.tmp';\n await writeFile(tempPath, JSON.stringify(fullConfig, null, 2));\n await writeFile(configPath, JSON.stringify(fullConfig, null, 2));\n \n } catch (error) {\n console.error('Failed to save autonomy config:', error);\n throw error;\n }\n}\n\n/**\n * Merge partial config with defaults\n */\nfunction mergeWithDefaults(partial: Partial<AutonomyConfig>): AutonomyConfig {\n return {\n level: partial.level ?? DEFAULT_AUTONOMY_CONFIG.level,\n autoCheck: {\n ...DEFAULT_AUTONOMY_CONFIG.autoCheck,\n ...(partial.autoCheck || {}),\n },\n autoFix: {\n ...DEFAULT_AUTONOMY_CONFIG.autoFix,\n ...(partial.autoFix || {}),\n },\n pushBlocking: {\n ...DEFAULT_AUTONOMY_CONFIG.pushBlocking,\n ...(partial.pushBlocking || {}),\n },\n progressiveEscalation: {\n ...DEFAULT_AUTONOMY_CONFIG.progressiveEscalation,\n ...(partial.progressiveEscalation || {}),\n thresholds: {\n ...DEFAULT_AUTONOMY_CONFIG.progressiveEscalation.thresholds,\n ...(partial.progressiveEscalation?.thresholds || {}),\n },\n },\n };\n}\n\n// ============================================================================\n// Issue Occurrence Tracking (for progressive escalation)\n// ============================================================================\n\nconst occurrenceCache = new Map<string, Map<string, IssueOccurrence>>();\n\n/**\n * Get occurrence tracker for a project\n */\nasync function getOccurrences(projectPath: string): Promise<Map<string, IssueOccurrence>> {\n if (occurrenceCache.has(projectPath)) {\n return occurrenceCache.get(projectPath)!;\n }\n \n const occurrencesPath = join(getTrieDirectory(projectPath), 'memory', 'occurrences.json');\n const occurrences = new Map<string, IssueOccurrence>();\n \n try {\n if (existsSync(occurrencesPath)) {\n const content = await readFile(occurrencesPath, 'utf-8');\n const data = JSON.parse(content);\n for (const [hash, occ] of Object.entries(data)) {\n occurrences.set(hash, occ as IssueOccurrence);\n }\n }\n } catch {\n // Start fresh\n }\n \n occurrenceCache.set(projectPath, occurrences);\n return occurrences;\n}\n\n/**\n * Save occurrences to disk\n */\nasync function saveOccurrences(projectPath: string): Promise<void> {\n const occurrences = occurrenceCache.get(projectPath);\n if (!occurrences) return;\n \n const occurrencesPath = join(getTrieDirectory(projectPath), 'memory', 'occurrences.json');\n const memoryDir = join(getTrieDirectory(projectPath), 'memory');\n \n try {\n if (!existsSync(memoryDir)) {\n await mkdir(memoryDir, { recursive: true });\n }\n \n const data: Record<string, IssueOccurrence> = {};\n for (const [hash, occ] of occurrences.entries()) {\n data[hash] = occ;\n }\n \n await writeFile(occurrencesPath, JSON.stringify(data, null, 2));\n } catch (error) {\n console.error('Failed to save occurrences:', error);\n }\n}\n\n/**\n * Create a hash for an issue (for deduplication)\n */\nexport function createIssueHash(file: string, line: number | undefined, issueType: string): string {\n const input = `${file}:${line || 0}:${issueType}`;\n return createHash('md5').update(input).digest('hex').slice(0, 12);\n}\n\n/**\n * Track an issue occurrence\n */\nexport async function trackIssueOccurrence(\n projectPath: string,\n file: string,\n line: number | undefined,\n issueType: string,\n config: AutonomyConfig\n): Promise<IssueOccurrence> {\n const occurrences = await getOccurrences(projectPath);\n const hash = createIssueHash(file, line, issueType);\n const now = Date.now();\n \n let occurrence = occurrences.get(hash);\n \n if (occurrence) {\n // Check if within time window\n const windowMs = config.progressiveEscalation.windowMs;\n if (now - occurrence.firstSeen > windowMs) {\n // Reset if outside window\n occurrence = {\n hash,\n firstSeen: now,\n lastSeen: now,\n count: 1,\n escalationLevel: 'suggest',\n notified: false,\n bypassed: false,\n bypassHistory: occurrence.bypassHistory, // Keep bypass history\n };\n } else {\n // Increment within window\n occurrence.lastSeen = now;\n occurrence.count++;\n \n // Update escalation level\n const thresholds = config.progressiveEscalation.thresholds;\n if (occurrence.count >= thresholds.block) {\n occurrence.escalationLevel = 'block';\n } else if (occurrence.count >= thresholds.escalate) {\n occurrence.escalationLevel = 'escalate';\n } else if (occurrence.count >= thresholds.autoCheck) {\n occurrence.escalationLevel = 'autoCheck';\n }\n }\n } else {\n // New occurrence\n occurrence = {\n hash,\n firstSeen: now,\n lastSeen: now,\n count: 1,\n escalationLevel: 'suggest',\n notified: false,\n bypassed: false,\n bypassHistory: [],\n };\n }\n \n occurrences.set(hash, occurrence);\n await saveOccurrences(projectPath);\n \n return occurrence;\n}\n\n/**\n * Get escalation level for an issue\n */\nexport async function getEscalationLevel(\n projectPath: string,\n file: string,\n line: number | undefined,\n issueType: string\n): Promise<IssueOccurrence['escalationLevel']> {\n const occurrences = await getOccurrences(projectPath);\n const hash = createIssueHash(file, line, issueType);\n \n const occurrence = occurrences.get(hash);\n return occurrence?.escalationLevel ?? 'suggest';\n}\n\n/**\n * Record a bypass\n */\nexport async function recordBypass(\n projectPath: string,\n file: string,\n line: number | undefined,\n issueType: string,\n method: string,\n reason?: string\n): Promise<void> {\n const occurrences = await getOccurrences(projectPath);\n const hash = createIssueHash(file, line, issueType);\n \n const occurrence = occurrences.get(hash);\n if (occurrence) {\n occurrence.bypassed = true;\n occurrence.bypassHistory.push({\n timestamp: Date.now(),\n method,\n ...(reason !== undefined ? { reason } : {}),\n });\n await saveOccurrences(projectPath);\n }\n}\n\n// ============================================================================\n// Auto-fix Helpers\n// ============================================================================\n\n/**\n * Check if a fix should be auto-applied based on config\n */\nexport function shouldAutoFix(\n fix: AutoFixAction,\n config: AutonomyConfig\n): boolean {\n if (!config.autoFix.enabled) {\n return false;\n }\n \n // Check if category is allowed\n const allowedCategories = config.autoFix.categories as string[];\n if (!allowedCategories.includes(fix.category) && \n !allowedCategories.includes('all')) {\n return false;\n }\n \n // Check if specific fix type is allowed\n if (config.autoFix.allowedFixTypes.length > 0 &&\n !config.autoFix.allowedFixTypes.includes(fix.type)) {\n return false;\n }\n \n // Check confidence threshold (require high confidence for auto-fix)\n if (fix.confidence < 0.9) {\n return false;\n }\n \n return true;\n}\n\n/**\n * Group fixes by file for batch application\n */\nexport function groupFixesByFile(fixes: AutoFixAction[]): Map<string, AutoFixAction[]> {\n const grouped = new Map<string, AutoFixAction[]>();\n \n for (const fix of fixes) {\n const existing = grouped.get(fix.file) || [];\n existing.push(fix);\n grouped.set(fix.file, existing);\n }\n \n return grouped;\n}\n\n// ============================================================================\n// Push Blocking Helpers\n// ============================================================================\n\n/**\n * Check if push should be blocked\n */\nexport function shouldBlockPush(\n issues: Array<{ severity: string; file: string; line?: number; issue: string }>,\n config: AutonomyConfig\n): PushBlockResult {\n if (!config.pushBlocking.enabled) {\n return {\n blocked: false,\n blockingIssues: [],\n bypassed: false,\n };\n }\n \n // Find blocking issues\n const blockingIssues = issues.filter(issue => \n config.pushBlocking.blockOn.includes(issue.severity as 'critical' | 'serious' | 'moderate')\n );\n \n if (blockingIssues.length === 0) {\n return {\n blocked: false,\n blockingIssues: [],\n bypassed: false,\n };\n }\n \n // Check for bypass\n const envBypass = process.env.TRIE_BYPASS === '1' || process.env.TRIE_BYPASS === 'true';\n \n if (envBypass && config.pushBlocking.allowBypass) {\n return {\n blocked: false,\n blockingIssues,\n bypassed: true,\n bypassMethod: 'env',\n };\n }\n \n // Build bypass instructions\n const bypassInstructions = buildBypassInstructions(config);\n \n return {\n blocked: true,\n reason: `${blockingIssues.length} ${blockingIssues[0]?.severity || 'critical'} issue(s) must be fixed before pushing`,\n blockingIssues,\n bypassInstructions,\n bypassed: false,\n };\n}\n\n/**\n * Build bypass instructions based on config\n */\nfunction buildBypassInstructions(config: AutonomyConfig): string {\n const instructions: string[] = [];\n \n if (config.pushBlocking.bypassMethods.includes('env')) {\n instructions.push('• Set TRIE_BYPASS=1 to bypass: TRIE_BYPASS=1 git push');\n }\n \n if (config.pushBlocking.bypassMethods.includes('flag')) {\n instructions.push('• Use --no-verify flag: git push --no-verify');\n }\n \n if (config.pushBlocking.bypassMethods.includes('confirm')) {\n instructions.push('• Run: trie bypass --confirm to bypass this push');\n }\n \n return instructions.join('\\n');\n}\n\n// ============================================================================\n// Singleton Config Cache\n// ============================================================================\n\nconst configCache = new Map<string, { config: AutonomyConfig; loadedAt: number }>();\nconst CACHE_TTL = 60000; // 1 minute\n\n/**\n * Get autonomy config with caching\n */\nexport async function getAutonomyConfig(projectPath: string): Promise<AutonomyConfig> {\n const cached = configCache.get(projectPath);\n \n if (cached && Date.now() - cached.loadedAt < CACHE_TTL) {\n return cached.config;\n }\n \n const config = await loadAutonomyConfig(projectPath);\n configCache.set(projectPath, { config, loadedAt: Date.now() });\n \n return config;\n}\n\n/**\n * Clear config cache (for testing or after config changes)\n */\nexport function clearConfigCache(): void {\n configCache.clear();\n occurrenceCache.clear();\n}\n","/**\n * Autonomy Configuration Types\n * \n * Controls how autonomous Trie behaves:\n * - Auto-check: Run full checks when issues detected\n * - Auto-fix: Apply fixes with human confirmation\n * - Push blocking: Block git push on critical issues\n * - Progressive escalation: Escalate based on occurrence count\n */\n\n/**\n * Overall autonomy level\n */\nexport type AutonomyLevel = \n | 'passive' // Only report, never act\n | 'suggest' // Suggest actions, don't execute\n | 'proactive' // Auto-check, ask before fixing\n | 'aggressive'; // Auto-check, auto-fix trivial, block on critical\n\n/**\n * Auto-check configuration\n */\nexport interface AutoCheckConfig {\n /** Enable auto-running full checks */\n enabled: boolean;\n /** Issue count threshold to trigger auto-check */\n threshold: number;\n /** Always trigger on critical issues */\n onCritical: boolean;\n /** Cooldown between auto-checks (ms) */\n cooldownMs: number;\n}\n\n/**\n * Auto-fix configuration\n */\nexport interface AutoFixConfig {\n /** Enable auto-fix suggestions */\n enabled: boolean;\n /** Always ask user before applying fixes (human-in-the-loop) */\n askFirst: boolean;\n /** Categories of fixes to auto-apply */\n categories: ('trivial' | 'safe' | 'moderate' | 'all')[];\n /** Specific fix types to auto-apply */\n allowedFixTypes: string[];\n}\n\n/**\n * Push blocking configuration\n */\nexport interface PushBlockingConfig {\n /** Enable push blocking */\n enabled: boolean;\n /** Allow user to bypass with flag */\n allowBypass: boolean;\n /** Severities that trigger blocking */\n blockOn: ('critical' | 'serious' | 'moderate')[];\n /** Bypass methods */\n bypassMethods: ('env' | 'flag' | 'confirm')[];\n /** Log bypasses for audit */\n logBypasses: boolean;\n}\n\n/**\n * Progressive escalation thresholds\n */\nexport interface ProgressiveEscalationConfig {\n /** Enable progressive escalation */\n enabled: boolean;\n /** Thresholds for different actions */\n thresholds: {\n /** First occurrence: suggest fix */\n suggest: number;\n /** N occurrences: auto-run full check */\n autoCheck: number;\n /** N occurrences: escalate to Slack/email */\n escalate: number;\n /** N occurrences: block until fixed */\n block: number;\n };\n /** Time window for counting occurrences (ms) */\n windowMs: number;\n}\n\n/**\n * Full autonomy configuration\n */\nexport interface AutonomyConfig {\n /** Overall autonomy level (can be overridden by specific settings) */\n level: AutonomyLevel;\n /** Auto-check settings */\n autoCheck: AutoCheckConfig;\n /** Auto-fix settings */\n autoFix: AutoFixConfig;\n /** Push blocking settings */\n pushBlocking: PushBlockingConfig;\n /** Progressive escalation settings */\n progressiveEscalation: ProgressiveEscalationConfig;\n}\n\n/**\n * Default autonomy configuration - proactive but safe\n */\nexport const DEFAULT_AUTONOMY_CONFIG: AutonomyConfig = {\n level: 'proactive',\n autoCheck: {\n enabled: true,\n threshold: 5,\n onCritical: true,\n cooldownMs: 30000, // 30 seconds\n },\n autoFix: {\n enabled: true,\n askFirst: true, // Always ask (human-in-the-loop)\n categories: ['trivial', 'safe'],\n allowedFixTypes: [\n 'remove-console-log',\n 'remove-unused-import',\n 'add-missing-await',\n 'fix-typo',\n ],\n },\n pushBlocking: {\n enabled: true,\n allowBypass: true,\n blockOn: ['critical'],\n bypassMethods: ['env', 'flag', 'confirm'],\n logBypasses: true,\n },\n progressiveEscalation: {\n enabled: true,\n thresholds: {\n suggest: 1,\n autoCheck: 3,\n escalate: 5,\n block: 10,\n },\n windowMs: 24 * 60 * 60 * 1000, // 24 hours\n },\n};\n\n/**\n * Issue occurrence tracking for progressive escalation\n */\nexport interface IssueOccurrence {\n /** Issue hash (file + line + type) */\n hash: string;\n /** First seen timestamp */\n firstSeen: number;\n /** Last seen timestamp */\n lastSeen: number;\n /** Total occurrence count */\n count: number;\n /** Current escalation level */\n escalationLevel: 'suggest' | 'autoCheck' | 'escalate' | 'block';\n /** Whether user has been notified at current level */\n notified: boolean;\n /** Whether issue has been bypassed */\n bypassed: boolean;\n /** Bypass history */\n bypassHistory: Array<{\n timestamp: number;\n method: string;\n reason?: string;\n }>;\n}\n\n/**\n * Auto-fix action\n */\nexport interface AutoFixAction {\n /** Unique ID for this fix */\n id: string;\n /** File to fix */\n file: string;\n /** Line number */\n line?: number;\n /** Original code */\n original: string;\n /** Fixed code */\n fixed: string;\n /** Type of fix */\n type: string;\n /** Category of fix */\n category: 'trivial' | 'safe' | 'moderate' | 'risky';\n /** Description of what the fix does */\n description: string;\n /** Confidence in the fix (0-1) */\n confidence: number;\n}\n\n/**\n * Push block result\n */\nexport interface PushBlockResult {\n /** Whether push is blocked */\n blocked: boolean;\n /** Reason for blocking */\n reason?: string;\n /** Issues causing the block */\n blockingIssues: Array<{\n file: string;\n line?: number;\n severity: string;\n issue: string;\n }>;\n /** Bypass instructions */\n bypassInstructions?: string;\n /** Whether user chose to bypass */\n bypassed: boolean;\n /** Bypass method used */\n bypassMethod?: string;\n}\n","import path from 'node:path';\n\nimport { analyzeDiff, type DiffSummary } from './diff-analyzer.js';\nimport {\n getStagedChanges,\n getUncommittedChanges,\n getWorkingTreeDiff,\n type Change\n} from './git.js';\nimport { ContextGraph } from '../context/graph.js';\nimport type { FileNode, FileNodeData } from '../context/nodes.js';\n\nexport interface PerceptionResult {\n staged: Change[];\n unstaged: Change[];\n diffSummary: DiffSummary;\n changeNodeId?: string;\n}\n\nexport async function perceiveCurrentChanges(\n projectPath: string,\n graph?: ContextGraph\n): Promise<PerceptionResult> {\n const ctxGraph = graph ?? new ContextGraph(projectPath);\n\n const [staged, unstaged] = await Promise.all([\n getStagedChanges(projectPath),\n getUncommittedChanges(projectPath)\n ]);\n\n const stagedDiff = await getWorkingTreeDiff(projectPath, true);\n const unstagedDiff = await getWorkingTreeDiff(projectPath, false);\n const combinedDiff = [stagedDiff, unstagedDiff].filter(Boolean).join('\\n');\n const diffSummary = analyzeDiff(combinedDiff);\n\n const filesTouched = new Set<string>();\n staged.forEach((c) => filesTouched.add(c.path));\n unstaged.forEach((c) => filesTouched.add(c.path));\n diffSummary.files.forEach((f) => filesTouched.add(f.filePath));\n\n const changeId = await upsertWorkingChange(ctxGraph, Array.from(filesTouched), projectPath);\n\n const result: PerceptionResult = {\n staged,\n unstaged,\n diffSummary\n };\n if (changeId) result.changeNodeId = changeId;\n return result;\n}\n\nasync function upsertWorkingChange(\n graph: ContextGraph,\n files: string[],\n projectPath: string\n): Promise<string | undefined> {\n if (files.length === 0) return undefined;\n\n const now = new Date().toISOString();\n const change = await graph.addNode('change', {\n commitHash: null,\n files,\n message: 'workspace changes',\n diff: null,\n author: null,\n timestamp: now,\n outcome: 'unknown'\n });\n\n for (const filePath of files) {\n const fileNode = await ensureFileNode(graph, filePath, projectPath);\n await graph.addEdge(change.id, fileNode.id, 'affects');\n }\n\n return change.id;\n}\n\nasync function ensureFileNode(\n graph: ContextGraph,\n filePath: string,\n projectPath: string\n): Promise<FileNode> {\n const normalized = path.resolve(projectPath, filePath);\n const existing = await graph.getNode('file', normalized);\n\n const now = new Date().toISOString();\n if (existing) {\n const data = existing.data as FileNodeData;\n await graph.updateNode('file', existing.id, {\n changeCount: (data.changeCount ?? 0) + 1,\n lastChanged: now\n });\n return (await graph.getNode('file', existing.id)) as FileNode;\n }\n\n const data: FileNodeData = {\n path: filePath,\n extension: path.extname(filePath),\n purpose: '',\n riskLevel: 'medium',\n whyRisky: null,\n changeCount: 1,\n lastChanged: now,\n incidentCount: 0,\n createdAt: now\n };\n\n return (await graph.addNode('file', data)) as FileNode;\n}\n","export interface DiffFileSummary {\n filePath: string;\n added: number;\n removed: number;\n functionsModified: string[];\n riskyPatterns: string[];\n}\n\nexport interface DiffSummary {\n files: DiffFileSummary[];\n totalAdded: number;\n totalRemoved: number;\n riskyFiles: string[];\n}\n\nconst RISKY_PATTERNS = [/auth/i, /token/i, /password/i, /secret/i, /validate/i, /sanitize/i];\n\nexport function analyzeDiff(diff: string): DiffSummary {\n const files: DiffFileSummary[] = [];\n let current: DiffFileSummary | null = null;\n\n const lines = diff.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('+++ b/')) {\n const filePath = line.replace('+++ b/', '').trim();\n current = {\n filePath,\n added: 0,\n removed: 0,\n functionsModified: [],\n riskyPatterns: []\n };\n files.push(current);\n continue;\n }\n\n if (!current) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n // Capture function names or signatures in hunk headers\n const match = line.match(/@@.*?(function\\s+([\\w$]+)|class\\s+([\\w$]+)|([\\w$]+\\s*\\())/i);\n const fnName = match?.[2] || match?.[3] || match?.[4];\n if (fnName) {\n current.functionsModified.push(fnName.replace('(', '').trim());\n }\n continue;\n }\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n current.added += 1;\n markRisk(line, current);\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n current.removed += 1;\n markRisk(line, current);\n }\n }\n\n const totalAdded = files.reduce((acc, f) => acc + f.added, 0);\n const totalRemoved = files.reduce((acc, f) => acc + f.removed, 0);\n const riskyFiles = files.filter((f) => f.riskyPatterns.length > 0).map((f) => f.filePath);\n\n return {\n files,\n totalAdded,\n totalRemoved,\n riskyFiles\n };\n}\n\nfunction markRisk(line: string, file: DiffFileSummary): void {\n for (const pattern of RISKY_PATTERNS) {\n if (pattern.test(line)) {\n const label = pattern.toString();\n if (!file.riskyPatterns.includes(label)) {\n file.riskyPatterns.push(label);\n }\n }\n }\n}\n","import path from 'node:path';\n\nimport type { RiskLevel } from '../types/index.js';\nimport type { PatternNode } from '../context/types.js';\nimport type { ContextGraph } from '../context/graph.js';\nimport type { FileNodeData, IncidentNode } from '../context/nodes.js';\n\nexport interface FileRiskResult {\n file: string;\n score: number;\n level: RiskLevel;\n reasons: string[];\n incidents: IncidentNode[];\n matchedPatterns: PatternNode[];\n}\n\nexport interface ChangeRiskResult {\n files: FileRiskResult[];\n overall: RiskLevel;\n score: number;\n shouldEscalate: boolean;\n}\n\nconst BASE_RISK: Record<RiskLevel, number> = {\n low: 10,\n medium: 35,\n high: 65,\n critical: 85\n};\n\nconst SENSITIVE_PATHS: { pattern: RegExp; weight: number; reason: string }[] = [\n { pattern: /auth|login|token|session/i, weight: 20, reason: 'touches authentication' },\n { pattern: /payment|billing|stripe|paypal|checkout/i, weight: 25, reason: 'touches payments' },\n { pattern: /secret|credential|env|config\\/security/i, weight: 15, reason: 'touches secrets/security config' },\n { pattern: /gdpr|privacy|pii|phi/i, weight: 15, reason: 'touches sensitive data' }\n];\n\nfunction levelFromScore(score: number): RiskLevel {\n if (score >= 90) return 'critical';\n if (score >= 65) return 'high';\n if (score >= 40) return 'medium';\n return 'low';\n}\n\nexport async function scoreFile(\n graph: ContextGraph,\n filePath: string,\n matchedPatterns: PatternNode[] = []\n): Promise<FileRiskResult> {\n const reasons: string[] = [];\n const normalized = path.resolve(graph.projectRoot, filePath);\n const node = await graph.getNode('file', normalized);\n const incidents = await graph.getIncidentsForFile(filePath);\n\n let score = 10;\n const data = node?.data as FileNodeData | undefined;\n\n if (data) {\n score = BASE_RISK[data.riskLevel] ?? score;\n reasons.push(`baseline ${data.riskLevel}`);\n\n if (data.incidentCount > 0) {\n const incBoost = Math.min(data.incidentCount * 12, 36);\n score += incBoost;\n reasons.push(`historical incidents (+${incBoost})`);\n }\n\n if (data.changeCount > 5) {\n const changeBoost = Math.min((data.changeCount - 5) * 2, 12);\n score += changeBoost;\n reasons.push(`frequent changes (+${changeBoost})`);\n }\n\n if (data.lastChanged) {\n const lastChanged = new Date(data.lastChanged).getTime();\n const days = (Date.now() - lastChanged) / (1000 * 60 * 60 * 24);\n if (days > 60 && data.incidentCount === 0) {\n score -= 5;\n reasons.push('stable for 60d (-5)');\n }\n }\n }\n\n for (const { pattern, weight, reason } of SENSITIVE_PATHS) {\n if (pattern.test(filePath)) {\n score += weight;\n reasons.push(reason);\n }\n }\n\n if (matchedPatterns.length > 0) {\n const patternBoost = Math.min(\n matchedPatterns.reduce((acc, p) => acc + (p.data.confidence ?? 50) / 10, 0),\n 20\n );\n score += patternBoost;\n reasons.push(`pattern match (+${Math.round(patternBoost)})`);\n }\n\n if (incidents.length > 0) {\n const timestamps = incidents\n .map((i) => new Date(i.data.timestamp).getTime())\n .sort((a, b) => b - a);\n const recent = timestamps[0]!;\n const daysSince = (Date.now() - recent) / (1000 * 60 * 60 * 24);\n if (daysSince > 90) {\n score -= 5;\n reasons.push('no incidents in 90d (-5)');\n } else {\n score += 8;\n reasons.push('recent incident (+8)');\n }\n }\n\n const level = levelFromScore(score);\n return {\n file: filePath,\n score,\n level,\n reasons,\n incidents,\n matchedPatterns\n };\n}\n\nexport async function scoreChangeSet(\n graph: ContextGraph,\n files: string[],\n patternMatches: Record<string, PatternNode[]> = {}\n): Promise<ChangeRiskResult> {\n const fileResults: FileRiskResult[] = [];\n\n for (const file of files) {\n const patterns = patternMatches[file] ?? [];\n fileResults.push(await scoreFile(graph, file, patterns));\n }\n\n // Aggregate: use max file score, but boost if many files touched\n const maxScore = Math.max(...fileResults.map((f) => f.score), 10);\n const spreadBoost = files.length > 5 ? Math.min((files.length - 5) * 2, 10) : 0;\n const overallScore = maxScore + spreadBoost;\n const overall = levelFromScore(overallScore);\n\n const shouldEscalate = overall === 'critical' || overall === 'high';\n\n return {\n files: fileResults,\n overall,\n score: overallScore,\n shouldEscalate\n };\n}\n","import { ContextGraph } from '../context/graph.js';\nimport type { PatternNode } from '../context/nodes.js';\n\nexport interface PatternMatch {\n file: string;\n pattern: PatternNode;\n confidence: number;\n isAntiPattern: boolean;\n}\n\nexport async function matchPatternsForFiles(\n graph: ContextGraph,\n files: string[]\n): Promise<{ matches: PatternMatch[]; byFile: Record<string, PatternNode[]> }> {\n const matches: PatternMatch[] = [];\n const byFile: Record<string, PatternNode[]> = {};\n\n for (const file of files) {\n const patterns = await graph.getPatternsForFile(file);\n if (patterns.length === 0) continue;\n\n byFile[file] = patterns;\n\n for (const pattern of patterns) {\n matches.push({\n file,\n pattern,\n confidence: pattern.data.confidence,\n isAntiPattern: pattern.data.isAntiPattern\n });\n }\n }\n\n return { matches, byFile };\n}\n","import { ContextGraph } from '../context/graph.js';\nimport type { IncidentNode, PatternNode } from '../context/nodes.js';\nimport type { RiskLevel, AgentResult, CodeContext, ScanContext } from '../types/index.js';\nimport { scoreChangeSet, type ChangeRiskResult, type FileRiskResult } from './risk-scorer.js';\nimport { matchPatternsForFiles } from './pattern-matcher.js';\nimport { Triager } from '../orchestrator/triager.js';\nimport { Executor } from '../orchestrator/executor.js';\n\nexport interface Reasoning {\n riskLevel: RiskLevel;\n shouldBlock: boolean;\n explanation: string;\n relevantIncidents: IncidentNode[];\n matchedPatterns: PatternNode[];\n recommendation: string;\n files: FileRiskResult[];\n agentResults?: AgentResult[];\n}\n\nexport interface ReasonOptions {\n runAgents?: boolean;\n codeContext?: CodeContext;\n scanContext?: Partial<ScanContext>;\n}\n\nfunction buildDefaultCodeContext(): CodeContext {\n return {\n changeType: 'general',\n isNewFeature: false,\n touchesUserData: false,\n touchesAuth: false,\n touchesPayments: false,\n touchesDatabase: false,\n touchesAPI: false,\n touchesUI: false,\n touchesHealthData: false,\n touchesSecurityConfig: false,\n linesChanged: 50,\n filePatterns: [],\n framework: 'unknown',\n language: 'typescript',\n touchesCrypto: false,\n touchesFileSystem: false,\n touchesThirdPartyAPI: false,\n touchesLogging: false,\n touchesErrorHandling: false,\n hasTests: false,\n complexity: 'medium',\n patterns: {\n hasAsyncCode: false,\n hasFormHandling: false,\n hasFileUploads: false,\n hasEmailHandling: false,\n hasRateLimiting: false,\n hasWebSockets: false,\n hasCaching: false,\n hasQueue: false\n }\n };\n}\n\nfunction buildExplanation(result: ChangeRiskResult): string {\n const top = [...result.files].sort((a, b) => b.score - a.score)[0];\n if (!top) return `Risk level ${result.overall} (no files provided)`;\n return `Risk level ${result.overall} because ${top.file} ${top.reasons.join(', ')}`;\n}\n\nfunction buildRecommendation(risk: RiskLevel, hasAntiPattern: boolean): string {\n if (hasAntiPattern || risk === 'critical') {\n return 'Block until reviewed: address anti-patterns and rerun targeted tests.';\n }\n if (risk === 'high') {\n return 'Require senior review and run full test suite before merge.';\n }\n if (risk === 'medium') {\n return 'Proceed with caution; run impacted tests and sanity checks.';\n }\n return 'Low risk; proceed but keep an eye on recent changes.';\n}\n\nexport async function reasonAboutChanges(\n projectPath: string,\n files: string[],\n options: ReasonOptions = {}\n): Promise<Reasoning> {\n const graph = new ContextGraph(projectPath);\n const { matches, byFile } = await matchPatternsForFiles(graph, files);\n const changeRisk = await scoreChangeSet(graph, files, byFile);\n\n const incidents: IncidentNode[] = [];\n for (const file of files) {\n const fileIncidents = await graph.getIncidentsForFile(file);\n incidents.push(...fileIncidents);\n }\n\n const hasAntiPattern = matches.some((m) => m.isAntiPattern);\n const riskLevel: RiskLevel = hasAntiPattern ? 'critical' : changeRisk.overall;\n const shouldBlock = hasAntiPattern || riskLevel === 'critical' || riskLevel === 'high';\n\n const reasoning: Reasoning = {\n riskLevel,\n shouldBlock,\n explanation: buildExplanation(changeRisk),\n relevantIncidents: incidents,\n matchedPatterns: matches.map((m) => m.pattern),\n recommendation: buildRecommendation(riskLevel, hasAntiPattern),\n files: changeRisk.files\n };\n\n if (options.runAgents) {\n const codeContext = options.codeContext ?? buildDefaultCodeContext();\n const triager = new Triager();\n const agents = await triager.selectAgents(codeContext, riskLevel);\n\n if (agents.length > 0) {\n const executor = new Executor();\n const scanContext: ScanContext = {\n workingDir: projectPath,\n ...options.scanContext\n };\n if (codeContext.framework) scanContext.framework = codeContext.framework;\n if (codeContext.language) scanContext.language = codeContext.language;\n\n reasoning.agentResults = await executor.executeAgents(agents, files, scanContext, {\n parallel: true,\n timeoutMs: options.scanContext?.config?.timeoutMs ?? 60000\n });\n } else {\n reasoning.agentResults = [];\n }\n }\n\n return reasoning;\n}\n\n// Convenience wrapper to keep future CLI/MCP integration simple\nexport async function reasonAboutChangesHumanReadable(\n projectPath: string,\n files: string[],\n options: ReasonOptions = {}\n) {\n const reasoning = await reasonAboutChanges(projectPath, files, options);\n const { humanizeReasoning } = await import('../comprehension/index.js');\n return humanizeReasoning(reasoning);\n}\n","/**\n * Bootstrap File System\n * \n * Manages workspace files that inject context at scan start.\n * Files: BOOTSTRAP.md, RULES.md, TEAM.md\n */\n\nimport { readFile, writeFile, unlink, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { detectStack, type DetectedStack } from './stack-detector.js';\n\nexport interface BootstrapFile {\n name: string;\n path: string;\n type: 'user' | 'auto' | 'one-time';\n exists: boolean;\n content?: string;\n}\n\nexport interface BootstrapContext {\n files: BootstrapFile[];\n injectedContent: string;\n needsBootstrap: boolean;\n}\n\ninterface BootstrapFileSpec {\n name: string;\n type: 'user' | 'auto' | 'one-time';\n description: string;\n}\n\nconst BOOTSTRAP_FILES: BootstrapFileSpec[] = [\n { name: 'PROJECT.md', type: 'user', description: 'Project overview and conventions' },\n { name: 'RULES.md', type: 'user', description: 'Coding standards agents enforce' },\n { name: 'TEAM.md', type: 'user', description: 'Team ownership and escalation' },\n { name: 'BOOTSTRAP.md', type: 'one-time', description: 'First-run setup (deleted after)' },\n { name: 'AGENTS.md', type: 'auto', description: 'Auto-generated scan context' },\n];\n\n/**\n * Load bootstrap files and inject into agent context\n */\nexport async function loadBootstrapContext(workDir?: string): Promise<BootstrapContext> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(projectDir);\n const files: BootstrapFile[] = [];\n const contentParts: string[] = [];\n let needsBootstrap = false;\n\n for (const file of BOOTSTRAP_FILES) {\n const filePath = join(trieDir, file.name);\n const exists = existsSync(filePath);\n \n if (file.name === 'BOOTSTRAP.md' && exists) {\n needsBootstrap = true;\n }\n \n let content: string | undefined;\n if (exists) {\n try {\n content = await readFile(filePath, 'utf-8');\n if (content.trim() && file.type !== 'one-time') {\n contentParts.push(`<!-- ${file.name} -->\\n${content}`);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n\n const fileEntry: BootstrapFile = {\n name: file.name,\n path: filePath,\n type: file.type,\n exists,\n };\n if (content) fileEntry.content = content;\n files.push(fileEntry);\n }\n\n return {\n files,\n injectedContent: contentParts.join('\\n\\n---\\n\\n'),\n needsBootstrap,\n };\n}\n\n/**\n * Initialize bootstrap files for a new project\n */\nexport async function initializeBootstrapFiles(options: {\n workDir?: string;\n force?: boolean;\n skipBootstrap?: boolean;\n} = {}): Promise<{ created: string[]; skipped: string[]; stack: DetectedStack }> {\n const projectDir = options.workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(projectDir);\n await mkdir(trieDir, { recursive: true });\n\n const created: string[] = [];\n const skipped: string[] = [];\n\n const stack = await detectStack(projectDir);\n\n for (const file of BOOTSTRAP_FILES) {\n const filePath = join(trieDir, file.name);\n const exists = existsSync(filePath);\n\n if (exists && !options.force) {\n skipped.push(file.name);\n continue;\n }\n\n if (file.name === 'BOOTSTRAP.md' && options.skipBootstrap) {\n skipped.push(file.name);\n continue;\n }\n\n if (file.name === 'AGENTS.md') {\n skipped.push(file.name);\n continue;\n }\n\n const template = getFileTemplate(file.name, stack);\n if (template) {\n await writeFile(filePath, template);\n created.push(file.name);\n }\n }\n\n return { created, skipped, stack };\n}\n\n/**\n * Mark bootstrap as complete (delete BOOTSTRAP.md)\n */\nexport async function completeBootstrap(workDir?: string): Promise<boolean> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const bootstrapPath = join(getTrieDirectory(projectDir), 'BOOTSTRAP.md');\n\n try {\n await unlink(bootstrapPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if bootstrap is needed (BOOTSTRAP.md exists)\n */\nexport function needsBootstrap(workDir?: string): boolean {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const bootstrapPath = join(getTrieDirectory(projectDir), 'BOOTSTRAP.md');\n return existsSync(bootstrapPath);\n}\n\n/**\n * Get rules from RULES.md\n */\nexport async function loadRules(workDir?: string): Promise<string | null> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const rulesPath = join(getTrieDirectory(projectDir), 'RULES.md');\n \n try {\n if (existsSync(rulesPath)) {\n return await readFile(rulesPath, 'utf-8');\n }\n } catch {\n // Rules file doesn't exist or can't be read\n }\n \n return null;\n}\n\n/**\n * Get team info from TEAM.md\n */\nexport async function loadTeamInfo(workDir?: string): Promise<string | null> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const teamPath = join(getTrieDirectory(projectDir), 'TEAM.md');\n \n try {\n if (existsSync(teamPath)) {\n return await readFile(teamPath, 'utf-8');\n }\n } catch {\n // Team file doesn't exist or can't be read\n }\n \n return null;\n}\n\nfunction getFileTemplate(fileName: string, stack: DetectedStack): string | null {\n switch (fileName) {\n case 'PROJECT.md':\n return getProjectTemplate(stack);\n case 'RULES.md':\n return getRulesTemplate(stack);\n case 'TEAM.md':\n return getTeamTemplate();\n case 'BOOTSTRAP.md':\n return getBootstrapTemplate(stack);\n default:\n return null;\n }\n}\n\nfunction getProjectTemplate(stack: DetectedStack): string {\n const lines: string[] = ['# Project Overview', '', '> Define your project context here. AI assistants read this first.', ''];\n \n lines.push('## Description', '', '[Describe what this project does and who it\\'s for]', '');\n \n lines.push('## Technology Stack', '');\n if (stack.framework) lines.push(`- **Framework:** ${stack.framework}`);\n if (stack.language) lines.push(`- **Language:** ${stack.language}`);\n if (stack.database) lines.push(`- **Database:** ${stack.database}`);\n if (stack.auth) lines.push(`- **Auth:** ${stack.auth}`);\n if (!stack.framework && !stack.language && !stack.database) {\n lines.push('[Add your technology stack]');\n }\n lines.push('');\n \n lines.push('## Architecture', '', '[Key patterns and design decisions]', '');\n lines.push('## Coding Conventions', '', '[Style rules agents should follow]', '');\n lines.push('## AI Instructions', '', 'When working on this project:', '1. [Instruction 1]', '2. [Instruction 2]', '3. [Instruction 3]', '');\n lines.push('---', '', '*Edit this file to provide project context to AI assistants.*');\n \n return lines.join('\\n');\n}\n\nfunction getRulesTemplate(stack: DetectedStack): string {\n const packageManager = stack.packageManager || 'npm';\n \n return `# Project Rules\n\n> These rules are enforced by Trie agents during scans.\n> Violations appear as issues with [RULES] prefix.\n\n## Code Style\n\n1. Use named exports, not default exports\n2. Prefer \\`${packageManager}\\` for package management\n3. Maximum file length: 300 lines\n4. Use TypeScript strict mode\n\n## Testing Requirements\n\n1. Critical paths require unit tests\n2. API endpoints require integration tests\n3. Minimum coverage: 70%\n\n## Security Rules\n\n1. Never log sensitive data (passwords, tokens, PII)\n2. All API routes require authentication\n3. Rate limiting required on public endpoints\n4. SQL queries must use parameterized statements\n\n## Review Requirements\n\n1. All PRs require at least 1 reviewer\n2. Security-sensitive changes require security review\n3. Database migrations require review\n\n---\n\n*Edit this file to define your project's coding standards.*\n`;\n}\n\nfunction getTeamTemplate(): string {\n return `# Team Structure\n\n## Code Ownership\n\n| Area | Owner | Backup | Review Required |\n|------|-------|--------|-----------------|\n| \\`/src/api/\\` | @backend-team | - | 1 approver |\n| \\`/src/ui/\\` | @frontend-team | - | 1 approver |\n| \\`/src/auth/\\` | @security-team | - | Security review |\n\n## Escalation\n\n| Severity | First Contact | Escalate To | SLA |\n|----------|--------------|-------------|-----|\n| Critical | Team lead | CTO | 1 hour |\n| Serious | PR reviewer | Team lead | 4 hours |\n| Moderate | Self-serve | - | 1 day |\n\n## Contacts\n\n- **Security:** [email/slack]\n- **Privacy:** [email/slack]\n- **Emergencies:** [phone/pager]\n\n---\n\n*Edit this file to define your team structure.*\n`;\n}\n\nfunction getBootstrapTemplate(stack: DetectedStack): string {\n const skillCommands = stack.suggestedSkills\n .map(s => `trie skills add ${s}`)\n .join('\\n');\n\n const agentList = stack.suggestedAgents.join(', ');\n\n const lines: string[] = [\n '# Trie Bootstrap Checklist',\n '',\n 'This file guides your first scan setup. **Delete when complete.**',\n '',\n '## Auto-Detected Stack',\n '',\n 'Based on your project, Trie detected:',\n ];\n \n if (stack.framework) lines.push(`- **Framework:** ${stack.framework}`);\n if (stack.language) lines.push(`- **Language:** ${stack.language}`);\n if (stack.database) lines.push(`- **Database:** ${stack.database}`);\n if (stack.auth) lines.push(`- **Auth:** ${stack.auth}`);\n \n lines.push('', '## Recommended Actions', '', '### 1. Skills to Install', 'Based on your stack, consider installing:', '```bash');\n lines.push(skillCommands || '# No specific skills detected - browse https://skills.sh');\n lines.push('```', '', '### 2. Agents to Enable', `Your stack suggests these agents: ${agentList || 'security, privacy, bugs'}`, '');\n lines.push('### 3. Configure Rules', 'Add your coding standards to `.trie/RULES.md`.', '');\n lines.push('### 4. Run First Scan', '```bash', 'trie scan', '```', '');\n lines.push('---', '', '**Delete this file after completing setup.** Run:', '```bash', 'rm .trie/BOOTSTRAP.md', '```');\n \n return lines.join('\\n');\n}\n","export class TrieError extends Error {\n code: string;\n recoverable: boolean;\n userMessage: string;\n\n constructor(message: string, code: string, userMessage: string, recoverable = true) {\n super(message);\n this.code = code;\n this.recoverable = recoverable;\n this.userMessage = userMessage;\n }\n}\n\nexport class GraphError extends TrieError {\n constructor(message: string) {\n super(\n message,\n 'GRAPH_ERROR',\n 'Trie had trouble accessing its memory. Try again or re-run trie reconcile.',\n true\n );\n }\n}\n\nexport class GitError extends TrieError {\n constructor(message: string) {\n super(\n message,\n 'GIT_ERROR',\n 'Git info is unavailable. Is this a git repo? Commit once, or pass --files to trie check.',\n true\n );\n }\n}\n\nexport class NetworkError extends TrieError {\n constructor(message: string) {\n super(\n message,\n 'NETWORK_ERROR',\n 'Network unavailable. Running in offline mode; AI calls skipped.',\n true\n );\n }\n}\n\nexport class MissingAPIKeyError extends TrieError {\n constructor(message = 'Missing ANTHROPIC_API_KEY') {\n super(\n message,\n 'MISSING_API_KEY',\n 'No API key detected. Set ANTHROPIC_API_KEY for AI-powered analysis (deeper issue detection, smarter fixes). Running in pattern-only mode.',\n true\n );\n }\n}\n\nexport function formatFriendlyError(error: unknown): { userMessage: string; code: string } {\n if (error instanceof TrieError) {\n return { userMessage: error.userMessage, code: error.code };\n }\n return {\n userMessage: 'Something went wrong. Try again or run with --offline.',\n code: 'UNKNOWN'\n };\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nimport { ContextGraph } from './graph.js';\nimport type { ContextSnapshot } from './types.js';\n\nconst DEFAULT_JSON_NAME = 'context.json';\n\nexport async function exportToJson(graph: ContextGraph, targetPath?: string): Promise<string> {\n const snapshot = await graph.getSnapshot();\n const json = JSON.stringify(snapshot, null, 2);\n\n const outputPath = targetPath ?? path.join(getTrieDirectory(graph.projectRoot), DEFAULT_JSON_NAME);\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, json, 'utf8');\n\n return json;\n}\n\nexport async function importFromJson(\n graph: ContextGraph,\n json: string,\n sourcePath?: string\n): Promise<void> {\n const payload =\n json.trim().length > 0\n ? json\n : await fs.readFile(sourcePath ?? path.join(getTrieDirectory(graph.projectRoot), DEFAULT_JSON_NAME), 'utf8');\n\n const snapshot = JSON.parse(payload) as ContextSnapshot;\n await graph.applySnapshot(snapshot);\n}\n","import path from 'node:path';\n\nimport type { IncidentNode } from './nodes.js';\nimport type { ContextGraph } from './graph.js';\nimport { FilePathTrie, type IncidentMetadata } from './file-trie.js';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nexport interface IncidentIndexOptions {\n persistPath?: string;\n}\n\nexport class IncidentIndex {\n private readonly graph: ContextGraph;\n private readonly trie: FilePathTrie;\n private readonly projectRoot: string;\n\n constructor(graph: ContextGraph, projectRoot: string, options?: IncidentIndexOptions) {\n this.graph = graph;\n this.projectRoot = projectRoot;\n this.trie = new FilePathTrie(\n options?.persistPath ?? path.join(getTrieDirectory(projectRoot), 'incident-trie.json')\n );\n }\n\n static async build(graph: ContextGraph, projectRoot: string, options?: IncidentIndexOptions): Promise<IncidentIndex> {\n const index = new IncidentIndex(graph, projectRoot, options);\n await index.rebuild();\n return index;\n }\n\n async rebuild(): Promise<void> {\n const nodes = await this.graph.listNodes();\n const incidents = nodes.filter((n) => n.type === 'incident') as IncidentNode[];\n\n for (const incident of incidents) {\n const files = await this.getFilesForIncident(incident.id);\n this.addIncidentToTrie(incident, files);\n }\n }\n\n addIncidentToTrie(incident: IncidentNode, files: string[]): void {\n const meta: IncidentMetadata = {\n id: incident.id,\n file: '',\n description: incident.data.description,\n severity: incident.data.severity,\n timestamp: incident.data.timestamp,\n };\n\n for (const file of files) {\n const normalized = this.normalizePath(file);\n this.trie.addIncident(normalized, { ...meta, file: normalized });\n }\n }\n\n getFileTrie(): FilePathTrie {\n return this.trie;\n }\n\n private async getFilesForIncident(incidentId: string): Promise<string[]> {\n const files = new Set<string>();\n const edges = await this.graph.getEdges(incidentId, 'both');\n\n // Traverse connected changes to pull file lists\n for (const edge of edges) {\n if (edge.type === 'causedBy' || edge.type === 'leadTo') {\n // Identify the change node id regardless of direction\n const changeId = edge.type === 'causedBy' ? edge.to_id : edge.from_id;\n const change = await this.graph.getNode('change', changeId);\n if (change?.data && 'files' in change.data && Array.isArray(change.data.files)) {\n (change.data.files as string[]).forEach((f: string) => files.add(f));\n }\n }\n\n // If there are direct file links, capture them as well\n if (edge.type === 'affects') {\n const fileNode =\n (await this.graph.getNode('file', edge.to_id)) ||\n (await this.graph.getNode('file', edge.from_id));\n if (fileNode && typeof (fileNode as any).data?.path === 'string') {\n files.add((fileNode as any).data.path);\n }\n }\n }\n\n return Array.from(files);\n }\n\n private normalizePath(filePath: string): string {\n const absolute = path.isAbsolute(filePath) ? filePath : path.join(this.projectRoot, filePath);\n const relative = path.relative(this.projectRoot, absolute);\n return relative.replace(/\\\\/g, '/');\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { Trie } from '../trie/trie.js';\n\nexport interface IncidentMetadata {\n id: string;\n file: string;\n description: string;\n severity: 'minor' | 'major' | 'critical' | string;\n timestamp: string;\n}\n\nexport interface HotZone {\n path: string;\n incidentCount: number;\n confidence: number;\n}\n\nfunction normalizePath(filePath: string): string {\n const normalized = filePath.replace(/\\\\/g, '/');\n return normalized.startsWith('./') ? normalized.slice(2) : normalized;\n}\n\nexport class FilePathTrie {\n private trie: Trie<IncidentMetadata[]> = new Trie();\n private persistPath?: string;\n\n constructor(persistPath?: string) {\n if (persistPath) this.persistPath = persistPath;\n if (persistPath && fs.existsSync(persistPath)) {\n try {\n const raw = fs.readFileSync(persistPath, 'utf-8');\n if (raw.trim().length > 0) {\n const json = JSON.parse(raw);\n this.trie = Trie.fromJSON<IncidentMetadata[]>(json);\n }\n } catch {\n this.trie = new Trie();\n }\n }\n }\n\n addIncident(filePath: string, incident: IncidentMetadata): void {\n const key = normalizePath(filePath);\n const existing = this.trie.search(key);\n const incidents = existing.found && Array.isArray(existing.value) ? existing.value : [];\n incidents.push(incident);\n this.trie.insert(key, incidents);\n this.persist();\n }\n\n getIncidents(filePath: string): IncidentMetadata[] {\n const key = normalizePath(filePath);\n const result = this.trie.search(key);\n return result.found && Array.isArray(result.value) ? result.value : [];\n }\n\n getDirectoryIncidents(prefix: string): IncidentMetadata[] {\n const normalizedPrefix = normalizePath(prefix);\n const matches = this.trie.getWithPrefix(normalizedPrefix);\n return matches.flatMap((m) => (Array.isArray(m.value) ? m.value : [])).filter(Boolean);\n }\n\n getHotZones(threshold: number): HotZone[] {\n const matches = this.trie.getWithPrefix('');\n const zones: HotZone[] = [];\n\n for (const match of matches) {\n const incidents = Array.isArray(match.value) ? match.value : [];\n if (incidents.length >= threshold) {\n zones.push({\n path: match.pattern,\n incidentCount: incidents.length,\n confidence: this.calculateConfidence(incidents.length),\n });\n }\n }\n\n return zones.sort((a, b) => b.incidentCount - a.incidentCount);\n }\n\n suggestPaths(partial: string, limit = 5): Array<{ path: string; incidentCount: number }> {\n const normalized = normalizePath(partial);\n const results = this.trie.getWithPrefix(normalized);\n return results\n .map((r) => ({\n path: r.pattern,\n incidentCount: Array.isArray(r.value) ? r.value.length : 0,\n }))\n .sort((a, b) => b.incidentCount - a.incidentCount)\n .slice(0, limit);\n }\n\n timeLookup(path: string): number {\n const start = performance.now();\n this.getIncidents(path);\n return performance.now() - start;\n }\n\n toJSON(): object {\n return this.trie.toJSON();\n }\n\n private calculateConfidence(count: number): number {\n const capped = Math.min(count, 10);\n return Math.round((capped / 10) * 100) / 100; // 0-1 scale\n }\n\n private persist(): void {\n if (!this.persistPath) return;\n try {\n const dir = path.dirname(this.persistPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.persistPath, JSON.stringify(this.trie.toJSON()), 'utf-8');\n } catch {\n // Persistence is best-effort; ignore failures\n }\n }\n}\n","/**\n * Lightweight Bayesian-style confidence updater.\n * Treats confidence as probability in [0,1].\n */\n\nexport function bayesianUpdate(prior: number, evidence: number, weight = 1): number {\n const p = clamp(prior);\n const e = clamp(evidence);\n const w = Math.max(0, weight);\n // Blend prior with evidence weighted by w\n const posterior = (p * (1 - w)) + (e * w);\n return clamp(posterior);\n}\n\nexport function adjustConfidence(current: number, outcome: 'positive' | 'negative', step = 0.1): number {\n const delta = outcome === 'positive' ? step : -step;\n return clamp(current + delta);\n}\n\nfunction clamp(value: number): number {\n if (Number.isNaN(value)) return 0.5;\n return Math.min(1, Math.max(0, value));\n}\n","import { IncidentIndex } from '../context/incident-index.js';\nimport type { ContextGraph } from '../context/graph.js';\nimport type { ChangeNode, IncidentNode } from '../context/nodes.js';\n\nexport interface HotPattern {\n type: 'file' | 'directory';\n path: string;\n incidentCount: number;\n confidence: number;\n relatedFiles?: string[];\n}\n\nexport interface CoOccurrencePattern {\n files: [string, string];\n coOccurrences: number;\n confidence: number;\n}\n\nexport class TriePatternDiscovery {\n constructor(\n private graph: ContextGraph,\n private incidentIndex: IncidentIndex\n ) {}\n\n discoverHotPatterns(threshold = 3): HotPattern[] {\n const trie = this.incidentIndex.getFileTrie();\n const hotZones = trie.getHotZones(threshold);\n\n return hotZones.map((zone) => ({\n type: zone.path.endsWith('/') ? 'directory' : 'file',\n path: zone.path,\n incidentCount: zone.incidentCount,\n confidence: zone.confidence,\n relatedFiles: trie.getDirectoryIncidents(zone.path).map((i) => i.file)\n }));\n }\n\n async discoverCoOccurrences(minCount = 3): Promise<CoOccurrencePattern[]> {\n const incidents = await this.getAllIncidents();\n const coOccurrences: Map<string, Map<string, number>> = new Map();\n\n for (const inc of incidents) {\n const files = await this.getFilesForIncident(inc);\n for (let i = 0; i < files.length; i++) {\n for (let j = i + 1; j < files.length; j++) {\n const a = files[i]!;\n const b = files[j]!;\n if (!coOccurrences.has(a)) coOccurrences.set(a, new Map());\n const counts = coOccurrences.get(a)!;\n counts.set(b, (counts.get(b) || 0) + 1);\n }\n }\n }\n\n const patterns: CoOccurrencePattern[] = [];\n for (const [a, map] of coOccurrences.entries()) {\n for (const [b, count] of map.entries()) {\n if (count >= minCount) {\n const denom = Math.min(\n this.incidentIndex.getFileTrie().getIncidents(a).length || 1,\n this.incidentIndex.getFileTrie().getIncidents(b).length || 1\n );\n patterns.push({\n files: [a, b],\n coOccurrences: count,\n confidence: Math.min(1, count / denom)\n });\n }\n }\n }\n\n return patterns.sort((x, y) => y.confidence - x.confidence);\n }\n\n private async getAllIncidents(): Promise<IncidentNode[]> {\n const nodes = await this.graph.listNodes();\n return nodes.filter((n) => n.type === 'incident') as IncidentNode[];\n }\n\n private async getFilesForIncident(incident: IncidentNode): Promise<string[]> {\n const files = new Set<string>();\n const edges = await this.graph.getEdges(incident.id, 'both');\n\n for (const edge of edges) {\n if (edge.type === 'causedBy' || edge.type === 'leadTo') {\n const changeId = edge.type === 'causedBy' ? edge.to_id : edge.from_id;\n const change = await this.graph.getNode('change', changeId) as ChangeNode | null;\n if (change?.data?.files && Array.isArray(change.data.files)) {\n change.data.files.forEach((f: string) => files.add(f));\n }\n }\n }\n\n return Array.from(files).map((f) => f.replace(/\\\\/g, '/'));\n }\n}\n","import { ContextGraph } from '../context/graph.js';\nimport type { IncidentNode, PatternNode } from '../context/nodes.js';\nimport { IncidentIndex } from '../context/incident-index.js';\nimport { adjustConfidence } from './confidence.js';\nimport { TriePatternDiscovery } from './pattern-discovery.js';\n\nexport class LearningSystem {\n private incidentIndex: IncidentIndex;\n private discovery: TriePatternDiscovery;\n\n constructor(private graph: ContextGraph, projectPath: string) {\n this.incidentIndex = new IncidentIndex(graph, projectPath);\n this.discovery = new TriePatternDiscovery(graph, this.incidentIndex);\n }\n\n async onWarningHeeded(files: string[]): Promise<void> {\n await this.adjustPatterns(files, 'positive');\n }\n\n async onWarningIgnored(files: string[]): Promise<void> {\n await this.adjustPatterns(files, 'negative');\n }\n\n async onIncidentReported(incidentId: string, files: string[]): Promise<void> {\n const incident = await this.graph.getNode('incident', incidentId);\n if (incident && incident.type === 'incident') {\n this.incidentIndex.addIncidentToTrie(incident as IncidentNode, files);\n }\n await this.discoverAndStorePatterns();\n }\n\n async onFeedback(helpful: boolean, files: string[] = []): Promise<void> {\n await this.adjustPatterns(files, helpful ? 'positive' : 'negative');\n }\n\n private async adjustPatterns(files: string[], outcome: 'positive' | 'negative'): Promise<void> {\n if (!files.length) return;\n for (const file of files) {\n const patterns = await this.graph.getPatternsForFile(file);\n await Promise.all(patterns.map((p) => this.updatePatternConfidence(p, outcome)));\n }\n }\n\n private async updatePatternConfidence(pattern: PatternNode, outcome: 'positive' | 'negative'): Promise<void> {\n const current = pattern.data.confidence ?? 0.5;\n const updated = adjustConfidence(current, outcome, 0.05);\n await this.graph.updateNode('pattern', pattern.id, { confidence: updated, lastSeen: new Date().toISOString() });\n }\n\n private async discoverAndStorePatterns(): Promise<void> {\n const hotPatterns = this.discovery.discoverHotPatterns();\n for (const hot of hotPatterns) {\n await this.graph.addNode('pattern', {\n description: `${hot.type === 'directory' ? 'Directory' : 'File'} hot zone: ${hot.path}`,\n appliesTo: [hot.path],\n confidence: hot.confidence,\n occurrences: hot.incidentCount,\n firstSeen: new Date().toISOString(),\n lastSeen: new Date().toISOString(),\n isAntiPattern: true,\n source: 'local'\n });\n }\n }\n}\n","import { getRecentCommits, getDiff } from '../agent/git.js';\nimport { storeIssues } from '../memory/issue-store.js';\nimport { scanForVulnerabilities } from '../trie/vulnerability-signatures.js';\nimport { scanForVibeCodeIssues } from '../trie/vibe-code-signatures.js';\nimport type { Issue } from '../types/index.js';\nimport { ContextGraph } from '../context/graph.js';\nimport type { DecisionNodeData } from '../context/nodes.js';\nimport { LearningSystem } from '../agent/learning.js';\nimport path from 'node:path';\n\nexport interface LearningResult {\n learned: number;\n source: 'git-history' | 'manual-feedback';\n}\n\nexport class LearningEngine {\n private readonly projectPath: string;\n private readonly graph: ContextGraph;\n private readonly learningSystem: LearningSystem;\n\n constructor(projectPath: string, graph?: ContextGraph) {\n this.projectPath = projectPath;\n this.graph = graph || new ContextGraph(projectPath);\n this.learningSystem = new LearningSystem(this.graph, projectPath);\n }\n\n /**\n * Unified learning method: Scans history AND processes manual feedback\n */\n async learn(options: { \n limit?: number; \n manualFeedback?: { helpful: boolean; files: string[]; note?: string } \n } = {}): Promise<LearningResult[]> {\n const results: LearningResult[] = [];\n\n // 1. Implicit Learning from Git History\n if (!options.manualFeedback) {\n const implicitCount = await this.learnFromHistory(options.limit || 20);\n results.push({ learned: implicitCount, source: 'git-history' });\n }\n\n // 2. Manual Feedback Learning\n if (options.manualFeedback) {\n await this.recordManualFeedback(\n options.manualFeedback.helpful, \n options.manualFeedback.files, \n options.manualFeedback.note\n );\n results.push({ learned: options.manualFeedback.files.length || 1, source: 'manual-feedback' });\n }\n\n return results;\n }\n\n /**\n * Scan recent commits for implicit failure signals (reverts, fixes)\n */\n private async learnFromHistory(limit: number = 20): Promise<number> {\n const commits = await getRecentCommits(this.projectPath, limit);\n const issuesToStore: Issue[] = [];\n\n for (const commit of commits) {\n const isRevert = commit.message.toLowerCase().includes('revert') || commit.message.startsWith('Revert \"');\n const isFix = /fix(es|ed)?\\s+#\\d+/i.test(commit.message) || commit.message.toLowerCase().includes('bugfix');\n\n if (isRevert || isFix) {\n const type = isRevert ? 'revert' : 'fix';\n const diff = await getDiff(this.projectPath, commit.hash);\n const files = this.extractFilesFromDiff(diff);\n \n for (const file of files) {\n const learnedIssues = await this.extractIssuesFromDiff(diff, file, type, commit.message);\n issuesToStore.push(...learnedIssues);\n }\n }\n }\n\n if (issuesToStore.length > 0) {\n const result = await storeIssues(issuesToStore, path.basename(this.projectPath), this.projectPath);\n return result.stored;\n }\n\n return 0;\n }\n\n /**\n * Record manual feedback (trie ok/bad) and adjust pattern confidence\n */\n private async recordManualFeedback(helpful: boolean, files: string[], note?: string): Promise<void> {\n const context = files[0] ?? 'unspecified';\n const decision = await this.graph.addNode('decision', {\n context,\n decision: helpful ? 'helpful' : 'not helpful',\n reasoning: note ?? null,\n outcome: helpful ? 'good' : 'bad',\n timestamp: new Date().toISOString(),\n } satisfies DecisionNodeData);\n\n if (files.length > 0) {\n for (const file of files) {\n const fileNode = await this.graph.getNode('file', file);\n if (fileNode) {\n await this.graph.addEdge(decision.id, fileNode.id, 'affects');\n }\n }\n await this.learningSystem.onFeedback(helpful, files);\n }\n }\n\n private extractFilesFromDiff(diff: string): string[] {\n const files = new Set<string>();\n const lines = diff.split('\\n');\n for (const line of lines) {\n if (line.startsWith('+++ b/')) {\n files.add(line.slice(6));\n }\n }\n return Array.from(files);\n }\n\n private async extractIssuesFromDiff(diff: string, file: string, type: 'revert' | 'fix', message: string): Promise<Issue[]> {\n const issues: Issue[] = [];\n const badLines = this.getBadLinesFromDiff(diff, file, type);\n const content = badLines.join('\\n');\n\n if (!content) return [];\n\n const vulnerabilities = await scanForVulnerabilities(content, file);\n const vibeIssues = await scanForVibeCodeIssues(content, file);\n\n const allMatches = [...vulnerabilities, ...vibeIssues];\n\n for (const match of allMatches) {\n issues.push({\n id: `implicit-${type}-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n severity: 'serious',\n issue: `Implicit failure detected via ${type}: ${message}. Linked to pattern: ${match.category}`,\n fix: `Review the ${type} commit and avoid this pattern in ${file}.`,\n file: file,\n confidence: 0.7,\n autoFixable: false,\n agent: 'implicit-learning',\n category: match.category\n });\n }\n\n if (issues.length === 0) {\n issues.push({\n id: `implicit-${type}-${Date.now()}`,\n severity: 'moderate',\n issue: `Historical ${type} detected: ${message}`,\n fix: `Review the changes in ${file} from this commit to avoid regression.`,\n file: file,\n confidence: 0.5,\n autoFixable: false,\n agent: 'implicit-learning'\n });\n }\n\n return issues;\n }\n\n private getBadLinesFromDiff(diff: string, file: string, type: 'revert' | 'fix'): string[] {\n const badLines: string[] = [];\n const lines = diff.split('\\n');\n let inTargetFile = false;\n\n for (const line of lines) {\n if (line.startsWith('+++ b/') || line.startsWith('--- a/')) {\n inTargetFile = line.includes(file);\n continue;\n }\n\n if (!inTargetFile) continue;\n\n if (type === 'fix' && line.startsWith('-') && !line.startsWith('---')) {\n badLines.push(line.slice(1));\n } else if (type === 'revert' && line.startsWith('+') && !line.startsWith('+++')) {\n badLines.push(line.slice(1));\n }\n }\n\n return badLines;\n }\n}\n","import { loadConfig } from '../config/loader.js';\nimport { ContextGraph } from '../context/graph.js';\nimport type { LinearTicketNodeData } from '../context/nodes.js';\n\nexport interface LinearTicket {\n id: string;\n identifier: string;\n title: string;\n description: string;\n priority: number;\n status: { name: string };\n assignee?: { name: string };\n labels: { nodes: { name: string }[] };\n createdAt: string;\n updatedAt: string;\n}\n\nexport class LinearIngester {\n private readonly graph: ContextGraph;\n\n constructor(_projectPath: string, graph: ContextGraph) {\n this.graph = graph;\n }\n\n async syncTickets(): Promise<void> {\n const apiKey = await this.getApiKey();\n if (!apiKey) {\n console.warn('Linear API key not found. Run \"trie linear auth <key>\" to enable ticket sync.');\n return;\n }\n\n const tickets = await this.fetchActiveTickets(apiKey);\n for (const ticket of tickets) {\n await this.ingestTicket(ticket);\n }\n }\n\n private async getApiKey(): Promise<string | null> {\n const config = await loadConfig();\n return (config.apiKeys as any)?.linear || process.env.LINEAR_API_KEY || null;\n }\n\n private async fetchActiveTickets(apiKey: string): Promise<LinearTicket[]> {\n const query = `\n query {\n issues(filter: { state: { type: { in: [\"started\", \"unstarted\"] } } }) {\n nodes {\n id\n identifier\n title\n description\n priority\n status {\n name\n }\n assignee {\n name\n }\n labels {\n nodes {\n name\n }\n }\n createdAt\n updatedAt\n }\n }\n }\n `;\n\n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': apiKey,\n },\n body: JSON.stringify({ query }),\n });\n\n if (!response.ok) {\n throw new Error(`Linear API error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as any;\n return data.data.issues.nodes as LinearTicket[];\n }\n\n private async ingestTicket(ticket: LinearTicket): Promise<void> {\n const labels = ticket.labels.nodes.map(l => l.name);\n const intentVibe = this.extractIntentVibes(ticket.title, ticket.description, labels);\n \n // Attempt to find linked files in description or via labels (heuristic)\n const linkedFiles = this.extractLinkedFiles(ticket.description);\n\n const data: LinearTicketNodeData = {\n ticketId: ticket.identifier,\n title: ticket.title,\n description: ticket.description || '',\n priority: this.mapPriority(ticket.priority),\n labels,\n intentVibe,\n linkedFiles,\n status: ticket.status.name,\n assignee: ticket.assignee?.name || null,\n createdAt: ticket.createdAt,\n updatedAt: ticket.updatedAt,\n };\n\n await this.graph.addNode('linear-ticket', data);\n\n // Link to files if found\n for (const file of linkedFiles) {\n const fileNode = await this.graph.getNode('file', file); // Use ID (path)\n if (fileNode) {\n await this.graph.addEdge(`linear:${ticket.identifier}`, fileNode.id, 'relatedTo');\n }\n }\n }\n\n private extractIntentVibes(title: string, description: string, labels: string[]): string[] {\n const vibes = new Set<string>();\n const text = (title + ' ' + (description || '') + ' ' + labels.join(' ')).toLowerCase();\n\n if (text.includes('performance') || text.includes('slow') || text.includes('optimize')) vibes.add('performance');\n if (text.includes('security') || text.includes('auth') || text.includes('vulnerability')) vibes.add('security');\n if (text.includes('refactor') || text.includes('cleanup') || text.includes('debt')) vibes.add('refactor');\n if (text.includes('feature') || text.includes('new')) vibes.add('feature');\n if (text.includes('bug') || text.includes('fix') || text.includes('broken')) vibes.add('bug');\n if (text.includes('breaking') || text.includes('major change')) vibes.add('breaking-change');\n\n return Array.from(vibes);\n }\n\n private extractLinkedFiles(description: string): string[] {\n if (!description) return [];\n const matches = description.match(/[\\\\w./_-]+\\\\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs)/gi);\n if (!matches) return [];\n return Array.from(new Set(matches.map(m => m.replace(/^\\.\\/+/, ''))));\n }\n\n private mapPriority(priority: number): string {\n switch (priority) {\n case 1: return 'urgent';\n case 2: return 'high';\n case 3: return 'medium';\n case 4: return 'low';\n default: return 'none';\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,WAAW,gBAAgB;AAC3C,SAAS,YAAY;AAoBrB,eAAsB,eAAe,SAMb;AACtB,QAAM,UAAU,QAAQ,WAAW,oBAAoB,QAAW,IAAI;AACtE,QAAM,UAAU,iBAAiB,OAAO;AACxC,QAAM,iBAAiB,KAAK,SAAS,kBAAkB;AAEvD,QAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAGxC,MAAI,MAAqB,EAAE,aAAa,CAAC,EAAE;AAC3C,MAAI;AACF,QAAI,WAAW,cAAc,GAAG;AAC9B,YAAM,KAAK,MAAM,MAAM,SAAS,gBAAgB,OAAO,CAAC;AAAA,IAC1D;AAAA,EACF,QAAQ;AACN,UAAM,EAAE,aAAa,CAAC,EAAE;AAAA,EAC1B;AAGA,QAAM,aAAyB;AAAA,IAC7B,IAAI,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,IACjC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,OAAO,QAAQ,SAAS,CAAC;AAAA,IACzB,WAAW,QAAQ,aAAa;AAAA,EAClC;AACA,MAAI,QAAQ,QAAS,YAAW,UAAU,QAAQ;AAClD,MAAI,QAAQ,MAAO,YAAW,QAAQ,QAAQ;AAG9C,MAAI,YAAY,KAAK,UAAU;AAC/B,MAAI,iBAAiB,WAAW;AAGhC,MAAI,IAAI,YAAY,SAAS,IAAI;AAC/B,QAAI,cAAc,IAAI,YAAY,MAAM,GAAG;AAAA,EAC7C;AAGA,QAAM,UAAU,gBAAgB,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAG5D,QAAM,6BAA6B,YAAY,OAAO;AAEtD,SAAO;AACT;AAKA,eAAsB,gBAAgB,SAAyC;AAC7E,QAAM,MAAM,WAAW,oBAAoB,QAAW,IAAI;AAC1D,QAAM,iBAAiB,KAAK,iBAAiB,GAAG,GAAG,kBAAkB;AAErE,MAAI;AACF,QAAI,WAAW,cAAc,GAAG;AAC9B,YAAM,MAAqB,KAAK,MAAM,MAAM,SAAS,gBAAgB,OAAO,CAAC;AAC7E,aAAO,IAAI;AAAA,IACb;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,CAAC;AACV;AAKA,eAAsB,kBAAkB,SAA8C;AACpF,QAAM,cAAc,MAAM,gBAAgB,OAAO;AACjD,QAAM,OAAO,YAAY,YAAY,SAAS,CAAC;AAC/C,SAAO,QAAQ;AACjB;AAKA,eAAe,6BAA6B,YAAwB,SAAgC;AAClG,QAAM,aAAa,KAAK,iBAAiB,OAAO,GAAG,WAAW;AAE9D,MAAI,UAAU;AACd,MAAI;AACF,QAAI,WAAW,UAAU,GAAG;AAC1B,gBAAU,MAAM,SAAS,YAAY,OAAO;AAAA,IAC9C;AAAA,EACF,QAAQ;AACN,cAAU;AAAA,EACZ;AAGA,QAAM,oBAAoB;AAAA;AAAA;AAAA,YAGhB,WAAW,EAAE;AAAA,cACX,WAAW,SAAS;AAAA,EAChC,WAAW,UAAU,kBAAkB,WAAW,OAAO,KAAK,EAAE;AAAA,EAChE,WAAW,MAAM,SAAS,IAAI,gBAAgB,WAAW,MAAM,MAAM,WAAW,EAAE;AAAA,EAClF,WAAW,QAAQ,gBAAgB,WAAW,KAAK,KAAK,EAAE;AAAA;AAI1D,QAAM,kBAAkB;AACxB,MAAI,gBAAgB,KAAK,OAAO,GAAG;AACjC,cAAU,QAAQ,QAAQ,iBAAiB,kBAAkB,KAAK,CAAC;AAAA,EACrE,OAAO;AACL,cAAU,QAAQ,KAAK,IAAI,SAAS,kBAAkB,KAAK,IAAI;AAAA,EACjE;AAEA,QAAM,UAAU,YAAY,OAAO;AACrC;AAKA,eAAsB,wBAAwB,MAA+B;AAC3E,QAAM,aAAa,KAAK,CAAC,KAAK;AAE9B,UAAQ,YAAY;AAAA,IAClB,KAAK,QAAQ;AAEX,UAAI;AACJ,UAAI;AACJ,YAAM,QAAkB,CAAC;AAEzB,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,YAAI,QAAQ,QAAQ,QAAQ,aAAa;AACvC,oBAAU,KAAK,EAAE,CAAC,KAAK;AAAA,QACzB,WAAW,QAAQ,QAAQ,QAAQ,WAAW;AAC5C,kBAAQ,KAAK,EAAE,CAAC,KAAK;AAAA,QACvB,WAAW,QAAQ,QAAQ,QAAQ,UAAU;AAC3C,gBAAM,OAAO,KAAK,EAAE,CAAC;AACrB,cAAI,KAAM,OAAM,KAAK,IAAI;AAAA,QAC3B,WAAW,OAAO,CAAC,IAAI,WAAW,GAAG,GAAG;AAEtC,oBAAU;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,OAA+D,EAAE,MAAM;AAC7E,UAAI,QAAS,MAAK,UAAU;AAC5B,UAAI,MAAO,MAAK,QAAQ;AACxB,YAAM,aAAa,MAAM,eAAe,IAAI;AAE5C,cAAQ,IAAI,wBAAwB;AACpC,cAAQ,IAAI,SAAS,WAAW,EAAE,EAAE;AACpC,cAAQ,IAAI,WAAW,WAAW,SAAS,EAAE;AAC7C,UAAI,WAAW,SAAS;AACtB,gBAAQ,IAAI,cAAc,WAAW,OAAO,EAAE;AAAA,MAChD;AACA,UAAI,WAAW,MAAM,SAAS,GAAG;AAC/B,gBAAQ,IAAI,YAAY,WAAW,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACvD;AACA,cAAQ,IAAI,+BAA+B;AAC3C;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,cAAc,MAAM,gBAAgB;AAE1C,UAAI,YAAY,WAAW,GAAG;AAC5B,gBAAQ,IAAI,8DAA8D;AAC1E;AAAA,MACF;AAEA,cAAQ,IAAI,oBAAoB;AAChC,iBAAW,MAAM,YAAY,MAAM,GAAG,EAAE,QAAQ,GAAG;AACjD,cAAM,OAAO,IAAI,KAAK,GAAG,SAAS,EAAE,eAAe;AACnD,gBAAQ,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI,KAAK,GAAG,WAAW,cAAc,EAAE;AAAA,MACpE;AACA,cAAQ,IAAI,EAAE;AACd;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,aAAa,MAAM,kBAAkB;AAE3C,UAAI,CAAC,YAAY;AACf,gBAAQ,IAAI,8DAA8D;AAC1E;AAAA,MACF;AAEA,cAAQ,IAAI,wBAAwB;AACpC,cAAQ,IAAI,SAAS,WAAW,EAAE,EAAE;AACpC,cAAQ,IAAI,WAAW,IAAI,KAAK,WAAW,SAAS,EAAE,eAAe,CAAC,EAAE;AACxE,UAAI,WAAW,SAAS;AACtB,gBAAQ,IAAI,cAAc,WAAW,OAAO,EAAE;AAAA,MAChD;AACA,UAAI,WAAW,OAAO;AACpB,gBAAQ,IAAI,YAAY,WAAW,KAAK,EAAE;AAAA,MAC5C;AACA,UAAI,WAAW,MAAM,SAAS,GAAG;AAC/B,gBAAQ,IAAI,YAAY,WAAW,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACvD;AACA,cAAQ,IAAI,EAAE;AACd;AAAA,IACF;AAAA,IAEA;AACE,cAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAiBjB;AAAA,EACC;AACF;;;ACtPA,SAAS,YAAAA,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;AC+Fd,IAAM,0BAA0C;AAAA,EACrD,OAAO;AAAA,EACP,WAAW;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA;AAAA,IACV,YAAY,CAAC,WAAW,MAAM;AAAA,IAC9B,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS,CAAC,UAAU;AAAA,IACpB,eAAe,CAAC,OAAO,QAAQ,SAAS;AAAA,IACxC,aAAa;AAAA,EACf;AAAA,EACA,uBAAuB;AAAA,IACrB,SAAS;AAAA,IACT,YAAY;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,UAAU,KAAK,KAAK,KAAK;AAAA;AAAA,EAC3B;AACF;;;AD1HA,SAAS,kBAAkB;AAS3B,eAAsB,mBAAmB,aAA8C;AACrF,QAAM,aAAaC,MAAK,iBAAiB,WAAW,GAAG,aAAa;AAEpE,MAAI;AACF,QAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,aAAO,EAAE,GAAG,wBAAwB;AAAA,IACtC;AAEA,UAAM,UAAU,MAAMC,UAAS,YAAY,OAAO;AAClD,UAAM,SAAS,KAAK,MAAM,OAAO;AAGjC,WAAO,kBAAkB,OAAO,YAAY,CAAC,CAAC;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,WAAO,EAAE,GAAG,wBAAwB;AAAA,EACtC;AACF;AA0CA,SAAS,kBAAkB,SAAkD;AAC3E,SAAO;AAAA,IACL,OAAO,QAAQ,SAAS,wBAAwB;AAAA,IAChD,WAAW;AAAA,MACT,GAAG,wBAAwB;AAAA,MAC3B,GAAI,QAAQ,aAAa,CAAC;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,MACP,GAAG,wBAAwB;AAAA,MAC3B,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAAA,IACA,cAAc;AAAA,MACZ,GAAG,wBAAwB;AAAA,MAC3B,GAAI,QAAQ,gBAAgB,CAAC;AAAA,IAC/B;AAAA,IACA,uBAAuB;AAAA,MACrB,GAAG,wBAAwB;AAAA,MAC3B,GAAI,QAAQ,yBAAyB,CAAC;AAAA,MACtC,YAAY;AAAA,QACV,GAAG,wBAAwB,sBAAsB;AAAA,QACjD,GAAI,QAAQ,uBAAuB,cAAc,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACF;AAMA,IAAM,kBAAkB,oBAAI,IAA0C;AAKtE,eAAe,eAAe,aAA4D;AACxF,MAAI,gBAAgB,IAAI,WAAW,GAAG;AACpC,WAAO,gBAAgB,IAAI,WAAW;AAAA,EACxC;AAEA,QAAM,kBAAkBC,MAAK,iBAAiB,WAAW,GAAG,UAAU,kBAAkB;AACxF,QAAM,cAAc,oBAAI,IAA6B;AAErD,MAAI;AACF,QAAIC,YAAW,eAAe,GAAG;AAC/B,YAAM,UAAU,MAAMC,UAAS,iBAAiB,OAAO;AACvD,YAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,iBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC9C,oBAAY,IAAI,MAAM,GAAsB;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,kBAAgB,IAAI,aAAa,WAAW;AAC5C,SAAO;AACT;AAKA,eAAe,gBAAgB,aAAoC;AACjE,QAAM,cAAc,gBAAgB,IAAI,WAAW;AACnD,MAAI,CAAC,YAAa;AAElB,QAAM,kBAAkBF,MAAK,iBAAiB,WAAW,GAAG,UAAU,kBAAkB;AACxF,QAAM,YAAYA,MAAK,iBAAiB,WAAW,GAAG,QAAQ;AAE9D,MAAI;AACF,QAAI,CAACC,YAAW,SAAS,GAAG;AAC1B,YAAME,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5C;AAEA,UAAM,OAAwC,CAAC;AAC/C,eAAW,CAAC,MAAM,GAAG,KAAK,YAAY,QAAQ,GAAG;AAC/C,WAAK,IAAI,IAAI;AAAA,IACf;AAEA,UAAMC,WAAU,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAChE,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAAA,EACpD;AACF;AAKO,SAAS,gBAAgB,MAAc,MAA0B,WAA2B;AACjG,QAAM,QAAQ,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,SAAS;AAC/C,SAAO,WAAW,KAAK,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAClE;AAKA,eAAsB,qBACpB,aACA,MACA,MACA,WACA,QAC0B;AAC1B,QAAM,cAAc,MAAM,eAAe,WAAW;AACpD,QAAM,OAAO,gBAAgB,MAAM,MAAM,SAAS;AAClD,QAAM,MAAM,KAAK,IAAI;AAErB,MAAI,aAAa,YAAY,IAAI,IAAI;AAErC,MAAI,YAAY;AAEd,UAAM,WAAW,OAAO,sBAAsB;AAC9C,QAAI,MAAM,WAAW,YAAY,UAAU;AAEzC,mBAAa;AAAA,QACX;AAAA,QACA,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,eAAe,WAAW;AAAA;AAAA,MAC5B;AAAA,IACF,OAAO;AAEL,iBAAW,WAAW;AACtB,iBAAW;AAGX,YAAM,aAAa,OAAO,sBAAsB;AAChD,UAAI,WAAW,SAAS,WAAW,OAAO;AACxC,mBAAW,kBAAkB;AAAA,MAC/B,WAAW,WAAW,SAAS,WAAW,UAAU;AAClD,mBAAW,kBAAkB;AAAA,MAC/B,WAAW,WAAW,SAAS,WAAW,WAAW;AACnD,mBAAW,kBAAkB;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,iBAAa;AAAA,MACX;AAAA,MACA,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,eAAe,CAAC;AAAA,IAClB;AAAA,EACF;AAEA,cAAY,IAAI,MAAM,UAAU;AAChC,QAAM,gBAAgB,WAAW;AAEjC,SAAO;AACT;AAqBA,eAAsB,aACpB,aACA,MACA,MACA,WACA,QACA,QACe;AACf,QAAM,cAAc,MAAM,eAAe,WAAW;AACpD,QAAM,OAAO,gBAAgB,MAAM,MAAM,SAAS;AAElD,QAAM,aAAa,YAAY,IAAI,IAAI;AACvC,MAAI,YAAY;AACd,eAAW,WAAW;AACtB,eAAW,cAAc,KAAK;AAAA,MAC5B,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3C,CAAC;AACD,UAAM,gBAAgB,WAAW;AAAA,EACnC;AACF;AASO,SAAS,cACd,KACA,QACS;AACT,MAAI,CAAC,OAAO,QAAQ,SAAS;AAC3B,WAAO;AAAA,EACT;AAGA,QAAM,oBAAoB,OAAO,QAAQ;AACzC,MAAI,CAAC,kBAAkB,SAAS,IAAI,QAAQ,KACxC,CAAC,kBAAkB,SAAS,KAAK,GAAG;AACtC,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,QAAQ,gBAAgB,SAAS,KACxC,CAAC,OAAO,QAAQ,gBAAgB,SAAS,IAAI,IAAI,GAAG;AACtD,WAAO;AAAA,EACT;AAGA,MAAI,IAAI,aAAa,KAAK;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAwBO,SAAS,gBACd,QACA,QACiB;AACjB,MAAI,CAAC,OAAO,aAAa,SAAS;AAChC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB,CAAC;AAAA,MACjB,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,iBAAiB,OAAO;AAAA,IAAO,WACnC,OAAO,aAAa,QAAQ,SAAS,MAAM,QAA+C;AAAA,EAC5F;AAEA,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB,CAAC;AAAA,MACjB,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,IAAI,gBAAgB,OAAO,QAAQ,IAAI,gBAAgB;AAEjF,MAAI,aAAa,OAAO,aAAa,aAAa;AAChD,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,qBAAqB,wBAAwB,MAAM;AAEzD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,GAAG,eAAe,MAAM,IAAI,eAAe,CAAC,GAAG,YAAY,UAAU;AAAA,IAC7E;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAKA,SAAS,wBAAwB,QAAgC;AAC/D,QAAM,eAAyB,CAAC;AAEhC,MAAI,OAAO,aAAa,cAAc,SAAS,KAAK,GAAG;AACrD,iBAAa,KAAK,4DAAuD;AAAA,EAC3E;AAEA,MAAI,OAAO,aAAa,cAAc,SAAS,MAAM,GAAG;AACtD,iBAAa,KAAK,mDAA8C;AAAA,EAClE;AAEA,MAAI,OAAO,aAAa,cAAc,SAAS,SAAS,GAAG;AACzD,iBAAa,KAAK,uDAAkD;AAAA,EACtE;AAEA,SAAO,aAAa,KAAK,IAAI;AAC/B;AAMA,IAAM,cAAc,oBAAI,IAA0D;AAClF,IAAM,YAAY;AAKlB,eAAsB,kBAAkB,aAA8C;AACpF,QAAM,SAAS,YAAY,IAAI,WAAW;AAE1C,MAAI,UAAU,KAAK,IAAI,IAAI,OAAO,WAAW,WAAW;AACtD,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,mBAAmB,WAAW;AACnD,cAAY,IAAI,aAAa,EAAE,QAAQ,UAAU,KAAK,IAAI,EAAE,CAAC;AAE7D,SAAO;AACT;;;AEnbA,OAAO,UAAU;;;ACejB,IAAM,iBAAiB,CAAC,SAAS,UAAU,aAAa,WAAW,aAAa,WAAW;AAEpF,SAAS,YAAY,MAA2B;AACrD,QAAM,QAA2B,CAAC;AAClC,MAAI,UAAkC;AAEtC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAE7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,YAAM,WAAW,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAK;AACjD,gBAAU;AAAA,QACR;AAAA,QACA,OAAO;AAAA,QACP,SAAS;AAAA,QACT,mBAAmB,CAAC;AAAA,QACpB,eAAe,CAAC;AAAA,MAClB;AACA,YAAM,KAAK,OAAO;AAClB;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,IAAI,GAAG;AAEzB,YAAM,QAAQ,KAAK,MAAM,4DAA4D;AACrF,YAAM,SAAS,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACpD,UAAI,QAAQ;AACV,gBAAQ,kBAAkB,KAAK,OAAO,QAAQ,KAAK,EAAE,EAAE,KAAK,CAAC;AAAA,MAC/D;AACA;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AACnD,cAAQ,SAAS;AACjB,eAAS,MAAM,OAAO;AAAA,IACxB,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AAC1D,cAAQ,WAAW;AACnB,eAAS,MAAM,OAAO;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAC5D,QAAM,eAAe,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,CAAC;AAChE,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,cAAc,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ;AAExF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,SAAS,MAAc,MAA6B;AAC3D,aAAW,WAAW,gBAAgB;AACpC,QAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,YAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAI,CAAC,KAAK,cAAc,SAAS,KAAK,GAAG;AACvC,aAAK,cAAc,KAAK,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;;;AD9DA,eAAsB,uBACpB,aACA,OAC2B;AAC3B,QAAM,WAAW,SAAS,IAAI,aAAa,WAAW;AAEtD,QAAM,CAAC,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,iBAAiB,WAAW;AAAA,IAC5B,sBAAsB,WAAW;AAAA,EACnC,CAAC;AAED,QAAM,aAAa,MAAM,mBAAmB,aAAa,IAAI;AAC7D,QAAM,eAAe,MAAM,mBAAmB,aAAa,KAAK;AAChE,QAAM,eAAe,CAAC,YAAY,YAAY,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACzE,QAAM,cAAc,YAAY,YAAY;AAE5C,QAAM,eAAe,oBAAI,IAAY;AACrC,SAAO,QAAQ,CAAC,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC;AAC9C,WAAS,QAAQ,CAAC,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC;AAChD,cAAY,MAAM,QAAQ,CAAC,MAAM,aAAa,IAAI,EAAE,QAAQ,CAAC;AAE7D,QAAM,WAAW,MAAM,oBAAoB,UAAU,MAAM,KAAK,YAAY,GAAG,WAAW;AAE1F,QAAM,SAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,SAAU,QAAO,eAAe;AACpC,SAAO;AACT;AAEA,eAAe,oBACb,OACA,OACA,aAC6B;AAC7B,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,SAAS,MAAM,MAAM,QAAQ,UAAU;AAAA,IAC3C,YAAY;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,EACX,CAAC;AAED,aAAW,YAAY,OAAO;AAC5B,UAAM,WAAW,MAAM,eAAe,OAAO,UAAU,WAAW;AAClE,UAAM,MAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,SAAS;AAAA,EACvD;AAEA,SAAO,OAAO;AAChB;AAEA,eAAe,eACb,OACA,UACA,aACmB;AACnB,QAAM,aAAa,KAAK,QAAQ,aAAa,QAAQ;AACrD,QAAM,WAAW,MAAM,MAAM,QAAQ,QAAQ,UAAU;AAEvD,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,MAAI,UAAU;AACZ,UAAMC,QAAO,SAAS;AACtB,UAAM,MAAM,WAAW,QAAQ,SAAS,IAAI;AAAA,MAC1C,cAAcA,MAAK,eAAe,KAAK;AAAA,MACvC,aAAa;AAAA,IACf,CAAC;AACD,WAAQ,MAAM,MAAM,QAAQ,QAAQ,SAAS,EAAE;AAAA,EACjD;AAEA,QAAM,OAAqB;AAAA,IACzB,MAAM;AAAA,IACN,WAAW,KAAK,QAAQ,QAAQ;AAAA,IAChC,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AAEA,SAAQ,MAAM,MAAM,QAAQ,QAAQ,IAAI;AAC1C;;;AE5GA,OAAOC,WAAU;AAuBjB,IAAM,YAAuC;AAAA,EAC3C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ;AAEA,IAAM,kBAAyE;AAAA,EAC7E,EAAE,SAAS,6BAA6B,QAAQ,IAAI,QAAQ,yBAAyB;AAAA,EACrF,EAAE,SAAS,2CAA2C,QAAQ,IAAI,QAAQ,mBAAmB;AAAA,EAC7F,EAAE,SAAS,2CAA2C,QAAQ,IAAI,QAAQ,kCAAkC;AAAA,EAC5G,EAAE,SAAS,yBAAyB,QAAQ,IAAI,QAAQ,yBAAyB;AACnF;AAEA,SAAS,eAAe,OAA0B;AAChD,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACT;AAEA,eAAsB,UACpB,OACA,UACA,kBAAiC,CAAC,GACT;AACzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAaA,MAAK,QAAQ,MAAM,aAAa,QAAQ;AAC3D,QAAM,OAAO,MAAM,MAAM,QAAQ,QAAQ,UAAU;AACnD,QAAM,YAAY,MAAM,MAAM,oBAAoB,QAAQ;AAE1D,MAAI,QAAQ;AACZ,QAAM,OAAO,MAAM;AAEnB,MAAI,MAAM;AACR,YAAQ,UAAU,KAAK,SAAS,KAAK;AACrC,YAAQ,KAAK,YAAY,KAAK,SAAS,EAAE;AAEzC,QAAI,KAAK,gBAAgB,GAAG;AAC1B,YAAM,WAAW,KAAK,IAAI,KAAK,gBAAgB,IAAI,EAAE;AACrD,eAAS;AACT,cAAQ,KAAK,0BAA0B,QAAQ,GAAG;AAAA,IACpD;AAEA,QAAI,KAAK,cAAc,GAAG;AACxB,YAAM,cAAc,KAAK,KAAK,KAAK,cAAc,KAAK,GAAG,EAAE;AAC3D,eAAS;AACT,cAAQ,KAAK,sBAAsB,WAAW,GAAG;AAAA,IACnD;AAEA,QAAI,KAAK,aAAa;AACpB,YAAM,cAAc,IAAI,KAAK,KAAK,WAAW,EAAE,QAAQ;AACvD,YAAM,QAAQ,KAAK,IAAI,IAAI,gBAAgB,MAAO,KAAK,KAAK;AAC5D,UAAI,OAAO,MAAM,KAAK,kBAAkB,GAAG;AACzC,iBAAS;AACT,gBAAQ,KAAK,qBAAqB;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,aAAW,EAAE,SAAS,QAAQ,OAAO,KAAK,iBAAiB;AACzD,QAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,eAAS;AACT,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,eAAe,KAAK;AAAA,MACxB,gBAAgB,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,KAAK,cAAc,MAAM,IAAI,CAAC;AAAA,MAC1E;AAAA,IACF;AACA,aAAS;AACT,YAAQ,KAAK,mBAAmB,KAAK,MAAM,YAAY,CAAC,GAAG;AAAA,EAC7D;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,aAAa,UAChB,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,KAAK,SAAS,EAAE,QAAQ,CAAC,EAC/C,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACvB,UAAM,SAAS,WAAW,CAAC;AAC3B,UAAM,aAAa,KAAK,IAAI,IAAI,WAAW,MAAO,KAAK,KAAK;AAC5D,QAAI,YAAY,IAAI;AAClB,eAAS;AACT,cAAQ,KAAK,0BAA0B;AAAA,IACzC,OAAO;AACL,eAAS;AACT,cAAQ,KAAK,sBAAsB;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,KAAK;AAClC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,OACA,OACA,iBAAgD,CAAC,GACtB;AAC3B,QAAM,cAAgC,CAAC;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,eAAe,IAAI,KAAK,CAAC;AAC1C,gBAAY,KAAK,MAAM,UAAU,OAAO,MAAM,QAAQ,CAAC;AAAA,EACzD;AAGA,QAAM,WAAW,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE;AAChE,QAAM,cAAc,MAAM,SAAS,IAAI,KAAK,KAAK,MAAM,SAAS,KAAK,GAAG,EAAE,IAAI;AAC9E,QAAM,eAAe,WAAW;AAChC,QAAM,UAAU,eAAe,YAAY;AAE3C,QAAM,iBAAiB,YAAY,cAAc,YAAY;AAE7D,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF;AACF;;;AC7IA,eAAsB,sBACpB,OACA,OAC6E;AAC7E,QAAM,UAA0B,CAAC;AACjC,QAAM,SAAwC,CAAC;AAE/C,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,MAAM,MAAM,mBAAmB,IAAI;AACpD,QAAI,SAAS,WAAW,EAAG;AAE3B,WAAO,IAAI,IAAI;AAEf,eAAW,WAAW,UAAU;AAC9B,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,YAAY,QAAQ,KAAK;AAAA,QACzB,eAAe,QAAQ,KAAK;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;;;ACTA,SAAS,0BAAuC;AAC9C,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,cAAc;AAAA,IACd,cAAc,CAAC;AAAA,IACf,WAAW;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,MACR,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAkC;AAC1D,QAAM,MAAM,CAAC,GAAG,OAAO,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACjE,MAAI,CAAC,IAAK,QAAO,cAAc,OAAO,OAAO;AAC7C,SAAO,cAAc,OAAO,OAAO,YAAY,IAAI,IAAI,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC;AACnF;AAEA,SAAS,oBAAoB,MAAiB,gBAAiC;AAC7E,MAAI,kBAAkB,SAAS,YAAY;AACzC,WAAO;AAAA,EACT;AACA,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,mBACpB,aACA,OACA,UAAyB,CAAC,GACN;AACpB,QAAM,QAAQ,IAAI,aAAa,WAAW;AAC1C,QAAM,EAAE,SAAS,OAAO,IAAI,MAAM,sBAAsB,OAAO,KAAK;AACpE,QAAM,aAAa,MAAM,eAAe,OAAO,OAAO,MAAM;AAE5D,QAAM,YAA4B,CAAC;AACnC,aAAW,QAAQ,OAAO;AACxB,UAAM,gBAAgB,MAAM,MAAM,oBAAoB,IAAI;AAC1D,cAAU,KAAK,GAAG,aAAa;AAAA,EACjC;AAEA,QAAM,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,aAAa;AAC1D,QAAM,YAAuB,iBAAiB,aAAa,WAAW;AACtE,QAAM,cAAc,kBAAkB,cAAc,cAAc,cAAc;AAEhF,QAAM,YAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,aAAa,iBAAiB,UAAU;AAAA,IACxC,mBAAmB;AAAA,IACnB,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,IAC7C,gBAAgB,oBAAoB,WAAW,cAAc;AAAA,IAC7D,OAAO,WAAW;AAAA,EACpB;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,cAAc,QAAQ,eAAe,wBAAwB;AACnE,UAAM,UAAU,IAAI,QAAQ;AAC5B,UAAM,SAAS,MAAM,QAAQ,aAAa,aAAa,SAAS;AAEhE,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,WAAW,IAAI,SAAS;AAC9B,YAAM,cAA2B;AAAA,QAC/B,YAAY;AAAA,QACZ,GAAG,QAAQ;AAAA,MACb;AACA,UAAI,YAAY,UAAW,aAAY,YAAY,YAAY;AAC/D,UAAI,YAAY,SAAU,aAAY,WAAW,YAAY;AAE7D,gBAAU,eAAe,MAAM,SAAS,cAAc,QAAQ,OAAO,aAAa;AAAA,QAChF,UAAU;AAAA,QACV,WAAW,QAAQ,aAAa,QAAQ,aAAa;AAAA,MACvD,CAAC;AAAA,IACH,OAAO;AACL,gBAAU,eAAe,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AAGA,eAAsB,gCACpB,aACA,OACA,UAAyB,CAAC,GAC1B;AACA,QAAM,YAAY,MAAM,mBAAmB,aAAa,OAAO,OAAO;AACtE,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,6BAA2B;AACtE,SAAO,kBAAkB,SAAS;AACpC;;;ACzIA,SAAS,YAAAC,WAAU,aAAAC,YAAW,QAAQ,SAAAC,cAAa;AACnD,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAwBrB,IAAM,kBAAuC;AAAA,EAC3C,EAAE,MAAM,cAAc,MAAM,QAAQ,aAAa,mCAAmC;AAAA,EACpF,EAAE,MAAM,YAAY,MAAM,QAAQ,aAAa,kCAAkC;AAAA,EACjF,EAAE,MAAM,WAAW,MAAM,QAAQ,aAAa,gCAAgC;AAAA,EAC9E,EAAE,MAAM,gBAAgB,MAAM,YAAY,aAAa,kCAAkC;AAAA,EACzF,EAAE,MAAM,aAAa,MAAM,QAAQ,aAAa,8BAA8B;AAChF;AAKA,eAAsB,qBAAqB,SAA6C;AACtF,QAAM,aAAa,WAAW,oBAAoB,QAAW,IAAI;AACjE,QAAM,UAAU,iBAAiB,UAAU;AAC3C,QAAM,QAAyB,CAAC;AAChC,QAAM,eAAyB,CAAC;AAChC,MAAIC,kBAAiB;AAErB,aAAW,QAAQ,iBAAiB;AAClC,UAAM,WAAWC,MAAK,SAAS,KAAK,IAAI;AACxC,UAAM,SAASC,YAAW,QAAQ;AAElC,QAAI,KAAK,SAAS,kBAAkB,QAAQ;AAC1C,MAAAF,kBAAiB;AAAA,IACnB;AAEA,QAAI;AACJ,QAAI,QAAQ;AACV,UAAI;AACF,kBAAU,MAAMG,UAAS,UAAU,OAAO;AAC1C,YAAI,QAAQ,KAAK,KAAK,KAAK,SAAS,YAAY;AAC9C,uBAAa,KAAK,QAAQ,KAAK,IAAI;AAAA,EAAS,OAAO,EAAE;AAAA,QACvD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,YAA2B;AAAA,MAC/B,MAAM,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AACA,QAAI,QAAS,WAAU,UAAU;AACjC,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,aAAa,KAAK,aAAa;AAAA,IAChD,gBAAAH;AAAA,EACF;AACF;AAKA,eAAsB,yBAAyB,UAI3C,CAAC,GAA4E;AAC/E,QAAM,aAAa,QAAQ,WAAW,oBAAoB,QAAW,IAAI;AACzE,QAAM,UAAU,iBAAiB,UAAU;AAC3C,QAAMI,OAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAExC,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAE3B,QAAM,QAAQ,MAAM,YAAY,UAAU;AAE1C,aAAW,QAAQ,iBAAiB;AAClC,UAAM,WAAWH,MAAK,SAAS,KAAK,IAAI;AACxC,UAAM,SAASC,YAAW,QAAQ;AAElC,QAAI,UAAU,CAAC,QAAQ,OAAO;AAC5B,cAAQ,KAAK,KAAK,IAAI;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,kBAAkB,QAAQ,eAAe;AACzD,cAAQ,KAAK,KAAK,IAAI;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,cAAQ,KAAK,KAAK,IAAI;AACtB;AAAA,IACF;AAEA,UAAM,WAAW,gBAAgB,KAAK,MAAM,KAAK;AACjD,QAAI,UAAU;AACZ,YAAMG,WAAU,UAAU,QAAQ;AAClC,cAAQ,KAAK,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,SAAS,MAAM;AACnC;AAKA,eAAsB,kBAAkB,SAAoC;AAC1E,QAAM,aAAa,WAAW,oBAAoB,QAAW,IAAI;AACjE,QAAM,gBAAgBJ,MAAK,iBAAiB,UAAU,GAAG,cAAc;AAEvE,MAAI;AACF,UAAM,OAAO,aAAa;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,eAAe,SAA2B;AACxD,QAAM,aAAa,WAAW,oBAAoB,QAAW,IAAI;AACjE,QAAM,gBAAgBA,MAAK,iBAAiB,UAAU,GAAG,cAAc;AACvE,SAAOC,YAAW,aAAa;AACjC;AAKA,eAAsB,UAAU,SAA0C;AACxE,QAAM,aAAa,WAAW,oBAAoB,QAAW,IAAI;AACjE,QAAM,YAAYD,MAAK,iBAAiB,UAAU,GAAG,UAAU;AAE/D,MAAI;AACF,QAAIC,YAAW,SAAS,GAAG;AACzB,aAAO,MAAMC,UAAS,WAAW,OAAO;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAKA,eAAsB,aAAa,SAA0C;AAC3E,QAAM,aAAa,WAAW,oBAAoB,QAAW,IAAI;AACjE,QAAM,WAAWF,MAAK,iBAAiB,UAAU,GAAG,SAAS;AAE7D,MAAI;AACF,QAAIC,YAAW,QAAQ,GAAG;AACxB,aAAO,MAAMC,UAAS,UAAU,OAAO;AAAA,IACzC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAkB,OAAqC;AAC9E,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,mBAAmB,KAAK;AAAA,IACjC,KAAK;AACH,aAAO,iBAAiB,KAAK;AAAA,IAC/B,KAAK;AACH,aAAO,gBAAgB;AAAA,IACzB,KAAK;AACH,aAAO,qBAAqB,KAAK;AAAA,IACnC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,OAA8B;AACxD,QAAM,QAAkB,CAAC,sBAAsB,IAAI,sEAAsE,EAAE;AAE3H,QAAM,KAAK,kBAAkB,IAAI,sDAAuD,EAAE;AAE1F,QAAM,KAAK,uBAAuB,EAAE;AACpC,MAAI,MAAM,UAAW,OAAM,KAAK,oBAAoB,MAAM,SAAS,EAAE;AACrE,MAAI,MAAM,SAAU,OAAM,KAAK,mBAAmB,MAAM,QAAQ,EAAE;AAClE,MAAI,MAAM,SAAU,OAAM,KAAK,mBAAmB,MAAM,QAAQ,EAAE;AAClE,MAAI,MAAM,KAAM,OAAM,KAAK,eAAe,MAAM,IAAI,EAAE;AACtD,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,YAAY,CAAC,MAAM,UAAU;AAC1D,UAAM,KAAK,6BAA6B;AAAA,EAC1C;AACA,QAAM,KAAK,EAAE;AAEb,QAAM,KAAK,mBAAmB,IAAI,uCAAuC,EAAE;AAC3E,QAAM,KAAK,yBAAyB,IAAI,sCAAsC,EAAE;AAChF,QAAM,KAAK,sBAAsB,IAAI,iCAAiC,sBAAsB,sBAAsB,sBAAsB,EAAE;AAC1I,QAAM,KAAK,OAAO,IAAI,+DAA+D;AAErF,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,iBAAiB,OAA8B;AACtD,QAAM,iBAAiB,MAAM,kBAAkB;AAE/C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAQK,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2B5B;AAEA,SAAS,kBAA0B;AACjC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BT;AAEA,SAAS,qBAAqB,OAA8B;AAC1D,QAAM,gBAAgB,MAAM,gBACzB,IAAI,OAAK,mBAAmB,CAAC,EAAE,EAC/B,KAAK,IAAI;AAEZ,QAAM,YAAY,MAAM,gBAAgB,KAAK,IAAI;AAEjD,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,MAAM,UAAW,OAAM,KAAK,oBAAoB,MAAM,SAAS,EAAE;AACrE,MAAI,MAAM,SAAU,OAAM,KAAK,mBAAmB,MAAM,QAAQ,EAAE;AAClE,MAAI,MAAM,SAAU,OAAM,KAAK,mBAAmB,MAAM,QAAQ,EAAE;AAClE,MAAI,MAAM,KAAM,OAAM,KAAK,eAAe,MAAM,IAAI,EAAE;AAEtD,QAAM,KAAK,IAAI,0BAA0B,IAAI,4BAA4B,6CAA6C,SAAS;AAC/H,QAAM,KAAK,iBAAiB,0DAA0D;AACtF,QAAM,KAAK,OAAO,IAAI,2BAA2B,qCAAqC,aAAa,yBAAyB,IAAI,EAAE;AAClI,QAAM,KAAK,0BAA0B,kDAAkD,EAAE;AACzF,QAAM,KAAK,yBAAyB,WAAW,aAAa,OAAO,EAAE;AACrE,QAAM,KAAK,OAAO,IAAI,qDAAqD,WAAW,yBAAyB,KAAK;AAEpH,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC7UO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,MAAc,aAAqB,cAAc,MAAM;AAClF,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,cAAc;AACnB,SAAK,cAAc;AAAA,EACrB;AACF;AA8CO,SAAS,oBAAoB,OAAuD;AACzF,MAAI,iBAAiB,WAAW;AAC9B,WAAO,EAAE,aAAa,MAAM,aAAa,MAAM,MAAM,KAAK;AAAA,EAC5D;AACA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;;;ACjEA,OAAO,QAAQ;AACf,OAAOG,WAAU;AAMjB,IAAM,oBAAoB;AAE1B,eAAsB,aAAa,OAAqB,YAAsC;AAC5F,QAAM,WAAW,MAAM,MAAM,YAAY;AACzC,QAAM,OAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAE7C,QAAM,aAAa,cAAcC,MAAK,KAAK,iBAAiB,MAAM,WAAW,GAAG,iBAAiB;AACjG,QAAM,GAAG,MAAMA,MAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,QAAM,GAAG,UAAU,YAAY,MAAM,MAAM;AAE3C,SAAO;AACT;AAEA,eAAsB,eACpB,OACA,MACA,YACe;AACf,QAAM,UACJ,KAAK,KAAK,EAAE,SAAS,IACjB,OACA,MAAM,GAAG,SAAS,cAAcA,MAAK,KAAK,iBAAiB,MAAM,WAAW,GAAG,iBAAiB,GAAG,MAAM;AAE/G,QAAM,WAAW,KAAK,MAAM,OAAO;AACnC,QAAM,MAAM,cAAc,QAAQ;AACpC;;;AChCA,OAAOC,WAAU;;;ACAjB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,mBAAmB;AAkB5B,SAAS,cAAc,UAA0B;AAC/C,QAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,SAAO,WAAW,WAAW,IAAI,IAAI,WAAW,MAAM,CAAC,IAAI;AAC7D;AAEO,IAAM,eAAN,MAAmB;AAAA,EAChB,OAAiC,IAAI,KAAK;AAAA,EAC1C;AAAA,EAER,YAAY,aAAsB;AAChC,QAAI,YAAa,MAAK,cAAc;AACpC,QAAI,eAAeC,IAAG,WAAW,WAAW,GAAG;AAC7C,UAAI;AACF,cAAM,MAAMA,IAAG,aAAa,aAAa,OAAO;AAChD,YAAI,IAAI,KAAK,EAAE,SAAS,GAAG;AACzB,gBAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,eAAK,OAAO,KAAK,SAA6B,IAAI;AAAA,QACpD;AAAA,MACF,QAAQ;AACN,aAAK,OAAO,IAAI,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,UAAkB,UAAkC;AAC9D,UAAM,MAAM,cAAc,QAAQ;AAClC,UAAM,WAAW,KAAK,KAAK,OAAO,GAAG;AACrC,UAAM,YAAY,SAAS,SAAS,MAAM,QAAQ,SAAS,KAAK,IAAI,SAAS,QAAQ,CAAC;AACtF,cAAU,KAAK,QAAQ;AACvB,SAAK,KAAK,OAAO,KAAK,SAAS;AAC/B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAa,UAAsC;AACjD,UAAM,MAAM,cAAc,QAAQ;AAClC,UAAM,SAAS,KAAK,KAAK,OAAO,GAAG;AACnC,WAAO,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC;AAAA,EACvE;AAAA,EAEA,sBAAsB,QAAoC;AACxD,UAAM,mBAAmB,cAAc,MAAM;AAC7C,UAAM,UAAU,KAAK,KAAK,cAAc,gBAAgB;AACxD,WAAO,QAAQ,QAAQ,CAAC,MAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAE,EAAE,OAAO,OAAO;AAAA,EACvF;AAAA,EAEA,YAAY,WAA8B;AACxC,UAAM,UAAU,KAAK,KAAK,cAAc,EAAE;AAC1C,UAAM,QAAmB,CAAC;AAE1B,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAY,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC9D,UAAI,UAAU,UAAU,WAAW;AACjC,cAAM,KAAK;AAAA,UACT,MAAM,MAAM;AAAA,UACZ,eAAe,UAAU;AAAA,UACzB,YAAY,KAAK,oBAAoB,UAAU,MAAM;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa;AAAA,EAC/D;AAAA,EAEA,aAAa,SAAiB,QAAQ,GAAmD;AACvF,UAAM,aAAa,cAAc,OAAO;AACxC,UAAM,UAAU,KAAK,KAAK,cAAc,UAAU;AAClD,WAAO,QACJ,IAAI,CAAC,OAAO;AAAA,MACX,MAAM,EAAE;AAAA,MACR,eAAe,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,SAAS;AAAA,IAC3D,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAChD,MAAM,GAAG,KAAK;AAAA,EACnB;AAAA,EAEA,WAAWC,OAAsB;AAC/B,UAAM,QAAQ,YAAY,IAAI;AAC9B,SAAK,aAAaA,KAAI;AACtB,WAAO,YAAY,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEQ,oBAAoB,OAAuB;AACjD,UAAM,SAAS,KAAK,IAAI,OAAO,EAAE;AACjC,WAAO,KAAK,MAAO,SAAS,KAAM,GAAG,IAAI;AAAA,EAC3C;AAAA,EAEQ,UAAgB;AACtB,QAAI,CAAC,KAAK,YAAa;AACvB,QAAI;AACF,YAAM,MAAMA,MAAK,QAAQ,KAAK,WAAW;AACzC,UAAI,CAACD,IAAG,WAAW,GAAG,GAAG;AACvB,QAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MACvC;AACA,MAAAA,IAAG,cAAc,KAAK,aAAa,KAAK,UAAU,KAAK,KAAK,OAAO,CAAC,GAAG,OAAO;AAAA,IAChF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AD/GO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,OAAqB,aAAqB,SAAgC;AACpF,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,OAAO,IAAI;AAAA,MACd,SAAS,eAAeE,MAAK,KAAK,iBAAiB,WAAW,GAAG,oBAAoB;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,aAAa,MAAM,OAAqB,aAAqB,SAAwD;AACnH,UAAM,QAAQ,IAAI,eAAc,OAAO,aAAa,OAAO;AAC3D,UAAM,MAAM,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,QAAQ,MAAM,KAAK,MAAM,UAAU;AACzC,UAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAE3D,eAAW,YAAY,WAAW;AAChC,YAAM,QAAQ,MAAM,KAAK,oBAAoB,SAAS,EAAE;AACxD,WAAK,kBAAkB,UAAU,KAAK;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,kBAAkB,UAAwB,OAAuB;AAC/D,UAAM,OAAyB;AAAA,MAC7B,IAAI,SAAS;AAAA,MACb,MAAM;AAAA,MACN,aAAa,SAAS,KAAK;AAAA,MAC3B,UAAU,SAAS,KAAK;AAAA,MACxB,WAAW,SAAS,KAAK;AAAA,IAC3B;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,KAAK,cAAc,IAAI;AAC1C,WAAK,KAAK,YAAY,YAAY,EAAE,GAAG,MAAM,MAAM,WAAW,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,cAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,oBAAoB,YAAuC;AACvE,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,YAAY,MAAM;AAG1D,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,cAAc,KAAK,SAAS,UAAU;AAEtD,cAAM,WAAW,KAAK,SAAS,aAAa,KAAK,QAAQ,KAAK;AAC9D,cAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,UAAU,QAAQ;AAC1D,YAAI,QAAQ,QAAQ,WAAW,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,KAAK,GAAG;AAC9E,UAAC,OAAO,KAAK,MAAmB,QAAQ,CAAC,MAAc,MAAM,IAAI,CAAC,CAAC;AAAA,QACrE;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,WAAW;AAC3B,cAAM,WACH,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,KAAK,KAC3C,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAChD,YAAI,YAAY,OAAQ,SAAiB,MAAM,SAAS,UAAU;AAChE,gBAAM,IAAK,SAAiB,KAAK,IAAI;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEQ,cAAc,UAA0B;AAC9C,UAAM,WAAWA,MAAK,WAAW,QAAQ,IAAI,WAAWA,MAAK,KAAK,KAAK,aAAa,QAAQ;AAC5F,UAAM,WAAWA,MAAK,SAAS,KAAK,aAAa,QAAQ;AACzD,WAAO,SAAS,QAAQ,OAAO,GAAG;AAAA,EACpC;AACF;;;AE/EO,SAAS,iBAAiB,SAAiB,SAAkC,OAAO,KAAa;AACtG,QAAM,QAAQ,YAAY,aAAa,OAAO,CAAC;AAC/C,SAAO,MAAM,UAAU,KAAK;AAC9B;AAEA,SAAS,MAAM,OAAuB;AACpC,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;;;ACJO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YACU,OACA,eACR;AAFQ;AACA;AAAA,EACP;AAAA,EAEH,oBAAoB,YAAY,GAAiB;AAC/C,UAAM,OAAO,KAAK,cAAc,YAAY;AAC5C,UAAM,WAAW,KAAK,YAAY,SAAS;AAE3C,WAAO,SAAS,IAAI,CAAC,UAAU;AAAA,MAC7B,MAAM,KAAK,KAAK,SAAS,GAAG,IAAI,cAAc;AAAA,MAC9C,MAAM,KAAK;AAAA,MACX,eAAe,KAAK;AAAA,MACpB,YAAY,KAAK;AAAA,MACjB,cAAc,KAAK,sBAAsB,KAAK,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACvE,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,sBAAsB,WAAW,GAAmC;AACxE,UAAM,YAAY,MAAM,KAAK,gBAAgB;AAC7C,UAAM,gBAAkD,oBAAI,IAAI;AAEhE,eAAW,OAAO,WAAW;AAC3B,YAAM,QAAQ,MAAM,KAAK,oBAAoB,GAAG;AAChD,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,iBAAS,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACzC,gBAAM,IAAI,MAAM,CAAC;AACjB,gBAAM,IAAI,MAAM,CAAC;AACjB,cAAI,CAAC,cAAc,IAAI,CAAC,EAAG,eAAc,IAAI,GAAG,oBAAI,IAAI,CAAC;AACzD,gBAAM,SAAS,cAAc,IAAI,CAAC;AAClC,iBAAO,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAkC,CAAC;AACzC,eAAW,CAAC,GAAG,GAAG,KAAK,cAAc,QAAQ,GAAG;AAC9C,iBAAW,CAAC,GAAG,KAAK,KAAK,IAAI,QAAQ,GAAG;AACtC,YAAI,SAAS,UAAU;AACrB,gBAAM,QAAQ,KAAK;AAAA,YACjB,KAAK,cAAc,YAAY,EAAE,aAAa,CAAC,EAAE,UAAU;AAAA,YAC3D,KAAK,cAAc,YAAY,EAAE,aAAa,CAAC,EAAE,UAAU;AAAA,UAC7D;AACA,mBAAS,KAAK;AAAA,YACZ,OAAO,CAAC,GAAG,CAAC;AAAA,YACZ,eAAe;AAAA,YACf,YAAY,KAAK,IAAI,GAAG,QAAQ,KAAK;AAAA,UACvC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,EAC5D;AAAA,EAEA,MAAc,kBAA2C;AACvD,UAAM,QAAQ,MAAM,KAAK,MAAM,UAAU;AACzC,WAAO,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,MAAc,oBAAoB,UAA2C;AAC3E,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,SAAS,IAAI,MAAM;AAE3D,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,cAAc,KAAK,SAAS,UAAU;AACtD,cAAM,WAAW,KAAK,SAAS,aAAa,KAAK,QAAQ,KAAK;AAC9D,cAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,UAAU,QAAQ;AAC1D,YAAI,QAAQ,MAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,KAAK,GAAG;AAC3D,iBAAO,KAAK,MAAM,QAAQ,CAAC,MAAc,MAAM,IAAI,CAAC,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG,CAAC;AAAA,EAC3D;AACF;;;ACzFO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAoB,OAAqB,aAAqB;AAA1C;AAClB,SAAK,gBAAgB,IAAI,cAAc,OAAO,WAAW;AACzD,SAAK,YAAY,IAAI,qBAAqB,OAAO,KAAK,aAAa;AAAA,EACrE;AAAA,EANQ;AAAA,EACA;AAAA,EAOR,MAAM,gBAAgB,OAAgC;AACpD,UAAM,KAAK,eAAe,OAAO,UAAU;AAAA,EAC7C;AAAA,EAEA,MAAM,iBAAiB,OAAgC;AACrD,UAAM,KAAK,eAAe,OAAO,UAAU;AAAA,EAC7C;AAAA,EAEA,MAAM,mBAAmB,YAAoB,OAAgC;AAC3E,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,YAAY,UAAU;AAChE,QAAI,YAAY,SAAS,SAAS,YAAY;AAC5C,WAAK,cAAc,kBAAkB,UAA0B,KAAK;AAAA,IACtE;AACA,UAAM,KAAK,yBAAyB;AAAA,EACtC;AAAA,EAEA,MAAM,WAAW,SAAkB,QAAkB,CAAC,GAAkB;AACtE,UAAM,KAAK,eAAe,OAAO,UAAU,aAAa,UAAU;AAAA,EACpE;AAAA,EAEA,MAAc,eAAe,OAAiB,SAAiD;AAC7F,QAAI,CAAC,MAAM,OAAQ;AACnB,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,MAAM,KAAK,MAAM,mBAAmB,IAAI;AACzD,YAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,MAAM,KAAK,wBAAwB,GAAG,OAAO,CAAC,CAAC;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,MAAc,wBAAwB,SAAsB,SAAiD;AAC3G,UAAM,UAAU,QAAQ,KAAK,cAAc;AAC3C,UAAM,UAAU,iBAAiB,SAAS,SAAS,IAAI;AACvD,UAAM,KAAK,MAAM,WAAW,WAAW,QAAQ,IAAI,EAAE,YAAY,SAAS,WAAU,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,EAChH;AAAA,EAEA,MAAc,2BAA0C;AACtD,UAAM,cAAc,KAAK,UAAU,oBAAoB;AACvD,eAAW,OAAO,aAAa;AAC7B,YAAM,KAAK,MAAM,QAAQ,WAAW;AAAA,QAClC,aAAa,GAAG,IAAI,SAAS,cAAc,cAAc,MAAM,cAAc,IAAI,IAAI;AAAA,QACrF,WAAW,CAAC,IAAI,IAAI;AAAA,QACpB,YAAY,IAAI;AAAA,QAChB,aAAa,IAAI;AAAA,QACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,QACjC,eAAe;AAAA,QACf,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACxDA,OAAOC,WAAU;AAOV,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,aAAqB,OAAsB;AACrD,SAAK,cAAc;AACnB,SAAK,QAAQ,SAAS,IAAI,aAAa,WAAW;AAClD,SAAK,iBAAiB,IAAI,eAAe,KAAK,OAAO,WAAW;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,UAGR,CAAC,GAA8B;AACjC,UAAM,UAA4B,CAAC;AAGnC,QAAI,CAAC,QAAQ,gBAAgB;AAC3B,YAAM,gBAAgB,MAAM,KAAK,iBAAiB,QAAQ,SAAS,EAAE;AACrE,cAAQ,KAAK,EAAE,SAAS,eAAe,QAAQ,cAAc,CAAC;AAAA,IAChE;AAGA,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,KAAK;AAAA,QACT,QAAQ,eAAe;AAAA,QACvB,QAAQ,eAAe;AAAA,QACvB,QAAQ,eAAe;AAAA,MACzB;AACA,cAAQ,KAAK,EAAE,SAAS,QAAQ,eAAe,MAAM,UAAU,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IAC/F;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,QAAgB,IAAqB;AAClE,UAAM,UAAU,MAAM,iBAAiB,KAAK,aAAa,KAAK;AAC9D,UAAM,gBAAyB,CAAC;AAEhC,eAAW,UAAU,SAAS;AAC5B,YAAM,WAAW,OAAO,QAAQ,YAAY,EAAE,SAAS,QAAQ,KAAK,OAAO,QAAQ,WAAW,UAAU;AACxG,YAAM,QAAQ,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,YAAY,EAAE,SAAS,QAAQ;AAE1G,UAAI,YAAY,OAAO;AACrB,cAAM,OAAO,WAAW,WAAW;AACnC,cAAM,OAAO,MAAM,QAAQ,KAAK,aAAa,OAAO,IAAI;AACxD,cAAM,QAAQ,KAAK,qBAAqB,IAAI;AAE5C,mBAAW,QAAQ,OAAO;AACxB,gBAAM,gBAAgB,MAAM,KAAK,sBAAsB,MAAM,MAAM,MAAM,OAAO,OAAO;AACvF,wBAAc,KAAK,GAAG,aAAa;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,SAAS,MAAM,YAAY,eAAeA,MAAK,SAAS,KAAK,WAAW,GAAG,KAAK,WAAW;AACjG,aAAO,OAAO;AAAA,IAChB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,SAAkB,OAAiB,MAA8B;AAClG,UAAM,UAAU,MAAM,CAAC,KAAK;AAC5B,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,YAAY;AAAA,MACpD;AAAA,MACA,UAAU,UAAU,YAAY;AAAA,MAChC,WAAW,QAAQ;AAAA,MACnB,SAAS,UAAU,SAAS;AAAA,MAC5B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAA4B;AAE5B,QAAI,MAAM,SAAS,GAAG;AACpB,iBAAW,QAAQ,OAAO;AACxB,cAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,QAAQ,IAAI;AACtD,YAAI,UAAU;AACZ,gBAAM,KAAK,MAAM,QAAQ,SAAS,IAAI,SAAS,IAAI,SAAS;AAAA,QAC9D;AAAA,MACF;AACA,YAAM,KAAK,eAAe,WAAW,SAAS,KAAK;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,qBAAqB,MAAwB;AACnD,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,cAAM,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA,MACzB;AAAA,IACF;AACA,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEA,MAAc,sBAAsB,MAAc,MAAc,MAAwB,SAAmC;AACzH,UAAM,SAAkB,CAAC;AACzB,UAAM,WAAW,KAAK,oBAAoB,MAAM,MAAM,IAAI;AAC1D,UAAM,UAAU,SAAS,KAAK,IAAI;AAElC,QAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,UAAM,kBAAkB,MAAM,uBAAuB,SAAS,IAAI;AAClE,UAAM,aAAa,MAAM,sBAAsB,SAAS,IAAI;AAE5D,UAAM,aAAa,CAAC,GAAG,iBAAiB,GAAG,UAAU;AAErD,eAAW,SAAS,YAAY;AAC9B,aAAO,KAAK;AAAA,QACV,IAAI,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,QAC5E,UAAU;AAAA,QACV,OAAO,iCAAiC,IAAI,KAAK,OAAO,wBAAwB,MAAM,QAAQ;AAAA,QAC9F,KAAK,cAAc,IAAI,qCAAqC,IAAI;AAAA,QAChE;AAAA,QACA,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,KAAK;AAAA,QACV,IAAI,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC;AAAA,QAClC,UAAU;AAAA,QACV,OAAO,cAAc,IAAI,cAAc,OAAO;AAAA,QAC9C,KAAK,yBAAyB,IAAI;AAAA,QAClC;AAAA,QACA,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,MAAc,MAAc,MAAkC;AACxF,UAAM,WAAqB,CAAC;AAC5B,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAI,eAAe;AAEnB,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,QAAQ,KAAK,KAAK,WAAW,QAAQ,GAAG;AAC1D,uBAAe,KAAK,SAAS,IAAI;AACjC;AAAA,MACF;AAEA,UAAI,CAAC,aAAc;AAEnB,UAAI,SAAS,SAAS,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AACrE,iBAAS,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,MAC7B,WAAW,SAAS,YAAY,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AAC/E,iBAAS,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACvKO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EAEjB,YAAY,cAAsB,OAAqB;AACrD,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,cAA6B;AACjC,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,+EAA+E;AAC5F;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,KAAK,mBAAmB,MAAM;AACpD,eAAW,UAAU,SAAS;AAC5B,YAAM,KAAK,aAAa,MAAM;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAc,YAAoC;AAChD,UAAM,SAAS,MAAM,WAAW;AAChC,WAAQ,OAAO,SAAiB,UAAU,QAAQ,IAAI,kBAAkB;AAAA,EAC1E;AAAA,EAEA,MAAc,mBAAmB,QAAyC;AACxE,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2Bd,UAAM,WAAW,MAAM,MAAM,kCAAkC;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,IAChC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,qBAAqB,SAAS,UAAU,EAAE;AAAA,IAC5D;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEA,MAAc,aAAa,QAAqC;AAC9D,UAAM,SAAS,OAAO,OAAO,MAAM,IAAI,OAAK,EAAE,IAAI;AAClD,UAAM,aAAa,KAAK,mBAAmB,OAAO,OAAO,OAAO,aAAa,MAAM;AAGnF,UAAM,cAAc,KAAK,mBAAmB,OAAO,WAAW;AAE9D,UAAM,OAA6B;AAAA,MACjC,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,aAAa,OAAO,eAAe;AAAA,MACnC,UAAU,KAAK,YAAY,OAAO,QAAQ;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,OAAO;AAAA,MACtB,UAAU,OAAO,UAAU,QAAQ;AAAA,MACnC,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,IACpB;AAEA,UAAM,KAAK,MAAM,QAAQ,iBAAiB,IAAI;AAG9C,eAAW,QAAQ,aAAa;AAC9B,YAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,QAAQ,IAAI;AACtD,UAAI,UAAU;AACZ,cAAM,KAAK,MAAM,QAAQ,UAAU,OAAO,UAAU,IAAI,SAAS,IAAI,WAAW;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,OAAe,aAAqB,QAA4B;AACzF,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,QAAQ,QAAQ,OAAO,eAAe,MAAM,MAAM,OAAO,KAAK,GAAG,GAAG,YAAY;AAEtF,QAAI,KAAK,SAAS,aAAa,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,UAAU,EAAG,OAAM,IAAI,aAAa;AAC/G,QAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,eAAe,EAAG,OAAM,IAAI,UAAU;AAC9G,QAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,MAAM,EAAG,OAAM,IAAI,UAAU;AACxG,QAAI,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,KAAK,EAAG,OAAM,IAAI,SAAS;AACzE,QAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,QAAQ,EAAG,OAAM,IAAI,KAAK;AAC5F,QAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,cAAc,EAAG,OAAM,IAAI,iBAAiB;AAE3F,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEQ,mBAAmB,aAA+B;AACxD,QAAI,CAAC,YAAa,QAAO,CAAC;AAC1B,UAAM,UAAU,YAAY,MAAM,iDAAiD;AACnF,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAI,OAAK,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC;AAAA,EACtE;AAAA,EAEQ,YAAY,UAA0B;AAC5C,YAAQ,UAAU;AAAA,MAChB,KAAK;AAAG,eAAO;AAAA,MACf,KAAK;AAAG,eAAO;AAAA,MACf,KAAK;AAAG,eAAO;AAAA,MACf,KAAK;AAAG,eAAO;AAAA,MACf;AAAS,eAAO;AAAA,IAClB;AAAA,EACF;AACF;","names":["readFile","writeFile","mkdir","existsSync","join","join","existsSync","readFile","join","existsSync","readFile","mkdir","writeFile","data","path","readFile","writeFile","mkdir","existsSync","join","needsBootstrap","join","existsSync","readFile","mkdir","writeFile","path","path","path","fs","path","fs","path","path","path"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/guardian/insight-store.ts","../src/guardian/goal-manager.ts"],"sourcesContent":["/**\n * Insight Store - Persistent storage for Guardian insights\n * \n * Phase 1 of Guardian Agency Plan: Fix critical persistence gaps\n * \n * Persists to: .trie/memory/guardian-insights.json\n * \n * Features:\n * - Insight persistence across restarts\n * - Cooldown state persistence (prevents duplicate insights)\n * - Dismissed insight tracking\n * - Atomic writes with backup rotation\n * - Zod validation for data integrity\n */\n\nimport { mkdir, readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getTrieDirectory } from '../utils/workspace.js';\nimport { z } from 'zod';\nimport { atomicWriteJSON } from '../utils/atomic-write.js';\nimport { BackupManager } from '../utils/backup-manager.js';\nimport { safeParseAndValidate } from '../memory/validation.js';\n\n// ============================================================================\n// Schemas\n// ============================================================================\n\n/**\n * Schema for insight details\n */\nexport const InsightDetailsSchema = z.object({\n affectedFiles: z.array(z.string()).optional(),\n issueBreakdown: z.record(z.string(), z.number()).optional(),\n examples: z.array(z.string()).optional(),\n trend: z.enum(['improving', 'stable', 'worsening']).optional(),\n comparison: z.string().optional(),\n resolvedCount: z.number().optional(),\n resolvedIssues: z.array(z.object({\n file: z.string(),\n line: z.number().optional(),\n issue: z.string(),\n agent: z.string(),\n resolvedAt: z.string().optional(),\n })).optional(),\n summary: z.string().optional(),\n});\n\n/**\n * Schema for a Guardian insight\n */\nexport const GuardianInsightSchema = z.object({\n id: z.string(),\n type: z.enum(['observation', 'warning', 'suggestion', 'celebration', 'question']),\n message: z.string(),\n context: z.string().optional(),\n suggestedAction: z.string().optional(),\n actionCommand: z.string().optional(),\n relatedIssues: z.array(z.string()),\n priority: z.number().min(1).max(10),\n timestamp: z.number(),\n dismissed: z.boolean(),\n category: z.enum(['security', 'quality', 'performance', 'pattern', 'progress', 'general']),\n details: InsightDetailsSchema.optional(),\n});\n\nexport type GuardianInsight = z.infer<typeof GuardianInsightSchema>;\n\n/**\n * Schema for the entire insight store file\n */\nexport const InsightStoreDataSchema = z.object({\n version: z.literal(1),\n insights: z.array(GuardianInsightSchema),\n cooldowns: z.record(z.string(), z.number()), // insightKey -> timestamp\n dismissedIds: z.array(z.string()), // Track dismissed insight IDs permanently\n lastUpdated: z.string(),\n});\n\nexport type InsightStoreData = z.infer<typeof InsightStoreDataSchema>;\n\n// ============================================================================\n// InsightStore Class\n// ============================================================================\n\n/**\n * Persistent store for Guardian insights\n * \n * Usage:\n * ```typescript\n * const store = new InsightStore(projectPath);\n * await store.load();\n * \n * await store.addInsight(insight);\n * const active = store.getActiveInsights();\n * await store.dismissInsight(insightId);\n * ```\n */\nexport class InsightStore {\n private projectPath: string;\n private data: InsightStoreData;\n private loaded: boolean = false;\n private dirty: boolean = false;\n \n // Default cooldown periods (in ms)\n static readonly COOLDOWNS: Record<string, number> = {\n 'pre-push-warning': 60000, // 1 min between pre-push warnings\n 'security-warning': 30000, // 30s between security warnings\n 'new-issues': 30000, // 30s between new issue observations\n 'celebration': 60000, // 1 min between celebrations\n 'pattern-suggestion': 120000, // 2 min between pattern suggestions\n 'accessibility-visual-qa': 300000, // 5 min between visual QA suggestions\n 'goal-suggestion': 300000, // 5 min between goal suggestions\n 'risk-prediction': 180000, // 3 min between risk predictions\n 'hypothesis-update': 600000, // 10 min between hypothesis updates\n 'auto-escalation': 300000, // 5 min between auto-escalations\n };\n \n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.data = this.createEmptyData();\n }\n \n /**\n * Get the storage file path\n */\n private getStorePath(): string {\n return join(getTrieDirectory(this.projectPath), 'memory', 'guardian-insights.json');\n }\n \n /**\n * Create empty data structure\n */\n private createEmptyData(): InsightStoreData {\n return {\n version: 1,\n insights: [],\n cooldowns: {},\n dismissedIds: [],\n lastUpdated: new Date().toISOString(),\n };\n }\n \n /**\n * Load insights from disk\n * \n * If the file is corrupted, attempts recovery from backup.\n * Returns empty data if no valid file/backup exists.\n */\n async load(): Promise<InsightStoreData> {\n if (this.loaded) {\n return this.data;\n }\n \n const storePath = this.getStorePath();\n \n try {\n if (existsSync(storePath)) {\n const content = await readFile(storePath, 'utf-8');\n const result = safeParseAndValidate(content, InsightStoreDataSchema);\n \n if (result.success) {\n this.data = result.data;\n this.loaded = true;\n // Deduplicate any existing duplicate insights\n this.deduplicateInsights();\n return this.data;\n }\n \n // Validation failed - attempt recovery from backup\n console.error(` Insight store corrupted: ${result.error}`);\n const backupManager = new BackupManager(storePath);\n \n if (await backupManager.recoverFromBackup()) {\n console.error(' Recovered from backup');\n const recovered = await readFile(storePath, 'utf-8');\n const recoveredResult = safeParseAndValidate(recovered, InsightStoreDataSchema);\n if (recoveredResult.success) {\n this.data = recoveredResult.data;\n this.loaded = true;\n // Deduplicate any existing duplicate insights\n this.deduplicateInsights();\n return this.data;\n }\n }\n \n console.error(' No valid backup found, starting fresh');\n }\n } catch (error) {\n // File doesn't exist or recovery failed - start fresh\n console.error(` Could not load insight store: ${error}`);\n }\n \n this.data = this.createEmptyData();\n this.loaded = true;\n return this.data;\n }\n \n /**\n * Deduplicate existing insights on load\n * Keeps the most recent instance of each unique insight\n */\n private deduplicateInsights(): void {\n const seen = new Map<string, number>(); // contentKey -> index of first occurrence\n const toRemove: number[] = [];\n \n // Process from newest to oldest (insights are sorted by recency)\n for (let i = 0; i < this.data.insights.length; i++) {\n const insight = this.data.insights[i];\n if (!insight) continue;\n \n const contentKey = this.getContentKey(insight);\n \n if (seen.has(contentKey)) {\n // This is a duplicate - mark for removal\n toRemove.push(i);\n } else {\n seen.set(contentKey, i);\n }\n }\n \n // Remove duplicates (reverse order to preserve indices)\n if (toRemove.length > 0) {\n for (let i = toRemove.length - 1; i >= 0; i--) {\n const idx = toRemove[i];\n if (idx !== undefined) {\n this.data.insights.splice(idx, 1);\n }\n }\n this.dirty = true;\n }\n }\n \n /**\n * Save insights to disk\n * \n * Creates backup before writing, uses atomic write.\n */\n async save(): Promise<void> {\n if (!this.dirty && this.loaded) {\n return; // No changes to save\n }\n \n const storePath = this.getStorePath();\n const memoryDir = join(getTrieDirectory(this.projectPath), 'memory');\n \n // Ensure directory exists\n await mkdir(memoryDir, { recursive: true });\n \n // Create backup before writing\n const backupManager = new BackupManager(storePath);\n await backupManager.createBackup();\n \n // Update timestamp\n this.data.lastUpdated = new Date().toISOString();\n \n // Atomic write\n await atomicWriteJSON(storePath, this.data);\n \n this.dirty = false;\n }\n \n /**\n * Generate a content-based key for deduplication\n * Insights with the same content key are considered duplicates\n */\n private getContentKey(insight: GuardianInsight): string {\n // Normalize the message by removing specific numbers/counts that might vary slightly\n // e.g., \"Found 30 security issues\" and \"Found 31 security issues\" are the same insight\n const normalizedMessage = insight.message\n .replace(/\\d+/g, 'N') // Replace all numbers with N\n .toLowerCase()\n .trim();\n \n return `${insight.type}:${insight.category}:${normalizedMessage}`;\n }\n \n /**\n * Add an insight to the store\n * \n * Checks for duplicates using both insight ID and content similarity.\n * If a similar insight already exists (same type, category, and normalized message),\n * updates its timestamp instead of creating a duplicate.\n * Respects cooldowns to prevent insight spam.\n */\n async addInsight(insight: GuardianInsight): Promise<boolean> {\n await this.load();\n \n // Check if already exists by ID\n if (this.data.insights.some(i => i.id === insight.id)) {\n return false;\n }\n \n // Check if ID was previously dismissed (don't re-add)\n if (this.data.dismissedIds.includes(insight.id)) {\n return false;\n }\n \n // Check for content-based duplicates (same type, category, similar message)\n const contentKey = this.getContentKey(insight);\n const existingIndex = this.data.insights.findIndex(i => \n !i.dismissed && this.getContentKey(i) === contentKey\n );\n \n if (existingIndex >= 0) {\n // Update existing insight instead of adding duplicate\n const existing = this.data.insights[existingIndex];\n if (existing) {\n // Update with new data but keep the original ID\n existing.timestamp = insight.timestamp;\n existing.message = insight.message; // Update with current counts\n existing.details = insight.details; // Update details\n existing.relatedIssues = insight.relatedIssues;\n existing.suggestedAction = insight.suggestedAction;\n \n // Move to front of list\n this.data.insights.splice(existingIndex, 1);\n this.data.insights.unshift(existing);\n \n this.dirty = true;\n await this.save();\n }\n return false; // Return false to indicate no new insight was created\n }\n \n // Add to front of list\n this.data.insights.unshift(insight);\n \n // Keep only last 100 insights\n if (this.data.insights.length > 100) {\n this.data.insights = this.data.insights.slice(0, 100);\n }\n \n this.dirty = true;\n await this.save();\n \n return true;\n }\n \n /**\n * Check if a cooldown has expired for an insight type\n */\n canCreateInsight(insightKey: string): boolean {\n const lastTime = this.data.cooldowns[insightKey];\n const cooldown = InsightStore.COOLDOWNS[insightKey] || 30000;\n \n if (!lastTime) return true;\n return Date.now() - lastTime > cooldown;\n }\n \n /**\n * Mark that an insight type was created (set cooldown)\n */\n async markInsightCreated(insightKey: string): Promise<void> {\n await this.load();\n this.data.cooldowns[insightKey] = Date.now();\n this.dirty = true;\n await this.save();\n }\n \n /**\n * Get active (non-dismissed) insights\n * \n * Returns insights sorted by priority (highest first),\n * limited to the specified count.\n */\n getActiveInsights(limit: number = 5): GuardianInsight[] {\n return this.data.insights\n .filter(i => !i.dismissed)\n .sort((a, b) => b.priority - a.priority)\n .slice(0, limit);\n }\n \n /**\n * Get all insights (including dismissed)\n */\n getAllInsights(): GuardianInsight[] {\n return [...this.data.insights];\n }\n \n /**\n * Dismiss an insight by ID\n */\n async dismissInsight(insightId: string): Promise<boolean> {\n await this.load();\n \n const insight = this.data.insights.find(i => i.id === insightId);\n if (!insight) {\n return false;\n }\n \n insight.dismissed = true;\n \n // Track permanently dismissed IDs\n if (!this.data.dismissedIds.includes(insightId)) {\n this.data.dismissedIds.push(insightId);\n \n // Keep only last 500 dismissed IDs\n if (this.data.dismissedIds.length > 500) {\n this.data.dismissedIds = this.data.dismissedIds.slice(-500);\n }\n }\n \n this.dirty = true;\n await this.save();\n \n return true;\n }\n \n /**\n * Remove an insight entirely\n */\n async removeInsight(insightId: string): Promise<boolean> {\n await this.load();\n \n const index = this.data.insights.findIndex(i => i.id === insightId);\n if (index === -1) {\n return false;\n }\n \n this.data.insights.splice(index, 1);\n this.dirty = true;\n await this.save();\n \n return true;\n }\n \n /**\n * Clear all cooldowns\n */\n async clearCooldowns(): Promise<void> {\n await this.load();\n this.data.cooldowns = {};\n this.dirty = true;\n await this.save();\n }\n \n /**\n * Get insight by ID\n */\n getInsight(insightId: string): GuardianInsight | undefined {\n return this.data.insights.find(i => i.id === insightId);\n }\n \n /**\n * Update an existing insight\n */\n async updateInsight(insightId: string, updates: Partial<GuardianInsight>): Promise<boolean> {\n await this.load();\n \n const insight = this.data.insights.find(i => i.id === insightId);\n if (!insight) {\n return false;\n }\n \n Object.assign(insight, updates);\n this.dirty = true;\n await this.save();\n \n return true;\n }\n \n /**\n * Get insights by category\n */\n getInsightsByCategory(category: GuardianInsight['category']): GuardianInsight[] {\n return this.data.insights.filter(i => i.category === category && !i.dismissed);\n }\n \n /**\n * Get insights by type\n */\n getInsightsByType(type: GuardianInsight['type']): GuardianInsight[] {\n return this.data.insights.filter(i => i.type === type && !i.dismissed);\n }\n \n /**\n * Get insights from the last N hours\n */\n getRecentInsights(hours: number = 24): GuardianInsight[] {\n const cutoff = Date.now() - (hours * 60 * 60 * 1000);\n return this.data.insights.filter(i => i.timestamp >= cutoff);\n }\n \n /**\n * Get statistics about insights\n */\n getStats(): {\n total: number;\n active: number;\n dismissed: number;\n byCategory: Record<string, number>;\n byType: Record<string, number>;\n } {\n const stats = {\n total: this.data.insights.length,\n active: 0,\n dismissed: 0,\n byCategory: {} as Record<string, number>,\n byType: {} as Record<string, number>,\n };\n \n for (const insight of this.data.insights) {\n if (insight.dismissed) {\n stats.dismissed++;\n } else {\n stats.active++;\n }\n \n stats.byCategory[insight.category] = (stats.byCategory[insight.category] || 0) + 1;\n stats.byType[insight.type] = (stats.byType[insight.type] || 0) + 1;\n }\n \n return stats;\n }\n \n /**\n * Prune old insights (older than N days)\n */\n async pruneOldInsights(daysToKeep: number = 30): Promise<number> {\n await this.load();\n \n const cutoff = Date.now() - (daysToKeep * 24 * 60 * 60 * 1000);\n const originalCount = this.data.insights.length;\n \n this.data.insights = this.data.insights.filter(i => i.timestamp >= cutoff);\n \n const pruned = originalCount - this.data.insights.length;\n if (pruned > 0) {\n this.dirty = true;\n await this.save();\n }\n \n return pruned;\n }\n \n /**\n * Check if the store has been loaded\n */\n isLoaded(): boolean {\n return this.loaded;\n }\n \n /**\n * Force reload from disk\n */\n async reload(): Promise<InsightStoreData> {\n this.loaded = false;\n this.dirty = false;\n return this.load();\n }\n}\n\n// ============================================================================\n// Singleton Management\n// ============================================================================\n\nconst insightStores: Map<string, InsightStore> = new Map();\n\n/**\n * Get the InsightStore for a project (singleton per project)\n */\nexport function getInsightStore(projectPath: string): InsightStore {\n let store = insightStores.get(projectPath);\n if (!store) {\n store = new InsightStore(projectPath);\n insightStores.set(projectPath, store);\n }\n return store;\n}\n\n/**\n * Clear all InsightStore instances (for testing)\n */\nexport function clearInsightStores(): void {\n insightStores.clear();\n}\n","/**\n * Goal Manager - Autonomous goal generation and tracking\n * \n * Phase 2 of Guardian Agency Plan: Autonomous Goals\n * \n * Features:\n * - Auto-generates goals from incident patterns\n * - Tracks goal progress over time\n * - Presents goals to users for acceptance/rejection\n * - Adaptive goal difficulty based on team velocity\n * - Goal achievement celebrations\n */\n\nimport type { Goal } from './guardian-state.js';\nimport { getGuardianState } from './guardian-state.js';\nimport { getInsightStore, type GuardianInsight } from './insight-store.js';\nimport { searchIssues, getMemoryStats } from '../memory/issue-store.js';\nimport { basename } from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A pattern detected from incident history\n */\nexport interface IncidentPattern {\n type: 'file-cluster' | 'severity-trend' | 'agent-concentration' | 'time-pattern';\n description: string;\n metric: string;\n currentValue: number;\n suggestedTarget: number;\n confidence: number; // 0-1\n evidence: string[];\n category?: 'security' | 'quality' | 'performance' | 'coverage' | 'general';\n}\n\n/**\n * Goal opportunity - a potential goal before user acceptance\n */\nexport interface GoalOpportunity {\n pattern: IncidentPattern;\n goal: Omit<Goal, 'id' | 'createdAt' | 'updatedAt'>;\n reasoning: string;\n}\n\n/**\n * Configuration for goal generation\n */\nexport interface GoalGenerationConfig {\n minConfidence: number; // Minimum confidence to suggest goal (0-1)\n maxActiveGoals: number; // Maximum concurrent active goals\n goalDurationDays: number; // Default goal duration in days\n reductionTargetPercent: number; // Target reduction percentage\n}\n\nconst DEFAULT_CONFIG: GoalGenerationConfig = {\n minConfidence: 0.6,\n maxActiveGoals: 3,\n goalDurationDays: 14,\n reductionTargetPercent: 50,\n};\n\n// ============================================================================\n// GoalManager Class\n// ============================================================================\n\n/**\n * Manages autonomous goal generation and tracking\n */\nexport class GoalManager {\n private projectPath: string;\n private config: GoalGenerationConfig;\n private guardianState;\n private insightStore;\n \n constructor(projectPath: string, config: Partial<GoalGenerationConfig> = {}) {\n this.projectPath = projectPath;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.guardianState = getGuardianState(projectPath);\n this.insightStore = getInsightStore(projectPath);\n }\n \n /**\n * Analyze incident patterns from memory\n */\n async analyzeIncidentPatterns(): Promise<IncidentPattern[]> {\n const patterns: IncidentPattern[] = [];\n \n try {\n // Get recent issues for analysis\n const stats = await getMemoryStats(this.projectPath);\n const recentIssues = await searchIssues('', {\n workDir: this.projectPath,\n limit: 500,\n includeResolved: true,\n });\n \n if (recentIssues.length < 5) {\n return patterns; // Not enough data for pattern detection\n }\n \n // 1. Analyze file clusters (files with most issues)\n const fileIssueCount = new Map<string, number>();\n for (const { issue } of recentIssues) {\n const file = issue.file;\n fileIssueCount.set(file, (fileIssueCount.get(file) || 0) + 1);\n }\n \n const sortedFiles = [...fileIssueCount.entries()]\n .sort((a, b) => b[1] - a[1]);\n \n // Detect hot directories\n const dirIssueCount = new Map<string, number>();\n for (const [file, count] of sortedFiles) {\n const parts = file.split('/');\n if (parts.length > 1) {\n const dir = parts.slice(0, -1).join('/');\n dirIssueCount.set(dir, (dirIssueCount.get(dir) || 0) + count);\n }\n }\n \n const sortedDirs = [...dirIssueCount.entries()]\n .sort((a, b) => b[1] - a[1]);\n \n if (sortedDirs.length > 0) {\n const [topDir, topDirCount] = sortedDirs[0]!;\n const totalIssues = recentIssues.length;\n const percentage = (topDirCount / totalIssues) * 100;\n \n if (percentage >= 30) {\n patterns.push({\n type: 'file-cluster',\n description: `${basename(topDir)}/ has ${percentage.toFixed(0)}% of issues`,\n metric: `${topDir}_issues`,\n currentValue: topDirCount,\n suggestedTarget: Math.floor(topDirCount * (1 - this.config.reductionTargetPercent / 100)),\n confidence: Math.min(0.9, percentage / 100 + 0.3),\n evidence: [\n `${topDirCount} issues in ${topDir}/`,\n `${percentage.toFixed(0)}% of total issues`,\n `Top files: ${sortedFiles.filter(([f]) => f.startsWith(topDir)).slice(0, 3).map(([f]) => basename(f)).join(', ')}`,\n ],\n category: 'quality',\n });\n }\n }\n \n // 2. Analyze severity trends\n const criticalCount = recentIssues.filter(r => r.issue.severity === 'critical').length;\n const seriousCount = recentIssues.filter(r => r.issue.severity === 'serious').length;\n \n if (criticalCount >= 3) {\n patterns.push({\n type: 'severity-trend',\n description: `${criticalCount} critical issues need attention`,\n metric: 'critical_issues',\n currentValue: criticalCount,\n suggestedTarget: 0,\n confidence: Math.min(0.95, 0.5 + criticalCount * 0.1),\n evidence: [\n `${criticalCount} critical severity issues`,\n `${seriousCount} serious severity issues`,\n 'Critical issues should be zero for production safety',\n ],\n category: 'security',\n });\n }\n \n // 3. Analyze agent concentration (skill-specific issues)\n const agentIssueCount = new Map<string, number>();\n for (const { issue } of recentIssues) {\n agentIssueCount.set(issue.agent, (agentIssueCount.get(issue.agent) || 0) + 1);\n }\n \n const sortedAgents = [...agentIssueCount.entries()]\n .sort((a, b) => b[1] - a[1]);\n \n if (sortedAgents.length > 0) {\n const [topAgent, topAgentCount] = sortedAgents[0]!;\n const percentage = (topAgentCount / recentIssues.length) * 100;\n \n if (percentage >= 40 && topAgentCount >= 5) {\n const category = this.agentToCategory(topAgent);\n patterns.push({\n type: 'agent-concentration',\n description: `${topAgent} skill finds ${percentage.toFixed(0)}% of issues`,\n metric: `${topAgent}_issues`,\n currentValue: topAgentCount,\n suggestedTarget: Math.floor(topAgentCount * 0.5),\n confidence: Math.min(0.85, percentage / 100 + 0.2),\n evidence: [\n `${topAgentCount} issues from ${topAgent}`,\n `${percentage.toFixed(0)}% of all issues`,\n `Suggests focused improvement in ${category} area`,\n ],\n category,\n });\n }\n }\n \n // 4. Detect improvement trends (for streak goals)\n if (stats.improvementTrend === 'improving') {\n patterns.push({\n type: 'time-pattern',\n description: 'Quality is improving - maintain the streak',\n metric: 'clean_scans',\n currentValue: 0,\n suggestedTarget: 5,\n confidence: 0.7,\n evidence: [\n 'Historical trend shows improvement',\n 'Momentum is positive',\n 'Streak goal can maintain motivation',\n ],\n category: 'quality',\n });\n }\n \n } catch (error) {\n console.error('Failed to analyze incident patterns:', error);\n }\n \n return patterns;\n }\n \n /**\n * Convert agent name to category\n */\n private agentToCategory(agent: string): 'security' | 'quality' | 'performance' | 'coverage' | 'general' {\n const categoryMap: Record<string, 'security' | 'quality' | 'performance' | 'coverage' | 'general'> = {\n 'security': 'security',\n 'privacy': 'security',\n 'soc2': 'security',\n 'performance': 'performance',\n 'accessibility': 'quality',\n 'test': 'coverage',\n 'typecheck': 'quality',\n 'bug-finding': 'quality',\n };\n return categoryMap[agent] || 'general';\n }\n \n /**\n * Generate goal opportunities from patterns\n */\n async generateGoalOpportunities(): Promise<GoalOpportunity[]> {\n const patterns = await this.analyzeIncidentPatterns();\n const opportunities: GoalOpportunity[] = [];\n \n // Filter by confidence threshold\n const validPatterns = patterns.filter(p => p.confidence >= this.config.minConfidence);\n \n // Check current active goals\n await this.guardianState.load();\n const activeGoals = this.guardianState.getActiveGoals();\n \n // Don't suggest too many goals\n const slotsAvailable = this.config.maxActiveGoals - activeGoals.length;\n if (slotsAvailable <= 0) {\n return opportunities;\n }\n \n // Convert patterns to goal opportunities\n for (const pattern of validPatterns.slice(0, slotsAvailable)) {\n const goalType = pattern.type === 'time-pattern' ? 'streak' : 'reduction';\n const deadline = new Date();\n deadline.setDate(deadline.getDate() + this.config.goalDurationDays);\n \n opportunities.push({\n pattern,\n goal: {\n description: this.generateGoalDescription(pattern),\n type: goalType,\n metric: pattern.metric,\n target: pattern.suggestedTarget,\n currentValue: pattern.currentValue,\n startValue: pattern.currentValue,\n status: 'active',\n autoGenerated: true,\n confidence: pattern.confidence,\n deadline: deadline.toISOString(),\n category: pattern.category,\n evidence: pattern.evidence,\n },\n reasoning: this.generateGoalReasoning(pattern),\n });\n }\n \n return opportunities;\n }\n \n /**\n * Generate a human-readable goal description\n */\n private generateGoalDescription(pattern: IncidentPattern): string {\n switch (pattern.type) {\n case 'file-cluster':\n return `Reduce issues in ${pattern.description.split(' ')[0]} by ${this.config.reductionTargetPercent}%`;\n case 'severity-trend':\n return 'Eliminate all critical issues';\n case 'agent-concentration':\n return `Reduce ${pattern.description.split(' ')[0]} issues by 50%`;\n case 'time-pattern':\n return 'Achieve 5 consecutive clean scans';\n default:\n return pattern.description;\n }\n }\n \n /**\n * Generate reasoning for why this goal was suggested\n */\n private generateGoalReasoning(pattern: IncidentPattern): string {\n const evidence = pattern.evidence.join('. ');\n return `Based on analysis: ${evidence}. Confidence: ${(pattern.confidence * 100).toFixed(0)}%`;\n }\n \n /**\n * Auto-generate goals and create them (with auto-generated status)\n * \n * Returns goals that need user acceptance.\n */\n async autoGenerateGoals(): Promise<Goal[]> {\n const opportunities = await this.generateGoalOpportunities();\n const createdGoals: Goal[] = [];\n \n for (const opportunity of opportunities) {\n const goal: Goal = {\n id: `goal-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n ...opportunity.goal,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n \n await this.guardianState.addGoal(goal);\n createdGoals.push(goal);\n \n // Create insight about the new goal\n if (this.insightStore.canCreateInsight('goal-suggestion')) {\n const insight: GuardianInsight = {\n id: `insight-goal-${goal.id}`,\n type: 'suggestion',\n message: `New goal suggested: ${goal.description}`,\n context: opportunity.reasoning,\n suggestedAction: 'Review and accept/reject this goal',\n relatedIssues: [],\n priority: 6,\n timestamp: Date.now(),\n dismissed: false,\n category: 'progress',\n details: {\n examples: opportunity.pattern.evidence,\n },\n };\n await this.insightStore.addInsight(insight);\n await this.insightStore.markInsightCreated('goal-suggestion');\n }\n }\n \n return createdGoals;\n }\n \n /**\n * Update goal progress based on current state\n */\n async updateGoalProgress(): Promise<void> {\n await this.guardianState.load();\n const activeGoals = this.guardianState.getActiveGoals();\n \n for (const goal of activeGoals) {\n const currentValue = await this.measureGoalMetric(goal);\n \n // Update current value\n await this.guardianState.updateGoal(goal.id, { currentValue });\n \n // Check if goal achieved\n if (this.isGoalAchieved(goal, currentValue)) {\n await this.guardianState.updateGoal(goal.id, {\n status: 'achieved',\n achievedAt: new Date().toISOString(),\n currentValue,\n });\n \n // Celebrate!\n await this.celebrateGoalAchievement(goal);\n }\n \n // Check if goal failed (past deadline and not achieved)\n if (goal.deadline) {\n const deadline = new Date(goal.deadline);\n if (Date.now() > deadline.getTime() && !this.isGoalAchieved(goal, currentValue)) {\n await this.guardianState.updateGoal(goal.id, {\n status: 'failed',\n currentValue,\n });\n }\n }\n }\n }\n \n /**\n * Measure the current value of a goal's metric\n * \n * Supports both structured metrics and semantic/natural language goals\n */\n private async measureGoalMetric(goal: Goal): Promise<number> {\n try {\n const issues = await searchIssues('', {\n workDir: this.projectPath,\n limit: 1000,\n includeResolved: false,\n });\n \n // Structured metrics (auto-generated goals)\n if (goal.metric.endsWith('_issues')) {\n const prefix = goal.metric.replace('_issues', '');\n \n // Check if it's a directory metric\n if (prefix.includes('/')) {\n return issues.filter(r => r.issue.file.startsWith(prefix)).length;\n }\n \n // Check if it's an agent metric\n return issues.filter(r => r.issue.agent === prefix).length;\n }\n \n if (goal.metric === 'critical_issues') {\n return issues.filter(r => r.issue.severity === 'critical').length;\n }\n \n // Semantic goal tracking - match description to issue types\n const desc = goal.description.toLowerCase();\n \n // Path-aware matching for directory/module-specific goals\n // Matches patterns like \"in the auth module\", \"in src/\", \"in components folder\"\n const dirMatch = goal.description.match(/in\\s+(?:the\\s+)?(\\S+?)(?:\\s+(?:module|folder|directory|dir))?(?:\\s|$)/i);\n if (dirMatch && dirMatch[1]) {\n const dirName = dirMatch[1].toLowerCase().replace(/[/\\\\]$/, ''); // Normalize trailing slashes\n const matchingIssues = issues.filter(r => {\n const filePath = r.issue.file.toLowerCase();\n // Match directory name anywhere in path (e.g., \"auth\" matches \"src/auth/login.ts\")\n return filePath.includes(`/${dirName}/`) || \n filePath.includes(`\\\\${dirName}\\\\`) ||\n filePath.startsWith(`${dirName}/`) ||\n filePath.startsWith(`${dirName}\\\\`);\n });\n if (matchingIssues.length > 0 || desc.includes(dirName)) {\n return matchingIssues.length;\n }\n }\n \n // Dead code / unused code goals\n if (desc.includes('dead code') || desc.includes('unused') || desc.includes('remove unused')) {\n const deadCodeIssues = issues.filter(r => {\n const msg = r.issue.issue.toLowerCase();\n return msg.includes('unused') || msg.includes('dead code') || \n msg.includes('never used') || msg.includes('unreachable') ||\n msg.includes('no-unused') || msg.includes('defined but never');\n });\n return deadCodeIssues.length;\n }\n \n // Security goals\n if (desc.includes('security') || desc.includes('vulnerab') || desc.includes('fix security')) {\n const securityIssues = issues.filter(r => \n r.issue.agent === 'security' || r.issue.agent === 'privacy' ||\n r.issue.severity === 'critical'\n );\n return securityIssues.length;\n }\n \n // Type safety goals\n if (desc.includes('type') || desc.includes('typescript') || desc.includes('any type')) {\n const typeIssues = issues.filter(r => \n r.issue.agent === 'typecheck' ||\n r.issue.issue.toLowerCase().includes('type') ||\n r.issue.issue.toLowerCase().includes('any')\n );\n return typeIssues.length;\n }\n \n // Test coverage goals\n if (desc.includes('test') || desc.includes('coverage')) {\n const testIssues = issues.filter(r => \n r.issue.agent === 'test' ||\n r.issue.issue.toLowerCase().includes('test') ||\n r.issue.issue.toLowerCase().includes('coverage')\n );\n return testIssues.length;\n }\n \n // Performance goals\n if (desc.includes('performance') || desc.includes('slow') || desc.includes('optimize')) {\n const perfIssues = issues.filter(r => \n r.issue.agent === 'performance' ||\n r.issue.issue.toLowerCase().includes('performance') ||\n r.issue.issue.toLowerCase().includes('slow')\n );\n return perfIssues.length;\n }\n \n // Accessibility goals\n if (desc.includes('accessibility') || desc.includes('a11y') || desc.includes('accessible')) {\n const a11yIssues = issues.filter(r => \n r.issue.agent === 'accessibility' ||\n r.issue.issue.toLowerCase().includes('accessibility')\n );\n return a11yIssues.length;\n }\n \n // Bug-related goals\n if (desc.includes('bug') || desc.includes('fix') || desc.includes('error')) {\n const bugIssues = issues.filter(r => \n r.issue.agent === 'bug-finding' ||\n r.issue.severity === 'critical' ||\n r.issue.severity === 'serious'\n );\n return bugIssues.length;\n }\n \n // Quality goals (general)\n if (desc.includes('quality') || desc.includes('clean') || desc.includes('improve')) {\n // Count all issues as baseline for quality\n return issues.length;\n }\n \n // Default: total issues\n return issues.length;\n } catch {\n return goal.currentValue; // Return existing value on error\n }\n }\n \n /**\n * Check if a goal has been achieved\n */\n private isGoalAchieved(goal: Goal, currentValue: number): boolean {\n switch (goal.type) {\n case 'reduction':\n return currentValue <= goal.target;\n case 'score':\n return currentValue >= goal.target;\n case 'streak':\n return currentValue >= goal.target;\n default:\n return currentValue <= goal.target;\n }\n }\n \n /**\n * Create a celebration insight for goal achievement\n */\n private async celebrateGoalAchievement(goal: Goal): Promise<void> {\n // Find resolved issues that match this goal's metric\n const resolvedDetails = await this.getResolvedIssuesForGoal(goal);\n \n // Validate required fields\n if (goal.startValue === undefined || goal.startValue === null) {\n throw new Error(`Goal ${goal.id} missing startValue`);\n }\n if (goal.currentValue === undefined || goal.currentValue === null) {\n throw new Error(`Goal ${goal.id} missing currentValue`);\n }\n if (goal.target === undefined || goal.target === null) {\n throw new Error(`Goal ${goal.id} missing target`);\n }\n \n // Validate resolvedDetails structure\n for (let i = 0; i < resolvedDetails.length; i++) {\n const issue = resolvedDetails[i];\n if (!issue) {\n throw new Error(`Resolved issue at index ${i} is null/undefined`);\n }\n if (!issue.file) {\n throw new Error(`Resolved issue at index ${i} missing file field`);\n }\n if (!issue.issue) {\n throw new Error(`Resolved issue at index ${i} missing issue description`);\n }\n if (!issue.agent) {\n throw new Error(`Resolved issue at index ${i} missing agent field`);\n }\n }\n \n const insight: GuardianInsight = {\n id: `insight-achieved-${goal.id}`,\n type: 'celebration',\n message: `Goal achieved: ${goal.description}!`,\n context: `Started at ${goal.startValue}, now at ${goal.currentValue}. Target was ${goal.target}.`,\n relatedIssues: [],\n priority: 8,\n timestamp: Date.now(),\n dismissed: false,\n category: 'progress',\n details: {\n resolvedCount: resolvedDetails.length,\n resolvedIssues: resolvedDetails.slice(0, 20).map(issue => ({\n file: issue.file,\n line: issue.line,\n issue: issue.issue,\n agent: issue.agent,\n resolvedAt: issue.resolvedAt,\n })),\n summary: resolvedDetails.length > 0 \n ? `Resolved ${resolvedDetails.length} issue${resolvedDetails.length > 1 ? 's' : ''} matching this goal`\n : 'Progress tracked via metric reduction',\n },\n };\n \n // Validate insight structure before saving\n if (!insight.details) {\n throw new Error('Failed to create details object for goal achievement insight');\n }\n if (insight.details.resolvedCount === undefined) {\n throw new Error('resolvedCount is undefined in goal achievement insight');\n }\n if (insight.details.resolvedCount > 0 && (!insight.details.resolvedIssues || insight.details.resolvedIssues.length === 0)) {\n throw new Error(`resolvedCount is ${insight.details.resolvedCount} but resolvedIssues array is empty`);\n }\n if (insight.details.resolvedCount !== insight.details.resolvedIssues?.length) {\n throw new Error(`resolvedCount (${insight.details.resolvedCount}) doesn't match resolvedIssues length (${insight.details.resolvedIssues?.length})`);\n }\n \n await this.insightStore.addInsight(insight);\n }\n\n /**\n * Get resolved issues that match a goal's metric pattern\n */\n private async getResolvedIssuesForGoal(goal: Goal): Promise<Array<{ file: string; line: number | undefined; issue: string; agent: string; resolvedAt: string | undefined }>> {\n try {\n // Get all resolved issues\n const allResolved = await searchIssues('', {\n workDir: this.projectPath,\n limit: 1000,\n includeResolved: true,\n });\n \n // Filter to only resolved issues\n const resolved = allResolved\n .map(r => r.issue)\n .filter(issue => issue.resolved === true);\n \n // Filter by goal's metric pattern (same logic as measureGoalMetric)\n const desc = goal.description.toLowerCase();\n const metric = goal.metric.toLowerCase();\n \n let matchingResolved = resolved;\n \n // Match by metric pattern\n if (metric.endsWith('_issues')) {\n const prefix = metric.replace('_issues', '');\n if (prefix.includes('/')) {\n matchingResolved = resolved.filter(i => i.file.startsWith(prefix));\n } else {\n matchingResolved = resolved.filter(i => i.agent === prefix);\n }\n } else if (metric === 'critical_issues') {\n matchingResolved = resolved.filter(i => i.severity === 'critical');\n } else {\n // Semantic matching (same as measureGoalMetric)\n if (desc.includes('dead code') || desc.includes('unused') || desc.includes('remove unused')) {\n matchingResolved = resolved.filter(i => {\n const msg = i.issue.toLowerCase();\n return msg.includes('unused') || msg.includes('dead code') || \n msg.includes('never used') || msg.includes('unreachable') ||\n msg.includes('no-unused') || msg.includes('defined but never');\n });\n } else if (desc.includes('security') || desc.includes('vulnerab') || desc.includes('fix security')) {\n matchingResolved = resolved.filter(i => \n i.agent === 'security' || i.agent === 'privacy' || i.severity === 'critical'\n );\n } else if (desc.includes('type') || desc.includes('typescript') || desc.includes('any type')) {\n matchingResolved = resolved.filter(i => \n i.agent === 'typecheck' ||\n i.issue.toLowerCase().includes('type') ||\n i.issue.toLowerCase().includes('any')\n );\n } else if (desc.includes('test') || desc.includes('coverage')) {\n matchingResolved = resolved.filter(i => \n i.agent === 'test' ||\n i.issue.toLowerCase().includes('test') ||\n i.issue.toLowerCase().includes('coverage')\n );\n } else if (desc.includes('performance') || desc.includes('slow') || desc.includes('optimize')) {\n matchingResolved = resolved.filter(i => \n i.agent === 'performance' ||\n i.issue.toLowerCase().includes('performance') ||\n i.issue.toLowerCase().includes('slow')\n );\n } else if (desc.includes('accessibility') || desc.includes('a11y') || desc.includes('accessible')) {\n matchingResolved = resolved.filter(i => \n i.agent === 'accessibility' ||\n i.issue.toLowerCase().includes('accessibility')\n );\n } else if (desc.includes('bug') || desc.includes('fix') || desc.includes('error')) {\n matchingResolved = resolved.filter(i => \n i.agent === 'bug-finding' ||\n i.severity === 'critical' ||\n i.severity === 'serious'\n );\n }\n }\n \n // Filter by resolvedAt timestamp (only include issues resolved during goal's lifetime)\n const goalCreatedAt = new Date(goal.createdAt).getTime();\n const goalAchievedAt = goal.achievedAt ? new Date(goal.achievedAt).getTime() : Date.now();\n \n return matchingResolved\n .filter(issue => {\n if (!issue.resolvedAt) return false;\n const resolvedAt = new Date(issue.resolvedAt).getTime();\n return resolvedAt >= goalCreatedAt && resolvedAt <= goalAchievedAt;\n })\n .sort((a, b) => {\n // Sort by resolvedAt, most recent first\n const aTime = a.resolvedAt ? new Date(a.resolvedAt).getTime() : 0;\n const bTime = b.resolvedAt ? new Date(b.resolvedAt).getTime() : 0;\n return bTime - aTime;\n });\n } catch {\n return [];\n }\n }\n \n /**\n * Accept an auto-generated goal\n */\n async acceptGoal(goalId: string): Promise<boolean> {\n return this.guardianState.respondToGoal(goalId, true);\n }\n \n /**\n * Reject an auto-generated goal\n */\n async rejectGoal(goalId: string): Promise<boolean> {\n return this.guardianState.respondToGoal(goalId, false);\n }\n \n /**\n * Get pending auto-generated goals (awaiting acceptance)\n */\n getPendingGoals(): Goal[] {\n return this.guardianState.getAutoGeneratedGoals()\n .filter(g => g.status === 'active');\n }\n \n /**\n * Get goal progress summary\n */\n getGoalProgressSummary(): {\n active: number;\n achieved: number;\n failed: number;\n pending: number;\n } {\n const goals = this.guardianState.getAllGoals();\n return {\n active: goals.filter(g => g.status === 'active').length,\n achieved: goals.filter(g => g.status === 'achieved').length,\n failed: goals.filter(g => g.status === 'failed').length,\n pending: goals.filter(g => g.autoGenerated && g.status === 'active').length,\n };\n }\n}\n\n// ============================================================================\n// Adaptive Scan Frequency\n// ============================================================================\n\n/**\n * Calculate optimal scan frequency based on current risk level\n */\nexport async function calculateAdaptiveScanFrequency(projectPath: string): Promise<{\n frequencyMs: number;\n reason: string;\n}> {\n const guardianState = getGuardianState(projectPath);\n await guardianState.load();\n \n try {\n const stats = await getMemoryStats(projectPath);\n const issues = await searchIssues('', {\n workDir: projectPath,\n limit: 100,\n includeResolved: false,\n });\n \n const criticalCount = issues.filter(r => r.issue.severity === 'critical').length;\n const seriousCount = issues.filter(r => r.issue.severity === 'serious').length;\n \n // High risk: scan every minute\n if (criticalCount >= 3) {\n return {\n frequencyMs: 60000,\n reason: `${criticalCount} critical issues detected - scanning frequently`,\n };\n }\n \n // Medium-high risk: scan every 2 minutes\n if (criticalCount > 0 || seriousCount >= 5) {\n return {\n frequencyMs: 120000,\n reason: `Critical or many serious issues - elevated scan frequency`,\n };\n }\n \n // Medium risk: scan every 3 minutes\n if (seriousCount > 0) {\n return {\n frequencyMs: 180000,\n reason: `${seriousCount} serious issues - moderate scan frequency`,\n };\n }\n \n // Low risk: scan every 5 minutes (default)\n if (stats.totalIssues > 10) {\n return {\n frequencyMs: 300000,\n reason: 'Some issues present - standard scan frequency',\n };\n }\n \n // Very low risk: scan every 10 minutes\n return {\n frequencyMs: 600000,\n reason: 'Code looks good - relaxed scan frequency',\n };\n \n } catch {\n // Default on error\n return {\n frequencyMs: 300000,\n reason: 'Default scan frequency (5 min)',\n };\n }\n}\n\n/**\n * Apply adaptive scan frequency\n */\nexport async function adaptScanFrequency(projectPath: string): Promise<number> {\n const guardianState = getGuardianState(projectPath);\n const { frequencyMs } = await calculateAdaptiveScanFrequency(projectPath);\n \n await guardianState.setScanFrequency(frequencyMs);\n \n return frequencyMs;\n}\n\n// ============================================================================\n// Singleton Management\n// ============================================================================\n\nconst goalManagers: Map<string, GoalManager> = new Map();\n\n/**\n * Get the GoalManager for a project (singleton per project)\n */\nexport function getGoalManager(projectPath: string): GoalManager {\n let manager = goalManagers.get(projectPath);\n if (!manager) {\n manager = new GoalManager(projectPath);\n goalManagers.set(projectPath, manager);\n }\n return manager;\n}\n\n/**\n * Clear all GoalManager instances (for testing)\n */\nexport function clearGoalManagers(): void {\n goalManagers.clear();\n}\n"],"mappings":"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","names":[]}