{"version":3,"sources":["../typescript/src/summary/index.ts"],"names":[],"mappings":"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","file":"summary.cjs","sourcesContent":["/**\n * Agent Summary Format\n * Ultra token-efficient plain text format for LLM consumption\n *\n * Target: ~100 tokens vs ~800 tokens for JSON\n * Use case: Quick site understanding for AI agents\n *\n * @packageDocumentation\n */\n\nimport type { SemanticDocument, SemanticNode } from '../core/types.js';\n\n/**\n * Options for agent summary generation\n */\nexport interface AgentSummaryOptions {\n  /** Include interactables list (default: true) */\n  includeInteractables?: boolean;\n  /** Include landmarks list (default: true) */\n  includeLandmarks?: boolean;\n  /** Include certification info (default: true) */\n  includeCertification?: boolean;\n  /** Maximum interactables to list (default: 20) */\n  maxInteractables?: number;\n  /** Maximum landmarks to list (default: 10) */\n  maxLandmarks?: number;\n  /** Include resource URLs if available (default: true) */\n  includeResourceUrls?: boolean;\n}\n\nconst DEFAULT_OPTIONS: Required<AgentSummaryOptions> = {\n  includeInteractables: true,\n  includeLandmarks: true,\n  includeCertification: true,\n  maxInteractables: 20,\n  maxLandmarks: 10,\n  includeResourceUrls: true,\n};\n\n/**\n * Generate an ultra-compact agent summary\n *\n * Format designed for ~100 tokens vs ~800 for JSON manifest\n *\n * @example Output:\n * ```\n * SITE: example.com\n * TITLE: My Website\n * LANG: en\n * CERT: standard (75/100)\n *\n * LANDMARKS:\n * navigation: Main Nav | #nav\n * main: Content | #main\n *\n * ACTIONS:\n * button: Submit Form | #submit | submit\n * link: Home | #home | navigate\n * audio: Track 1 | #audio-1 | play\n * ```\n *\n * @param document - SemanticDocument to summarize\n * @param options - Summary options\n * @returns Plain text summary\n */\nexport function toAgentSummary(\n  document: SemanticDocument,\n  options?: AgentSummaryOptions\n): string {\n  const opts = { ...DEFAULT_OPTIONS, ...options };\n  const lines: string[] = [];\n\n  // Header (minimal metadata)\n  const domain = extractDomain(document.url);\n  lines.push(`SITE: ${domain || 'local'}`);\n  if (document.title) {\n    lines.push(`TITLE: ${truncate(document.title, 50)}`);\n  }\n  lines.push(`LANG: ${document.language || 'en'}`);\n\n  // Certification (one line)\n  if (opts.includeCertification) {\n    const cert = document.agentReady;\n    lines.push(`CERT: ${cert.level} (${cert.score}/100)`);\n  }\n\n  lines.push(''); // Blank line separator\n\n  // Landmarks (compact)\n  if (opts.includeLandmarks && document.landmarks.length > 0) {\n    lines.push('LANDMARKS:');\n    const landmarks = document.landmarks.slice(0, opts.maxLandmarks);\n    for (const lm of landmarks) {\n      const selector = truncate(lm.selector || '', 30);\n      lines.push(`${lm.role}: ${truncate(lm.label, 25)} | ${selector}`);\n    }\n    if (document.landmarks.length > opts.maxLandmarks) {\n      lines.push(`... +${document.landmarks.length - opts.maxLandmarks} more`);\n    }\n    lines.push('');\n  }\n\n  // Interactables (compact, with intent)\n  if (opts.includeInteractables && document.interactables.length > 0) {\n    lines.push('ACTIONS:');\n    const items = document.interactables.slice(0, opts.maxInteractables);\n    for (const item of items) {\n      const selector = truncate(item.selector || '', 25);\n      const intent = item.intent || '-';\n      const url = opts.includeResourceUrls ? extractResourceUrl(item) : '';\n      const urlSuffix = url ? ` | ${url}` : '';\n      lines.push(`${item.role}: ${truncate(item.label, 20)} | ${selector} | ${intent}${urlSuffix}`);\n    }\n    if (document.interactables.length > opts.maxInteractables) {\n      lines.push(`... +${document.interactables.length - opts.maxInteractables} more`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Generate a minimal one-line summary\n * For ultra-compressed contexts (~20 tokens)\n *\n * @example\n * \"example.com | standard (75) | 5 landmarks | 12 actions\"\n */\nexport function toOneLiner(document: SemanticDocument): string {\n  const domain = extractDomain(document.url) || 'local';\n  const cert = document.agentReady;\n  return `${domain} | ${cert.level} (${cert.score}) | ${document.landmarks.length} landmarks | ${document.interactables.length} actions`;\n}\n\n/**\n * Generate a navigation-focused summary\n * Lists all navigable sections with anchors\n */\nexport function toNavSummary(document: SemanticDocument): string {\n  const lines: string[] = [];\n  const domain = extractDomain(document.url) || '';\n\n  lines.push(`NAV: ${domain}`);\n\n  // Extract navigation links\n  const navItems = document.interactables.filter(\n    (i) => i.intent === 'navigate' && i.role === 'link'\n  );\n\n  for (const item of navItems.slice(0, 15)) {\n    const href = extractHref(item);\n    lines.push(`${truncate(item.label, 20)}: ${href || item.selector || '-'}`);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Generate an audio-focused summary\n * Lists all playable audio elements\n */\nexport function toAudioSummary(document: SemanticDocument): string {\n  const lines: string[] = [];\n\n  // Filter by play intent (audio elements have intent='play')\n  const audioItems = document.interactables.filter(\n    (i) => i.intent === 'play'\n  );\n\n  if (audioItems.length === 0) {\n    return 'AUDIO: none';\n  }\n\n  lines.push(`AUDIO: ${audioItems.length} tracks`);\n\n  for (const item of audioItems) {\n    const url = extractResourceUrl(item);\n    lines.push(`- ${truncate(item.label, 30)}${url ? ': ' + url : ''}`);\n  }\n\n  return lines.join('\\n');\n}\n\n/**\n * Estimate token count for the summary\n * Based on ~4 chars per token heuristic\n */\nexport function estimateSummaryTokens(summary: string): number {\n  return Math.ceil(summary.length / 4);\n}\n\n/**\n * Compare token usage between formats\n */\nexport function compareTokenUsage(document: SemanticDocument): {\n  summary: number;\n  json: number;\n  savings: number;\n  savingsPercent: number;\n} {\n  const summary = toAgentSummary(document);\n  const json = JSON.stringify(\n    {\n      url: document.url,\n      title: document.title,\n      landmarks: document.landmarks.map((l) => ({ role: l.role, label: l.label })),\n      interactables: document.interactables.map((i) => ({\n        role: i.role,\n        label: i.label,\n        intent: i.intent,\n      })),\n      certification: document.agentReady,\n    },\n    null,\n    2\n  );\n\n  const summaryTokens = estimateSummaryTokens(summary);\n  const jsonTokens = Math.ceil(json.length / 4);\n  const savings = jsonTokens - summaryTokens;\n  const savingsPercent = Math.round((savings / jsonTokens) * 100);\n\n  return {\n    summary: summaryTokens,\n    json: jsonTokens,\n    savings,\n    savingsPercent,\n  };\n}\n\n// --- Helpers ---\n\nfunction truncate(str: string, maxLen: number): string {\n  if (!str) return '-';\n  if (str.length <= maxLen) return str;\n  return str.slice(0, maxLen - 2) + '..';\n}\n\nfunction extractDomain(url: string): string {\n  if (!url) return '';\n  try {\n    const parsed = new URL(url);\n    return parsed.hostname;\n  } catch {\n    return url.split('/')[0] || '';\n  }\n}\n\nfunction extractHref(node: SemanticNode): string {\n  // Check metadata for href\n  if (node.metadata && typeof node.metadata === 'object') {\n    const href = (node.metadata as Record<string, unknown>).href;\n    if (typeof href === 'string') return href;\n  }\n\n  // Try to extract from selector (e.g., a[href=\"#about\"])\n  const selectorMatch = node.selector?.match(/\\[href=[\"']([^\"']+)[\"']\\]/);\n  if (selectorMatch) return selectorMatch[1];\n\n  return '';\n}\n\nfunction extractResourceUrl(node: SemanticNode): string {\n  // Check metadata for src/href\n  if (node.metadata && typeof node.metadata === 'object') {\n    const meta = node.metadata as Record<string, unknown>;\n    if (typeof meta.src === 'string') return meta.src;\n    if (typeof meta.href === 'string') return meta.href;\n    if (typeof meta.url === 'string') return meta.url;\n  }\n\n  return '';\n}\n"]}