{"version":3,"sources":["../../src/verify/index.ts","../../src/verify/types.ts","../../src/verify/patterns.ts","../../src/verify/fast-path.ts","../../src/verify/slow-path.ts","../../src/verify/world-model.ts","../../src/verify/router.ts"],"sourcesContent":["export { DualPathVerifier } from \"./router.js\";\nexport { WorldModel } from \"./world-model.js\";\nexport { runFastPath } from \"./fast-path.js\";\nexport { runSlowPath } from \"./slow-path.js\";\nexport { DEFAULT_ROUTING_POLICY } from \"./types.js\";\nexport type {\n  SafetyClass,\n  Verdict,\n  FastPathResult,\n  SlowPathResult,\n  DualPathVerdict,\n  ToolOperation,\n  RoutingPolicy,\n} from \"./types.js\";\n","export type SafetyClass = \"read\" | \"write\" | \"destroy\" | \"network\" | \"execute\";\nexport type Verdict = \"pass\" | \"warn\" | \"block\" | \"escalate\";\n\nexport interface FastPathResult {\n  verdict: Verdict;\n  checks: Array<{\n    rule: string;\n    passed: boolean;\n    severity: \"critical\" | \"warning\" | \"info\";\n    message: string;\n  }>;\n  latencyUs: number;\n}\n\nexport interface SlowPathResult {\n  verdict: Verdict;\n  reasoning: string;\n  invariantChecks: Array<{\n    invariant: string;\n    satisfied: boolean;\n    detail: string;\n  }>;\n  latencyMs: number;\n}\n\nexport interface DualPathVerdict {\n  toolName: string;\n  fastPath: FastPathResult;\n  slowPath?: SlowPathResult;\n  finalVerdict: Verdict;\n  reason?: string;\n  totalLatencyMs: number;\n  pathTaken: \"fast\" | \"fast+slow\";\n}\n\nexport interface ToolOperation {\n  name: string;\n  input: Record<string, unknown>;\n  safetyClass: SafetyClass;\n  targetsFiles: string[];\n}\n\nexport interface RoutingPolicy {\n  alwaysSlowPathFor: SafetyClass[];\n  warnEscalatesToSlow: boolean;\n  consecutiveFailuresTriggerSlow: number;\n  maxConsecutiveFailures: number;\n  firstNTurnsFastOnly: number;\n  fileNotInGraphTriggersSlow: boolean;\n  writeWithoutReadTriggersSlow: boolean;\n}\n\nexport const DEFAULT_ROUTING_POLICY: RoutingPolicy = {\n  alwaysSlowPathFor: [\"destroy\"],\n  warnEscalatesToSlow: true,\n  consecutiveFailuresTriggerSlow: 1,\n  maxConsecutiveFailures: 3,\n  firstNTurnsFastOnly: 3,\n  fileNotInGraphTriggersSlow: true,\n  writeWithoutReadTriggersSlow: true,\n};\n","export const DANGEROUS_PATTERNS: RegExp[] = [\n  /\\brm\\s+-rf\\s+\\//,\n  /\\bdd\\s+if=/,\n  /\\bformat\\s+[A-Z]:/i,\n  /\\bshutdown\\b/,\n  /\\breboot\\b/,\n  /\\bmkfs\\b/,\n  /\\b:\\s*\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;/,\n];\n\nexport const PATH_TRAVERSAL: RegExp[] = [\n  /\\.\\.\\//,\n  /\\.\\.\\\\/,\n];\n\nexport const SECRET_PATTERNS: RegExp[] = [\n  /(?:password|passwd|secret|token|api[_-]?key)\\s*[:=]\\s*[\"'][^\"']{8,}/i,\n  /sk-[a-zA-Z0-9]{20,}/,\n  /ghp_[a-zA-Z0-9]{30,}/,\n  /AKIA[A-Z0-9]{16}/,\n];\n\nexport const DESTRUCTIVE_COMMANDS: string[] = [\n  \"DROP TABLE\",\n  \"TRUNCATE\",\n  \"DELETE FROM\",\n];\n","import type { FastPathResult, Verdict } from \"./types.js\";\nimport type { ToolOperation } from \"./types.js\";\nimport { DANGEROUS_PATTERNS, PATH_TRAVERSAL, SECRET_PATTERNS, DESTRUCTIVE_COMMANDS } from \"./patterns.js\";\n\nexport function runFastPath(operation: ToolOperation, turnCount: number, previousCalls: Array<{ name: string; input: Record<string, unknown> }>): FastPathResult {\n  const start = performance.now();\n  const checks: FastPathResult[\"checks\"] = [];\n\n  checks.push(checkDangerousCommand(operation));\n  checks.push(checkPathTraversal(operation));\n  checks.push(checkSecretExposure(operation));\n  checks.push(checkDestructiveSQL(operation));\n  checks.push(checkRepetitiveCall(operation, previousCalls));\n  checks.push(checkWriteBinary(operation));\n\n  const criticals = checks.filter(c => !c.passed && c.severity === \"critical\");\n  const warnings = checks.filter(c => !c.passed && c.severity === \"warning\");\n\n  let verdict: Verdict;\n  if (criticals.length > 0) {\n    verdict = \"block\";\n  } else if (warnings.length > 0) {\n    verdict = \"warn\";\n  } else {\n    verdict = \"pass\";\n  }\n\n  const latencyUs = (performance.now() - start) * 1000;\n\n  return { verdict, checks, latencyUs };\n}\n\nfunction checkDangerousCommand(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  if (op.safetyClass !== \"execute\") {\n    return { rule: \"dangerous_command\", passed: true, severity: \"info\", message: \"Not a shell command\" };\n  }\n  const command = String(op.input.command ?? op.input.cmd ?? \"\");\n  for (const pattern of DANGEROUS_PATTERNS) {\n    if (pattern.test(command)) {\n      return { rule: \"dangerous_command\", passed: false, severity: \"critical\", message: `Dangerous command: ${pattern.source}` };\n    }\n  }\n  return { rule: \"dangerous_command\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkPathTraversal(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  const paths = [String(op.input.path ?? \"\"), String(op.input.file_path ?? \"\"), String(op.input.filePath ?? \"\")];\n  for (const p of paths) {\n    for (const pattern of PATH_TRAVERSAL) {\n      if (pattern.test(p)) {\n        return { rule: \"path_traversal\", passed: false, severity: \"critical\", message: `Path traversal: ${p}` };\n      }\n    }\n  }\n  return { rule: \"path_traversal\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkSecretExposure(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  const serialized = JSON.stringify(op.input);\n  for (const pattern of SECRET_PATTERNS) {\n    if (pattern.test(serialized)) {\n      return { rule: \"secret_exposure\", passed: false, severity: \"critical\", message: \"Secret detected in tool input\" };\n    }\n  }\n  return { rule: \"secret_exposure\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkDestructiveSQL(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  if (op.safetyClass !== \"execute\") {\n    return { rule: \"destructive_sql\", passed: true, severity: \"info\", message: \"N/A\" };\n  }\n  const command = String(op.input.command ?? \"\").toUpperCase();\n  for (const pattern of DESTRUCTIVE_COMMANDS) {\n    if (command.includes(pattern)) {\n      return { rule: \"destructive_sql\", passed: false, severity: \"critical\", message: `Destructive SQL: ${pattern}` };\n    }\n  }\n  return { rule: \"destructive_sql\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkRepetitiveCall(op: ToolOperation, previousCalls: Array<{ name: string; input: Record<string, unknown> }>): FastPathResult[\"checks\"][0] {\n  const recent = previousCalls.slice(-5);\n  let identicalCount = 0;\n  for (const prev of recent) {\n    if (prev.name === op.name && JSON.stringify(prev.input) === JSON.stringify(op.input)) {\n      identicalCount++;\n    }\n  }\n  if (identicalCount >= 3) {\n    return { rule: \"repetitive_call\", passed: false, severity: \"warning\", message: `${op.name} called ${identicalCount + 1}x identically` };\n  }\n  return { rule: \"repetitive_call\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkWriteBinary(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  if (op.safetyClass !== \"write\") {\n    return { rule: \"write_binary\", passed: true, severity: \"info\", message: \"N/A\" };\n  }\n  const content = String(op.input.content ?? \"\");\n  const nonPrintable = content.split(\"\").filter(c => {\n    const code = c.charCodeAt(0);\n    return code < 32 && code !== 10 && code !== 13 && code !== 9;\n  });\n  if (nonPrintable.length > content.length * 0.1) {\n    return { rule: \"write_binary\", passed: false, severity: \"warning\", message: \"Binary content detected\" };\n  }\n  return { rule: \"write_binary\", passed: true, severity: \"info\", message: \"Text content\" };\n}\n","import type { SlowPathResult, Verdict } from \"./types.js\";\nimport type { ToolOperation } from \"./types.js\";\nimport type { WorldModel } from \"./world-model.js\";\n\ninterface Invariant {\n  name: string;\n  check: (op: ToolOperation, worldModel: WorldModel) => { satisfied: boolean; detail: string };\n}\n\nconst INVARIANTS: Invariant[] = [\n  {\n    name: \"write_needs_prior_read\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"write\") return { satisfied: true, detail: \"Not a write\" };\n      const targets = op.targetsFiles;\n      if (targets.length === 0) return { satisfied: true, detail: \"No file targets identified\" };\n      const unread = targets.filter(f => !wm.hasRead(f) && !wm.hasBeenWritten(f));\n      if (unread.length > 0) {\n        return { satisfied: false, detail: `Writing to file(s) never read: ${unread.join(\", \")}` };\n      }\n      return { satisfied: true, detail: \"All targets previously accessed\" };\n    },\n  },\n  {\n    name: \"file_in_dependency_graph\",\n    check: (op, wm) => {\n      const targets = op.targetsFiles;\n      const unknown = targets.filter(f => !wm.isKnownFile(f));\n      if (op.safetyClass === \"write\" || op.safetyClass === \"destroy\") {\n        if (unknown.length > 0) {\n          return { satisfied: false, detail: `Modifying unknown file(s): ${unknown.join(\", \")}` };\n        }\n      }\n      return { satisfied: true, detail: \"Targets known\" };\n    },\n  },\n  {\n    name: \"no_cascade_destroy\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"destroy\") return { satisfied: true, detail: \"Not destructive\" };\n      const targets = op.targetsFiles;\n      for (const f of targets) {\n        const deps = wm.getDeps(f);\n        if (deps.length > 0) {\n          return { satisfied: false, detail: `Destroying ${f} would orphan dependents: ${deps.slice(0, 5).join(\", \")}` };\n        }\n      }\n      return { satisfied: true, detail: \"No dependents affected\" };\n    },\n  },\n  {\n    name: \"no_rewrite_after_failure\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"write\") return { satisfied: true, detail: \"Not a write\" };\n      const recent = wm.getRecentOperations(5);\n      const recentWriteFails = recent.filter(r => r.success === false && r.safetyClass === \"write\");\n      if (recentWriteFails.length >= 2) {\n        return { satisfied: false, detail: `${recentWriteFails.length} recent write failures — agent may be corrupting files` };\n      }\n      return { satisfied: true, detail: \"Write history clean\" };\n    },\n  },\n  {\n    name: \"read_before_destroy\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"destroy\") return { satisfied: true, detail: \"Not destructive\" };\n      const targets = op.targetsFiles;\n      const unread = targets.filter(f => !wm.hasRead(f));\n      if (unread.length > 0) {\n        return { satisfied: false, detail: `Destroying file(s) without prior read: ${unread.join(\", \")}` };\n      }\n      return { satisfied: true, detail: \"All targets read before destroy\" };\n    },\n  },\n  {\n    name: \"consecutive_failure_cap\",\n    check: (op, wm) => {\n      const failures = wm.getConsecutiveFailures();\n      if (failures >= 3) {\n        return { satisfied: false, detail: `${failures} consecutive tool failures — agent may be stuck` };\n      }\n      return { satisfied: true, detail: `Only ${failures} consecutive failures` };\n    },\n  },\n];\n\nexport function runSlowPath(operation: ToolOperation, worldModel: WorldModel): SlowPathResult {\n  const start = performance.now();\n\n  const invariantChecks = INVARIANTS.map(inv => {\n    const result = inv.check(operation, worldModel);\n    return { invariant: inv.name, satisfied: result.satisfied, detail: result.detail };\n  });\n\n  const violations = invariantChecks.filter(c => !c.satisfied);\n\n  let verdict: Verdict;\n  let reasoning: string;\n\n  if (violations.length === 0) {\n    verdict = \"pass\";\n    reasoning = \"All invariants satisfied\";\n  } else if (violations.some(v => v.invariant === \"no_cascade_destroy\" || v.invariant === \"consecutive_failure_cap\")) {\n    verdict = \"block\";\n    reasoning = violations.map(v => v.detail).join(\"; \");\n  } else {\n    verdict = \"warn\";\n    reasoning = `Invariant warnings: ${violations.map(v => v.invariant).join(\", \")}`;\n  }\n\n  const latencyMs = performance.now() - start;\n\n  return { verdict, reasoning, invariantChecks, latencyMs };\n}\n","import type { ToolOperation } from \"./types.js\";\n\ninterface FileNode {\n  path: string;\n  readAt: number[];\n  writtenAt: number[];\n  deps: Set<string>;\n}\n\nconst MAX_HISTORY = 64;\nconst MAX_FILES = 512;\n\nexport class WorldModel {\n  private files: Map<string, FileNode> = new Map();\n  private history: Array<{\n    turn: number;\n    tool: string;\n    safetyClass: string;\n    files: string[];\n    success: boolean;\n  }> = [];\n  private consecutiveFailures = 0;\n\n  recordRead(filePath: string, turn: number): void {\n    const normalized = this.normalizePath(filePath);\n    const node = this.getOrCreate(normalized);\n    node.readAt.push(turn);\n    if (node.readAt.length > 20) node.readAt.shift();\n    this.evictIfNeeded();\n  }\n\n  recordWrite(filePath: string, turn: number): void {\n    const normalized = this.normalizePath(filePath);\n    const node = this.getOrCreate(normalized);\n    node.writtenAt.push(turn);\n    if (node.writtenAt.length > 20) node.writtenAt.shift();\n    this.evictIfNeeded();\n  }\n\n  recordDep(from: string, to: string): void {\n    const fromNorm = this.normalizePath(from);\n    const toNorm = this.normalizePath(to);\n    const node = this.getOrCreate(fromNorm);\n    node.deps.add(toNorm);\n  }\n\n  recordOperation(turn: number, tool: string, safetyClass: string, files: string[], success: boolean): void {\n    this.history.push({ turn, tool, safetyClass, files, success });\n    if (this.history.length > MAX_HISTORY) {\n      this.history = this.history.slice(-MAX_HISTORY);\n    }\n    if (success) {\n      this.consecutiveFailures = 0;\n    } else {\n      this.consecutiveFailures++;\n    }\n  }\n\n  hasRead(filePath: string): boolean {\n    const node = this.files.get(this.normalizePath(filePath));\n    return node !== undefined && node.readAt.length > 0;\n  }\n\n  hasBeenWritten(filePath: string): boolean {\n    const node = this.files.get(this.normalizePath(filePath));\n    return node !== undefined && node.writtenAt.length > 0;\n  }\n\n  isKnownFile(filePath: string): boolean {\n    return this.files.has(this.normalizePath(filePath));\n  }\n\n  getConsecutiveFailures(): number {\n    return this.consecutiveFailures;\n  }\n\n  getRecentOperations(count: number): typeof this.history {\n    return this.history.slice(-count);\n  }\n\n  getFileHistory(filePath: string): { reads: number[]; writes: number[] } | null {\n    const node = this.files.get(this.normalizePath(filePath));\n    if (!node) return null;\n    return { reads: [...node.readAt], writes: [...node.writtenAt] };\n  }\n\n  getDeps(filePath: string): string[] {\n    const node = this.files.get(this.normalizePath(filePath));\n    return node ? [...node.deps] : [];\n  }\n\n  resolveFiles(operation: ToolOperation): string[] {\n    const paths: string[] = [];\n    for (const key of [\"path\", \"filePath\", \"file_path\", \"file\", \"directory\", \"dir\", \"cwd\"]) {\n      const val = operation.input[key];\n      if (typeof val === \"string\" && val.length > 0) paths.push(val);\n    }\n\n    if (operation.name === \"bash\" && typeof operation.input.command === \"string\") {\n      const cmd = operation.input.command as string;\n      const fileMatches = cmd.matchAll(/['\"]?(\\/?[^\\s'\"<>|;&]+\\.[\\w]+)['\"]?/g);\n      for (const m of fileMatches) {\n        if (m[1] && !m[1].startsWith(\"-\")) paths.push(m[1]);\n      }\n    }\n\n    return [...new Set(paths)];\n  }\n\n  memoryEstimateBytes(): number {\n    let bytes = 0;\n    for (const [path, node] of this.files) {\n      bytes += path.length * 2;\n      bytes += node.readAt.length * 8;\n      bytes += node.writtenAt.length * 8;\n      bytes += node.deps.size * 64;\n    }\n    bytes += this.history.length * 128;\n    return bytes;\n  }\n\n  reset(): void {\n    this.files.clear();\n    this.history = [];\n    this.consecutiveFailures = 0;\n  }\n\n  private normalizePath(p: string): string {\n    return p.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/\\/$/, \"\");\n  }\n\n  private getOrCreate(normalized: string): FileNode {\n    let node = this.files.get(normalized);\n    if (!node) {\n      node = { path: normalized, readAt: [], writtenAt: [], deps: new Set() };\n      this.files.set(normalized, node);\n    }\n    return node;\n  }\n\n  private evictIfNeeded(): void {\n    if (this.files.size <= MAX_FILES) return;\n    let oldest: string | null = null;\n    let oldestTurn = Infinity;\n    for (const [path, node] of this.files) {\n      const lastActivity = Math.max(\n        node.readAt[node.readAt.length - 1] ?? 0,\n        node.writtenAt[node.writtenAt.length - 1] ?? 0,\n      );\n      if (lastActivity < oldestTurn) {\n        oldestTurn = lastActivity;\n        oldest = path;\n      }\n    }\n    if (oldest) this.files.delete(oldest);\n  }\n}\n","import type { DualPathVerdict, RoutingPolicy, Verdict, ToolOperation } from \"./types.js\";\nimport { DEFAULT_ROUTING_POLICY } from \"./types.js\";\nimport { runFastPath } from \"./fast-path.js\";\nimport { runSlowPath } from \"./slow-path.js\";\nimport { WorldModel } from \"./world-model.js\";\n\nconst SAFETY_CLASS_MAP: Record<string, import(\"./types.js\").SafetyClass> = {\n  bash: \"execute\",\n  file_read: \"read\",\n  read_file: \"read\",\n  file_write: \"write\",\n  write_file: \"write\",\n  file_edit: \"write\",\n  edit_file: \"write\",\n  glob: \"read\",\n  grep: \"read\",\n  web_fetch: \"network\",\n  web_search: \"network\",\n  delete_file: \"destroy\",\n};\n\nfunction classifyTool(toolName: string, input: Record<string, unknown>): ToolOperation {\n  const safetyClass = SAFETY_CLASS_MAP[toolName] ?? \"read\";\n  const op: ToolOperation = { name: toolName, input, safetyClass, targetsFiles: [] };\n  return op;\n}\n\nfunction extractTargetFiles(op: ToolOperation): string[] {\n  const paths: string[] = [];\n  for (const key of [\"path\", \"filePath\", \"file_path\", \"file\", \"directory\", \"dir\"]) {\n    const val = op.input[key];\n    if (typeof val === \"string\" && val.length > 0) paths.push(val);\n  }\n  if (op.safetyClass === \"execute\" && typeof op.input.command === \"string\") {\n    const cmd = op.input.command as string;\n    for (const m of cmd.matchAll(/['\"]?(\\/?[^\\s'\"<>|;&]+\\.[\\w]+)['\"]?/g)) {\n      if (m[1] && !m[1].startsWith(\"-\")) paths.push(m[1]);\n    }\n  }\n  return [...new Set(paths)];\n}\n\nfunction shouldRouteToSlow(\n  fastResult: import(\"./types.js\").FastPathResult,\n  operation: ToolOperation,\n  turnCount: number,\n  worldModel: WorldModel,\n  policy: RoutingPolicy,\n): boolean {\n  if (turnCount <= policy.firstNTurnsFastOnly) {\n    return false;\n  }\n\n  if (policy.alwaysSlowPathFor.includes(operation.safetyClass)) {\n    return true;\n  }\n\n  if (policy.warnEscalatesToSlow && fastResult.verdict === \"warn\") {\n    return true;\n  }\n\n  if (worldModel.getConsecutiveFailures() >= policy.consecutiveFailuresTriggerSlow) {\n    return true;\n  }\n\n  if (policy.fileNotInGraphTriggersSlow) {\n    for (const f of operation.targetsFiles) {\n      if (!worldModel.isKnownFile(f) && (operation.safetyClass === \"write\" || operation.safetyClass === \"destroy\")) {\n        return true;\n      }\n    }\n  }\n\n  if (policy.writeWithoutReadTriggersSlow && operation.safetyClass === \"write\") {\n    for (const f of operation.targetsFiles) {\n      if (!worldModel.hasRead(f) && !worldModel.hasBeenWritten(f)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nexport class DualPathVerifier {\n  private worldModel: WorldModel;\n  private policy: RoutingPolicy;\n  private previousCalls: Array<{ name: string; input: Record<string, unknown> }> = [];\n\n  constructor(worldModel?: WorldModel, policy?: Partial<RoutingPolicy>) {\n    this.worldModel = worldModel ?? new WorldModel();\n    this.policy = { ...DEFAULT_ROUTING_POLICY, ...policy };\n  }\n\n  verify(\n    toolName: string,\n    input: Record<string, unknown>,\n    turnCount: number,\n  ): DualPathVerdict {\n    const operation = classifyTool(toolName, input);\n    operation.targetsFiles = extractTargetFiles(operation);\n\n    const totalStart = performance.now();\n\n    const fastResult = runFastPath(operation, turnCount, this.previousCalls);\n\n    if (fastResult.verdict === \"block\") {\n      const totalLatencyMs = performance.now() - totalStart;\n      this.previousCalls.push({ name: toolName, input });\n      return {\n        toolName,\n        fastPath: fastResult,\n        finalVerdict: \"block\",\n        reason: fastResult.checks.filter(c => !c.passed && c.severity === \"critical\").map(c => c.message).join(\"; \"),\n        totalLatencyMs,\n        pathTaken: \"fast\",\n      };\n    }\n\n    const needsSlowPath = shouldRouteToSlow(fastResult, operation, turnCount, this.worldModel, this.policy);\n\n    if (needsSlowPath) {\n      const slowResult = runSlowPath(operation, this.worldModel);\n\n      let finalVerdict: Verdict;\n      if (fastResult.verdict === \"warn\" || slowResult.verdict === \"warn\") {\n        finalVerdict = slowResult.verdict === \"block\" ? \"block\" : \"warn\";\n      } else if (slowResult.verdict === \"block\") {\n        finalVerdict = \"block\";\n      } else {\n        finalVerdict = \"pass\";\n      }\n\n      const totalLatencyMs = performance.now() - totalStart;\n      this.previousCalls.push({ name: toolName, input });\n\n      return {\n        toolName,\n        fastPath: fastResult,\n        slowPath: slowResult,\n        finalVerdict,\n        reason: slowResult.reasoning,\n        totalLatencyMs,\n        pathTaken: \"fast+slow\",\n      };\n    }\n\n    const totalLatencyMs = performance.now() - totalStart;\n    this.previousCalls.push({ name: toolName, input });\n    this.recordOperation(operation, turnCount, true);\n\n    return {\n      toolName,\n      fastPath: fastResult,\n      finalVerdict: fastResult.verdict === \"warn\" ? \"warn\" : \"pass\",\n      reason: fastResult.verdict === \"warn\"\n        ? fastResult.checks.filter(c => !c.passed).map(c => c.message).join(\"; \")\n        : undefined,\n      totalLatencyMs,\n      pathTaken: \"fast\",\n    };\n  }\n\n  recordSuccess(toolName: string, input: Record<string, unknown>, turnCount: number): void {\n    const operation = classifyTool(toolName, input);\n    operation.targetsFiles = extractTargetFiles(operation);\n    this.recordOperation(operation, turnCount, true);\n  }\n\n  recordFailure(toolName: string, input: Record<string, unknown>, turnCount: number): void {\n    const operation = classifyTool(toolName, input);\n    operation.targetsFiles = extractTargetFiles(operation);\n    this.recordOperation(operation, turnCount, false);\n  }\n\n  getWorldModel(): WorldModel {\n    return this.worldModel;\n  }\n\n  getPolicy(): RoutingPolicy {\n    return { ...this.policy };\n  }\n\n  reset(): void {\n    this.worldModel.reset();\n    this.previousCalls = [];\n  }\n\n  private recordOperation(op: ToolOperation, turn: number, success: boolean): void {\n    for (const f of op.targetsFiles) {\n      if (op.safetyClass === \"read\") this.worldModel.recordRead(f, turn);\n      if (op.safetyClass === \"write\") this.worldModel.recordWrite(f, turn);\n    }\n    this.worldModel.recordOperation(turn, op.name, op.safetyClass, op.targetsFiles, success);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoDO,IAAM,yBAAwC;AAAA,EACnD,mBAAmB,CAAC,SAAS;AAAA,EAC7B,qBAAqB;AAAA,EACrB,gCAAgC;AAAA,EAChC,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,8BAA8B;AAChC;;;AC5DO,IAAM,qBAA+B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iBAA2B;AAAA,EACtC;AAAA,EACA;AACF;AAEO,IAAM,kBAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,uBAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF;;;ACtBO,SAAS,YAAY,WAA0B,WAAmB,eAAwF;AAC/J,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,SAAmC,CAAC;AAE1C,SAAO,KAAK,sBAAsB,SAAS,CAAC;AAC5C,SAAO,KAAK,mBAAmB,SAAS,CAAC;AACzC,SAAO,KAAK,oBAAoB,SAAS,CAAC;AAC1C,SAAO,KAAK,oBAAoB,SAAS,CAAC;AAC1C,SAAO,KAAK,oBAAoB,WAAW,aAAa,CAAC;AACzD,SAAO,KAAK,iBAAiB,SAAS,CAAC;AAEvC,QAAM,YAAY,OAAO,OAAO,OAAK,CAAC,EAAE,UAAU,EAAE,aAAa,UAAU;AAC3E,QAAM,WAAW,OAAO,OAAO,OAAK,CAAC,EAAE,UAAU,EAAE,aAAa,SAAS;AAEzE,MAAI;AACJ,MAAI,UAAU,SAAS,GAAG;AACxB,cAAU;AAAA,EACZ,WAAW,SAAS,SAAS,GAAG;AAC9B,cAAU;AAAA,EACZ,OAAO;AACL,cAAU;AAAA,EACZ;AAEA,QAAM,aAAa,YAAY,IAAI,IAAI,SAAS;AAEhD,SAAO,EAAE,SAAS,QAAQ,UAAU;AACtC;AAEA,SAAS,sBAAsB,IAAgD;AAC7E,MAAI,GAAG,gBAAgB,WAAW;AAChC,WAAO,EAAE,MAAM,qBAAqB,QAAQ,MAAM,UAAU,QAAQ,SAAS,sBAAsB;AAAA,EACrG;AACA,QAAM,UAAU,OAAO,GAAG,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE;AAC7D,aAAW,WAAW,oBAAoB;AACxC,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,aAAO,EAAE,MAAM,qBAAqB,QAAQ,OAAO,UAAU,YAAY,SAAS,sBAAsB,QAAQ,MAAM,GAAG;AAAA,IAC3H;AAAA,EACF;AACA,SAAO,EAAE,MAAM,qBAAqB,QAAQ,MAAM,UAAU,QAAQ,SAAS,QAAQ;AACvF;AAEA,SAAS,mBAAmB,IAAgD;AAC1E,QAAM,QAAQ,CAAC,OAAO,GAAG,MAAM,QAAQ,EAAE,GAAG,OAAO,GAAG,MAAM,aAAa,EAAE,GAAG,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;AAC7G,aAAW,KAAK,OAAO;AACrB,eAAW,WAAW,gBAAgB;AACpC,UAAI,QAAQ,KAAK,CAAC,GAAG;AACnB,eAAO,EAAE,MAAM,kBAAkB,QAAQ,OAAO,UAAU,YAAY,SAAS,mBAAmB,CAAC,GAAG;AAAA,MACxG;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,MAAM,kBAAkB,QAAQ,MAAM,UAAU,QAAQ,SAAS,QAAQ;AACpF;AAEA,SAAS,oBAAoB,IAAgD;AAC3E,QAAM,aAAa,KAAK,UAAU,GAAG,KAAK;AAC1C,aAAW,WAAW,iBAAiB;AACrC,QAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,aAAO,EAAE,MAAM,mBAAmB,QAAQ,OAAO,UAAU,YAAY,SAAS,gCAAgC;AAAA,IAClH;AAAA,EACF;AACA,SAAO,EAAE,MAAM,mBAAmB,QAAQ,MAAM,UAAU,QAAQ,SAAS,QAAQ;AACrF;AAEA,SAAS,oBAAoB,IAAgD;AAC3E,MAAI,GAAG,gBAAgB,WAAW;AAChC,WAAO,EAAE,MAAM,mBAAmB,QAAQ,MAAM,UAAU,QAAQ,SAAS,MAAM;AAAA,EACnF;AACA,QAAM,UAAU,OAAO,GAAG,MAAM,WAAW,EAAE,EAAE,YAAY;AAC3D,aAAW,WAAW,sBAAsB;AAC1C,QAAI,QAAQ,SAAS,OAAO,GAAG;AAC7B,aAAO,EAAE,MAAM,mBAAmB,QAAQ,OAAO,UAAU,YAAY,SAAS,oBAAoB,OAAO,GAAG;AAAA,IAChH;AAAA,EACF;AACA,SAAO,EAAE,MAAM,mBAAmB,QAAQ,MAAM,UAAU,QAAQ,SAAS,QAAQ;AACrF;AAEA,SAAS,oBAAoB,IAAmB,eAAqG;AACnJ,QAAM,SAAS,cAAc,MAAM,EAAE;AACrC,MAAI,iBAAiB;AACrB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,SAAS,GAAG,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,KAAK,UAAU,GAAG,KAAK,GAAG;AACpF;AAAA,IACF;AAAA,EACF;AACA,MAAI,kBAAkB,GAAG;AACvB,WAAO,EAAE,MAAM,mBAAmB,QAAQ,OAAO,UAAU,WAAW,SAAS,GAAG,GAAG,IAAI,WAAW,iBAAiB,CAAC,gBAAgB;AAAA,EACxI;AACA,SAAO,EAAE,MAAM,mBAAmB,QAAQ,MAAM,UAAU,QAAQ,SAAS,QAAQ;AACrF;AAEA,SAAS,iBAAiB,IAAgD;AACxE,MAAI,GAAG,gBAAgB,SAAS;AAC9B,WAAO,EAAE,MAAM,gBAAgB,QAAQ,MAAM,UAAU,QAAQ,SAAS,MAAM;AAAA,EAChF;AACA,QAAM,UAAU,OAAO,GAAG,MAAM,WAAW,EAAE;AAC7C,QAAM,eAAe,QAAQ,MAAM,EAAE,EAAE,OAAO,OAAK;AACjD,UAAM,OAAO,EAAE,WAAW,CAAC;AAC3B,WAAO,OAAO,MAAM,SAAS,MAAM,SAAS,MAAM,SAAS;AAAA,EAC7D,CAAC;AACD,MAAI,aAAa,SAAS,QAAQ,SAAS,KAAK;AAC9C,WAAO,EAAE,MAAM,gBAAgB,QAAQ,OAAO,UAAU,WAAW,SAAS,0BAA0B;AAAA,EACxG;AACA,SAAO,EAAE,MAAM,gBAAgB,QAAQ,MAAM,UAAU,QAAQ,SAAS,eAAe;AACzF;;;AClGA,IAAM,aAA0B;AAAA,EAC9B;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,IAAI,OAAO;AACjB,UAAI,GAAG,gBAAgB,QAAS,QAAO,EAAE,WAAW,MAAM,QAAQ,cAAc;AAChF,YAAM,UAAU,GAAG;AACnB,UAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,WAAW,MAAM,QAAQ,6BAA6B;AACzF,YAAM,SAAS,QAAQ,OAAO,OAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC;AAC1E,UAAI,OAAO,SAAS,GAAG;AACrB,eAAO,EAAE,WAAW,OAAO,QAAQ,kCAAkC,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,MAC3F;AACA,aAAO,EAAE,WAAW,MAAM,QAAQ,kCAAkC;AAAA,IACtE;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,IAAI,OAAO;AACjB,YAAM,UAAU,GAAG;AACnB,YAAM,UAAU,QAAQ,OAAO,OAAK,CAAC,GAAG,YAAY,CAAC,CAAC;AACtD,UAAI,GAAG,gBAAgB,WAAW,GAAG,gBAAgB,WAAW;AAC9D,YAAI,QAAQ,SAAS,GAAG;AACtB,iBAAO,EAAE,WAAW,OAAO,QAAQ,8BAA8B,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,QACxF;AAAA,MACF;AACA,aAAO,EAAE,WAAW,MAAM,QAAQ,gBAAgB;AAAA,IACpD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,IAAI,OAAO;AACjB,UAAI,GAAG,gBAAgB,UAAW,QAAO,EAAE,WAAW,MAAM,QAAQ,kBAAkB;AACtF,YAAM,UAAU,GAAG;AACnB,iBAAW,KAAK,SAAS;AACvB,cAAM,OAAO,GAAG,QAAQ,CAAC;AACzB,YAAI,KAAK,SAAS,GAAG;AACnB,iBAAO,EAAE,WAAW,OAAO,QAAQ,cAAc,CAAC,6BAA6B,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,QAC/G;AAAA,MACF;AACA,aAAO,EAAE,WAAW,MAAM,QAAQ,yBAAyB;AAAA,IAC7D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,IAAI,OAAO;AACjB,UAAI,GAAG,gBAAgB,QAAS,QAAO,EAAE,WAAW,MAAM,QAAQ,cAAc;AAChF,YAAM,SAAS,GAAG,oBAAoB,CAAC;AACvC,YAAM,mBAAmB,OAAO,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE,gBAAgB,OAAO;AAC5F,UAAI,iBAAiB,UAAU,GAAG;AAChC,eAAO,EAAE,WAAW,OAAO,QAAQ,GAAG,iBAAiB,MAAM,8DAAyD;AAAA,MACxH;AACA,aAAO,EAAE,WAAW,MAAM,QAAQ,sBAAsB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,IAAI,OAAO;AACjB,UAAI,GAAG,gBAAgB,UAAW,QAAO,EAAE,WAAW,MAAM,QAAQ,kBAAkB;AACtF,YAAM,UAAU,GAAG;AACnB,YAAM,SAAS,QAAQ,OAAO,OAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;AACjD,UAAI,OAAO,SAAS,GAAG;AACrB,eAAO,EAAE,WAAW,OAAO,QAAQ,0CAA0C,OAAO,KAAK,IAAI,CAAC,GAAG;AAAA,MACnG;AACA,aAAO,EAAE,WAAW,MAAM,QAAQ,kCAAkC;AAAA,IACtE;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO,CAAC,IAAI,OAAO;AACjB,YAAM,WAAW,GAAG,uBAAuB;AAC3C,UAAI,YAAY,GAAG;AACjB,eAAO,EAAE,WAAW,OAAO,QAAQ,GAAG,QAAQ,uDAAkD;AAAA,MAClG;AACA,aAAO,EAAE,WAAW,MAAM,QAAQ,QAAQ,QAAQ,wBAAwB;AAAA,IAC5E;AAAA,EACF;AACF;AAEO,SAAS,YAAY,WAA0B,YAAwC;AAC5F,QAAM,QAAQ,YAAY,IAAI;AAE9B,QAAM,kBAAkB,WAAW,IAAI,SAAO;AAC5C,UAAM,SAAS,IAAI,MAAM,WAAW,UAAU;AAC9C,WAAO,EAAE,WAAW,IAAI,MAAM,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO;AAAA,EACnF,CAAC;AAED,QAAM,aAAa,gBAAgB,OAAO,OAAK,CAAC,EAAE,SAAS;AAE3D,MAAI;AACJ,MAAI;AAEJ,MAAI,WAAW,WAAW,GAAG;AAC3B,cAAU;AACV,gBAAY;AAAA,EACd,WAAW,WAAW,KAAK,OAAK,EAAE,cAAc,wBAAwB,EAAE,cAAc,yBAAyB,GAAG;AAClH,cAAU;AACV,gBAAY,WAAW,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI;AAAA,EACrD,OAAO;AACL,cAAU;AACV,gBAAY,uBAAuB,WAAW,IAAI,OAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,EAChF;AAEA,QAAM,YAAY,YAAY,IAAI,IAAI;AAEtC,SAAO,EAAE,SAAS,WAAW,iBAAiB,UAAU;AAC1D;;;ACxGA,IAAM,cAAc;AACpB,IAAM,YAAY;AAEX,IAAM,aAAN,MAAiB;AAAA,EACd,QAA+B,oBAAI,IAAI;AAAA,EACvC,UAMH,CAAC;AAAA,EACE,sBAAsB;AAAA,EAE9B,WAAW,UAAkB,MAAoB;AAC/C,UAAM,aAAa,KAAK,cAAc,QAAQ;AAC9C,UAAM,OAAO,KAAK,YAAY,UAAU;AACxC,SAAK,OAAO,KAAK,IAAI;AACrB,QAAI,KAAK,OAAO,SAAS,GAAI,MAAK,OAAO,MAAM;AAC/C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,YAAY,UAAkB,MAAoB;AAChD,UAAM,aAAa,KAAK,cAAc,QAAQ;AAC9C,UAAM,OAAO,KAAK,YAAY,UAAU;AACxC,SAAK,UAAU,KAAK,IAAI;AACxB,QAAI,KAAK,UAAU,SAAS,GAAI,MAAK,UAAU,MAAM;AACrD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,UAAU,MAAc,IAAkB;AACxC,UAAM,WAAW,KAAK,cAAc,IAAI;AACxC,UAAM,SAAS,KAAK,cAAc,EAAE;AACpC,UAAM,OAAO,KAAK,YAAY,QAAQ;AACtC,SAAK,KAAK,IAAI,MAAM;AAAA,EACtB;AAAA,EAEA,gBAAgB,MAAc,MAAc,aAAqB,OAAiB,SAAwB;AACxG,SAAK,QAAQ,KAAK,EAAE,MAAM,MAAM,aAAa,OAAO,QAAQ,CAAC;AAC7D,QAAI,KAAK,QAAQ,SAAS,aAAa;AACrC,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,WAAW;AAAA,IAChD;AACA,QAAI,SAAS;AACX,WAAK,sBAAsB;AAAA,IAC7B,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,QAAQ,UAA2B;AACjC,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK,cAAc,QAAQ,CAAC;AACxD,WAAO,SAAS,UAAa,KAAK,OAAO,SAAS;AAAA,EACpD;AAAA,EAEA,eAAe,UAA2B;AACxC,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK,cAAc,QAAQ,CAAC;AACxD,WAAO,SAAS,UAAa,KAAK,UAAU,SAAS;AAAA,EACvD;AAAA,EAEA,YAAY,UAA2B;AACrC,WAAO,KAAK,MAAM,IAAI,KAAK,cAAc,QAAQ,CAAC;AAAA,EACpD;AAAA,EAEA,yBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAoB,OAAoC;AACtD,WAAO,KAAK,QAAQ,MAAM,CAAC,KAAK;AAAA,EAClC;AAAA,EAEA,eAAe,UAAgE;AAC7E,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK,cAAc,QAAQ,CAAC;AACxD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,EAAE,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,QAAQ,CAAC,GAAG,KAAK,SAAS,EAAE;AAAA,EAChE;AAAA,EAEA,QAAQ,UAA4B;AAClC,UAAM,OAAO,KAAK,MAAM,IAAI,KAAK,cAAc,QAAQ,CAAC;AACxD,WAAO,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC;AAAA,EAClC;AAAA,EAEA,aAAa,WAAoC;AAC/C,UAAM,QAAkB,CAAC;AACzB,eAAW,OAAO,CAAC,QAAQ,YAAY,aAAa,QAAQ,aAAa,OAAO,KAAK,GAAG;AACtF,YAAM,MAAM,UAAU,MAAM,GAAG;AAC/B,UAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,OAAM,KAAK,GAAG;AAAA,IAC/D;AAEA,QAAI,UAAU,SAAS,UAAU,OAAO,UAAU,MAAM,YAAY,UAAU;AAC5E,YAAM,MAAM,UAAU,MAAM;AAC5B,YAAM,cAAc,IAAI,SAAS,sCAAsC;AACvE,iBAAW,KAAK,aAAa;AAC3B,YAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,EAAG,OAAM,KAAK,EAAE,CAAC,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA,EAC3B;AAAA,EAEA,sBAA8B;AAC5B,QAAI,QAAQ;AACZ,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACrC,eAAS,KAAK,SAAS;AACvB,eAAS,KAAK,OAAO,SAAS;AAC9B,eAAS,KAAK,UAAU,SAAS;AACjC,eAAS,KAAK,KAAK,OAAO;AAAA,IAC5B;AACA,aAAS,KAAK,QAAQ,SAAS;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AACjB,SAAK,UAAU,CAAC;AAChB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,cAAc,GAAmB;AACvC,WAAO,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,OAAO,EAAE;AAAA,EACrE;AAAA,EAEQ,YAAY,YAA8B;AAChD,QAAI,OAAO,KAAK,MAAM,IAAI,UAAU;AACpC,QAAI,CAAC,MAAM;AACT,aAAO,EAAE,MAAM,YAAY,QAAQ,CAAC,GAAG,WAAW,CAAC,GAAG,MAAM,oBAAI,IAAI,EAAE;AACtE,WAAK,MAAM,IAAI,YAAY,IAAI;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,MAAM,QAAQ,UAAW;AAClC,QAAI,SAAwB;AAC5B,QAAI,aAAa;AACjB,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACrC,YAAM,eAAe,KAAK;AAAA,QACxB,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,KAAK;AAAA,QACvC,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,KAAK;AAAA,MAC/C;AACA,UAAI,eAAe,YAAY;AAC7B,qBAAa;AACb,iBAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,OAAQ,MAAK,MAAM,OAAO,MAAM;AAAA,EACtC;AACF;;;ACtJA,IAAM,mBAAqE;AAAA,EACzE,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AACf;AAEA,SAAS,aAAa,UAAkB,OAA+C;AACrF,QAAM,cAAc,iBAAiB,QAAQ,KAAK;AAClD,QAAM,KAAoB,EAAE,MAAM,UAAU,OAAO,aAAa,cAAc,CAAC,EAAE;AACjF,SAAO;AACT;AAEA,SAAS,mBAAmB,IAA6B;AACvD,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,CAAC,QAAQ,YAAY,aAAa,QAAQ,aAAa,KAAK,GAAG;AAC/E,UAAM,MAAM,GAAG,MAAM,GAAG;AACxB,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,OAAM,KAAK,GAAG;AAAA,EAC/D;AACA,MAAI,GAAG,gBAAgB,aAAa,OAAO,GAAG,MAAM,YAAY,UAAU;AACxE,UAAM,MAAM,GAAG,MAAM;AACrB,eAAW,KAAK,IAAI,SAAS,sCAAsC,GAAG;AACpE,UAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,EAAG,OAAM,KAAK,EAAE,CAAC,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAC3B;AAEA,SAAS,kBACP,YACA,WACA,WACA,YACA,QACS;AACT,MAAI,aAAa,OAAO,qBAAqB;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,kBAAkB,SAAS,UAAU,WAAW,GAAG;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,uBAAuB,WAAW,YAAY,QAAQ;AAC/D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,uBAAuB,KAAK,OAAO,gCAAgC;AAChF,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,4BAA4B;AACrC,eAAW,KAAK,UAAU,cAAc;AACtC,UAAI,CAAC,WAAW,YAAY,CAAC,MAAM,UAAU,gBAAgB,WAAW,UAAU,gBAAgB,YAAY;AAC5G,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,gCAAgC,UAAU,gBAAgB,SAAS;AAC5E,eAAW,KAAK,UAAU,cAAc;AACtC,UAAI,CAAC,WAAW,QAAQ,CAAC,KAAK,CAAC,WAAW,eAAe,CAAC,GAAG;AAC3D,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,gBAAyE,CAAC;AAAA,EAElF,YAAY,YAAyB,QAAiC;AACpE,SAAK,aAAa,cAAc,IAAI,WAAW;AAC/C,SAAK,SAAS,EAAE,GAAG,wBAAwB,GAAG,OAAO;AAAA,EACvD;AAAA,EAEA,OACE,UACA,OACA,WACiB;AACjB,UAAM,YAAY,aAAa,UAAU,KAAK;AAC9C,cAAU,eAAe,mBAAmB,SAAS;AAErD,UAAM,aAAa,YAAY,IAAI;AAEnC,UAAM,aAAa,YAAY,WAAW,WAAW,KAAK,aAAa;AAEvE,QAAI,WAAW,YAAY,SAAS;AAClC,YAAMA,kBAAiB,YAAY,IAAI,IAAI;AAC3C,WAAK,cAAc,KAAK,EAAE,MAAM,UAAU,MAAM,CAAC;AACjD,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,cAAc;AAAA,QACd,QAAQ,WAAW,OAAO,OAAO,OAAK,CAAC,EAAE,UAAU,EAAE,aAAa,UAAU,EAAE,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,QAC3G,gBAAAA;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,gBAAgB,kBAAkB,YAAY,WAAW,WAAW,KAAK,YAAY,KAAK,MAAM;AAEtG,QAAI,eAAe;AACjB,YAAM,aAAa,YAAY,WAAW,KAAK,UAAU;AAEzD,UAAI;AACJ,UAAI,WAAW,YAAY,UAAU,WAAW,YAAY,QAAQ;AAClE,uBAAe,WAAW,YAAY,UAAU,UAAU;AAAA,MAC5D,WAAW,WAAW,YAAY,SAAS;AACzC,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe;AAAA,MACjB;AAEA,YAAMA,kBAAiB,YAAY,IAAI,IAAI;AAC3C,WAAK,cAAc,KAAK,EAAE,MAAM,UAAU,MAAM,CAAC;AAEjD,aAAO;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB,gBAAAA;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,iBAAiB,YAAY,IAAI,IAAI;AAC3C,SAAK,cAAc,KAAK,EAAE,MAAM,UAAU,MAAM,CAAC;AACjD,SAAK,gBAAgB,WAAW,WAAW,IAAI;AAE/C,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV,cAAc,WAAW,YAAY,SAAS,SAAS;AAAA,MACvD,QAAQ,WAAW,YAAY,SAC3B,WAAW,OAAO,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IACtE;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEA,cAAc,UAAkB,OAAgC,WAAyB;AACvF,UAAM,YAAY,aAAa,UAAU,KAAK;AAC9C,cAAU,eAAe,mBAAmB,SAAS;AACrD,SAAK,gBAAgB,WAAW,WAAW,IAAI;AAAA,EACjD;AAAA,EAEA,cAAc,UAAkB,OAAgC,WAAyB;AACvF,UAAM,YAAY,aAAa,UAAU,KAAK;AAC9C,cAAU,eAAe,mBAAmB,SAAS;AACrD,SAAK,gBAAgB,WAAW,WAAW,KAAK;AAAA,EAClD;AAAA,EAEA,gBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAA2B;AACzB,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW,MAAM;AACtB,SAAK,gBAAgB,CAAC;AAAA,EACxB;AAAA,EAEQ,gBAAgB,IAAmB,MAAc,SAAwB;AAC/E,eAAW,KAAK,GAAG,cAAc;AAC/B,UAAI,GAAG,gBAAgB,OAAQ,MAAK,WAAW,WAAW,GAAG,IAAI;AACjE,UAAI,GAAG,gBAAgB,QAAS,MAAK,WAAW,YAAY,GAAG,IAAI;AAAA,IACrE;AACA,SAAK,WAAW,gBAAgB,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,cAAc,OAAO;AAAA,EACzF;AACF;","names":["totalLatencyMs"]}