{"version":3,"sources":["../src/lib/rolling-summary.ts"],"names":["getContextWindow"],"mappings":";;;;;AAQA,SAAS,eAAe,IAAA,EAAsB;AAAE,EAAA,OAAO,IAAA,CAAK,IAAA,CAAA,CAAM,IAAA,IAAQ,EAAA,EAAI,SAAS,CAAC,CAAA;AAAE;AAEnF,SAAS,oBAAoB,QAAA,EAAyB;AAC3D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAC5B,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AACzB,QAAA,IAAI,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,cAAA,CAAe,EAAE,IAAI,CAAA;AAAA,aAAA,IACjC,CAAA,CAAE,OAAO,KAAA,IAAS,IAAA;AAAA,aAAA,IAClB,CAAA,CAAE,SAAS,KAAA,IAAS,cAAA,CAAe,KAAK,SAAA,CAAU,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,aAAA,IAClE,CAAA,CAAE,UAAA,EAAY,OAAA,EAAS,KAAA,IAAS,cAAA,CAAe,KAAK,SAAA,CAAU,CAAA,CAAE,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,MAC9F;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,CAAA,CAAE,OAAA,KAAY,UAAU,KAAA,IAAS,cAAA,CAAe,EAAE,OAAO,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,eAAA,CAAgB,QAAA,EAAiB,KAAA,EAAe,YAAA,GAAe,EAAA,EAAa;AAC1F,EAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAC3C,EAAA,MAAM,MAAA,GAASA,mCAAiB,KAAK,CAAA;AACrC,EAAA,OAAQ,MAAA,GAAS,MAAM,MAAA,GAAU,YAAA;AACnC;AAGO,SAAS,cAAc,aAAA,EAA8B;AAC1D,EAAA,IAAI,GAAA,GAAM,mHAAA;AACV,EAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,WAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,GACnC,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,GAAU,CAAA,MAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA,CAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAC3G,MAAA,CAAO,CAAA,CAAE,WAAW,EAAE,CAAA;AAC1B,IAAA,GAAA,IAAO,GAAG,IAAI,CAAA,EAAA,EAAK,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAI,CAAC;;AAAA,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-EZGQEBJ6.cjs","sourcesContent":["/**\n * Rolling summarization — when a conversation's estimated token count\n * approaches the model's context window, summarize older turns and\n * inject the summary as a single synthetic system-role message.\n */\nimport { getContextWindow } from './cost-estimator'\n\n// ~4 chars per token, approximate\nfunction estimateTokens(text: string): number { return Math.ceil((text || '').length / 4) }\n\nexport function estimateTotalTokens(messages: any[]): number {\n  let total = 0\n  for (const m of messages) {\n    if (Array.isArray(m.content)) {\n      for (const b of m.content) {\n        if (b.text) total += estimateTokens(b.text)\n        else if (b.image) total += 1500 // rough image token\n        else if (b.toolUse) total += estimateTokens(JSON.stringify(b.toolUse.input))\n        else if (b.toolResult?.content) total += estimateTokens(JSON.stringify(b.toolResult.content))\n      }\n    } else if (typeof m.content === 'string') total += estimateTokens(m.content)\n  }\n  return total\n}\n\n/**\n * If total exceeds threshold, return a new array where the first N\n * messages are collapsed into a single summary.\n * The summarization itself is delegated to the caller (e.g. via sub-agent).\n */\nexport function shouldSummarize(messages: any[], model: string, thresholdPct = 70): boolean {\n  const tokens = estimateTotalTokens(messages)\n  const window = getContextWindow(model)\n  return (tokens * 100 / window) > thresholdPct\n}\n\n/** Create a plain-text summary of older messages for compression. */\nexport function summaryPrompt(olderMessages: any[]): string {\n  let txt = 'Summarize this conversation concisely (under 500 words). Keep key facts, decisions, and unresolved questions.\\n\\n'\n  for (const m of olderMessages) {\n    const role = m.role === 'user' ? 'User' : 'Assistant'\n    const content = Array.isArray(m.content)\n      ? m.content.map((b: any) => b.text || (b.toolUse ? `[tool:${b.toolUse.name}]` : '')).filter(Boolean).join(' ')\n      : String(m.content || '')\n    txt += `${role}: ${content.slice(0, 1000)}\\n\\n`\n  }\n  return txt\n}\n"]}