@prestyj/cli 4.2.16 → 4.2.44

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 (286) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +15 -7
  3. package/dist/cli.js +458 -238
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +1 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +66 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +22 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +184 -23
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/agents.d.ts +0 -2
  14. package/dist/core/agents.d.ts.map +1 -1
  15. package/dist/core/agents.js +1 -5
  16. package/dist/core/agents.js.map +1 -1
  17. package/dist/core/auth-storage.d.ts +2 -0
  18. package/dist/core/auth-storage.d.ts.map +1 -1
  19. package/dist/core/auth-storage.js +66 -17
  20. package/dist/core/auth-storage.js.map +1 -1
  21. package/dist/core/auto-update.js +1 -1
  22. package/dist/core/auto-update.js.map +1 -1
  23. package/dist/core/compaction/compactor.d.ts +36 -5
  24. package/dist/core/compaction/compactor.d.ts.map +1 -1
  25. package/dist/core/compaction/compactor.js +222 -63
  26. package/dist/core/compaction/compactor.js.map +1 -1
  27. package/dist/core/compaction/compactor.test.js +377 -32
  28. package/dist/core/compaction/compactor.test.js.map +1 -1
  29. package/dist/core/compaction/token-estimator.d.ts +5 -0
  30. package/dist/core/compaction/token-estimator.d.ts.map +1 -1
  31. package/dist/core/compaction/token-estimator.js +41 -2
  32. package/dist/core/compaction/token-estimator.js.map +1 -1
  33. package/dist/core/compaction/token-estimator.test.js +43 -21
  34. package/dist/core/compaction/token-estimator.test.js.map +1 -1
  35. package/dist/core/event-bus.d.ts +6 -0
  36. package/dist/core/event-bus.d.ts.map +1 -1
  37. package/dist/core/event-bus.js +7 -0
  38. package/dist/core/event-bus.js.map +1 -1
  39. package/dist/core/file-lock.d.ts +6 -0
  40. package/dist/core/file-lock.d.ts.map +1 -0
  41. package/dist/core/file-lock.js +76 -0
  42. package/dist/core/file-lock.js.map +1 -0
  43. package/dist/core/index.d.ts +2 -2
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/index.js +1 -1
  46. package/dist/core/index.js.map +1 -1
  47. package/dist/core/mcp/client.d.ts +0 -26
  48. package/dist/core/mcp/client.d.ts.map +1 -1
  49. package/dist/core/mcp/client.js +34 -141
  50. package/dist/core/mcp/client.js.map +1 -1
  51. package/dist/core/mcp/defaults.d.ts.map +1 -1
  52. package/dist/core/mcp/defaults.js +4 -8
  53. package/dist/core/mcp/defaults.js.map +1 -1
  54. package/dist/core/mcp/types.d.ts +0 -2
  55. package/dist/core/mcp/types.d.ts.map +1 -1
  56. package/dist/core/model-registry.d.ts +2 -1
  57. package/dist/core/model-registry.d.ts.map +1 -1
  58. package/dist/core/model-registry.js +16 -5
  59. package/dist/core/model-registry.js.map +1 -1
  60. package/dist/core/oauth/anthropic.d.ts.map +1 -1
  61. package/dist/core/oauth/anthropic.js +3 -3
  62. package/dist/core/oauth/anthropic.js.map +1 -1
  63. package/dist/core/prompt-commands.d.ts.map +1 -1
  64. package/dist/core/prompt-commands.js +21 -0
  65. package/dist/core/prompt-commands.js.map +1 -1
  66. package/dist/core/session-manager.d.ts +34 -2
  67. package/dist/core/session-manager.d.ts.map +1 -1
  68. package/dist/core/session-manager.js +160 -54
  69. package/dist/core/session-manager.js.map +1 -1
  70. package/dist/core/settings-manager.d.ts +2 -2
  71. package/dist/core/skills.d.ts +2 -1
  72. package/dist/core/skills.d.ts.map +1 -1
  73. package/dist/core/skills.js +8 -8
  74. package/dist/core/skills.js.map +1 -1
  75. package/dist/core/slash-commands.d.ts +4 -0
  76. package/dist/core/slash-commands.d.ts.map +1 -1
  77. package/dist/core/slash-commands.js +22 -0
  78. package/dist/core/slash-commands.js.map +1 -1
  79. package/dist/core/telegram.d.ts +94 -0
  80. package/dist/core/telegram.d.ts.map +1 -0
  81. package/dist/core/telegram.js +227 -0
  82. package/dist/core/telegram.js.map +1 -0
  83. package/dist/interactive.d.ts.map +1 -1
  84. package/dist/interactive.js +36 -5
  85. package/dist/interactive.js.map +1 -1
  86. package/dist/modes/index.d.ts +1 -0
  87. package/dist/modes/index.d.ts.map +1 -1
  88. package/dist/modes/index.js +1 -0
  89. package/dist/modes/index.js.map +1 -1
  90. package/dist/modes/json-mode.d.ts.map +1 -1
  91. package/dist/modes/json-mode.js +2 -1
  92. package/dist/modes/json-mode.js.map +1 -1
  93. package/dist/modes/print-mode.d.ts.map +1 -1
  94. package/dist/modes/print-mode.js +2 -1
  95. package/dist/modes/print-mode.js.map +1 -1
  96. package/dist/modes/rpc-mode.d.ts +28 -0
  97. package/dist/modes/rpc-mode.d.ts.map +1 -0
  98. package/dist/modes/rpc-mode.js +146 -0
  99. package/dist/modes/rpc-mode.js.map +1 -0
  100. package/dist/modes/serve-mode.d.ts +21 -0
  101. package/dist/modes/serve-mode.d.ts.map +1 -0
  102. package/dist/modes/serve-mode.js +650 -0
  103. package/dist/modes/serve-mode.js.map +1 -0
  104. package/dist/system-prompt.d.ts +1 -1
  105. package/dist/system-prompt.d.ts.map +1 -1
  106. package/dist/system-prompt.js +45 -10
  107. package/dist/system-prompt.js.map +1 -1
  108. package/dist/tools/bash.d.ts +4 -1
  109. package/dist/tools/bash.d.ts.map +1 -1
  110. package/dist/tools/bash.js +58 -5
  111. package/dist/tools/bash.js.map +1 -1
  112. package/dist/tools/edit.d.ts +4 -1
  113. package/dist/tools/edit.d.ts.map +1 -1
  114. package/dist/tools/edit.js +9 -5
  115. package/dist/tools/edit.js.map +1 -1
  116. package/dist/tools/enter-plan.d.ts +8 -0
  117. package/dist/tools/enter-plan.d.ts.map +1 -0
  118. package/dist/tools/enter-plan.js +28 -0
  119. package/dist/tools/enter-plan.js.map +1 -0
  120. package/dist/tools/exit-plan.d.ts +8 -0
  121. package/dist/tools/exit-plan.d.ts.map +1 -0
  122. package/dist/tools/exit-plan.js +35 -0
  123. package/dist/tools/exit-plan.js.map +1 -0
  124. package/dist/tools/grep.d.ts +2 -1
  125. package/dist/tools/grep.d.ts.map +1 -1
  126. package/dist/tools/grep.js +7 -8
  127. package/dist/tools/grep.js.map +1 -1
  128. package/dist/tools/index.d.ts +17 -0
  129. package/dist/tools/index.d.ts.map +1 -1
  130. package/dist/tools/index.js +26 -7
  131. package/dist/tools/index.js.map +1 -1
  132. package/dist/tools/ls.d.ts +2 -1
  133. package/dist/tools/ls.d.ts.map +1 -1
  134. package/dist/tools/ls.js +4 -4
  135. package/dist/tools/ls.js.map +1 -1
  136. package/dist/tools/operations.d.ts +39 -0
  137. package/dist/tools/operations.d.ts.map +1 -0
  138. package/dist/tools/operations.js +27 -0
  139. package/dist/tools/operations.js.map +1 -0
  140. package/dist/tools/path-utils.d.ts +5 -0
  141. package/dist/tools/path-utils.d.ts.map +1 -1
  142. package/dist/tools/path-utils.js +18 -0
  143. package/dist/tools/path-utils.js.map +1 -1
  144. package/dist/tools/plan-mode.test.d.ts +2 -0
  145. package/dist/tools/plan-mode.test.d.ts.map +1 -0
  146. package/dist/tools/plan-mode.test.js +214 -0
  147. package/dist/tools/plan-mode.test.js.map +1 -0
  148. package/dist/tools/read.d.ts +2 -1
  149. package/dist/tools/read.d.ts.map +1 -1
  150. package/dist/tools/read.js +6 -5
  151. package/dist/tools/read.js.map +1 -1
  152. package/dist/tools/skill.d.ts +10 -0
  153. package/dist/tools/skill.d.ts.map +1 -0
  154. package/dist/tools/skill.js +36 -0
  155. package/dist/tools/skill.js.map +1 -0
  156. package/dist/tools/subagent.d.ts +3 -1
  157. package/dist/tools/subagent.d.ts.map +1 -1
  158. package/dist/tools/subagent.js +46 -4
  159. package/dist/tools/subagent.js.map +1 -1
  160. package/dist/tools/tasks.d.ts +2 -2
  161. package/dist/tools/web-fetch.d.ts.map +1 -1
  162. package/dist/tools/web-fetch.js +47 -0
  163. package/dist/tools/web-fetch.js.map +1 -1
  164. package/dist/tools/write.d.ts +4 -1
  165. package/dist/tools/write.d.ts.map +1 -1
  166. package/dist/tools/write.js +17 -6
  167. package/dist/tools/write.js.map +1 -1
  168. package/dist/ui/App.d.ts +35 -1
  169. package/dist/ui/App.d.ts.map +1 -1
  170. package/dist/ui/App.js +367 -91
  171. package/dist/ui/App.js.map +1 -1
  172. package/dist/ui/components/ActivityIndicator.d.ts +2 -1
  173. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  174. package/dist/ui/components/ActivityIndicator.js +25 -4
  175. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  176. package/dist/ui/components/AnimationContext.d.ts +22 -0
  177. package/dist/ui/components/AnimationContext.d.ts.map +1 -0
  178. package/dist/ui/components/AnimationContext.js +35 -0
  179. package/dist/ui/components/AnimationContext.js.map +1 -0
  180. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  181. package/dist/ui/components/AssistantMessage.js +6 -1
  182. package/dist/ui/components/AssistantMessage.js.map +1 -1
  183. package/dist/ui/components/Banner.d.ts.map +1 -1
  184. package/dist/ui/components/Banner.js +4 -7
  185. package/dist/ui/components/Banner.js.map +1 -1
  186. package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
  187. package/dist/ui/components/CompactionNotice.js +4 -8
  188. package/dist/ui/components/CompactionNotice.js.map +1 -1
  189. package/dist/ui/components/Footer.d.ts +2 -1
  190. package/dist/ui/components/Footer.d.ts.map +1 -1
  191. package/dist/ui/components/Footer.js +8 -15
  192. package/dist/ui/components/Footer.js.map +1 -1
  193. package/dist/ui/components/InputArea.d.ts +3 -1
  194. package/dist/ui/components/InputArea.d.ts.map +1 -1
  195. package/dist/ui/components/InputArea.js +23 -25
  196. package/dist/ui/components/InputArea.js.map +1 -1
  197. package/dist/ui/components/PlanApproval.d.ts +8 -0
  198. package/dist/ui/components/PlanApproval.d.ts.map +1 -0
  199. package/dist/ui/components/PlanApproval.js +44 -0
  200. package/dist/ui/components/PlanApproval.js.map +1 -0
  201. package/dist/ui/components/PlanBanner.d.ts +6 -0
  202. package/dist/ui/components/PlanBanner.d.ts.map +1 -0
  203. package/dist/ui/components/PlanBanner.js +14 -0
  204. package/dist/ui/components/PlanBanner.js.map +1 -0
  205. package/dist/ui/components/PlanOverlay.d.ts +11 -0
  206. package/dist/ui/components/PlanOverlay.d.ts.map +1 -0
  207. package/dist/ui/components/PlanOverlay.js +263 -0
  208. package/dist/ui/components/PlanOverlay.js.map +1 -0
  209. package/dist/ui/components/ServerToolExecution.d.ts +1 -0
  210. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  211. package/dist/ui/components/ServerToolExecution.js +12 -3
  212. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  213. package/dist/ui/components/SkillsOverlay.d.ts +7 -0
  214. package/dist/ui/components/SkillsOverlay.d.ts.map +1 -0
  215. package/dist/ui/components/SkillsOverlay.js +158 -0
  216. package/dist/ui/components/SkillsOverlay.js.map +1 -0
  217. package/dist/ui/components/Spinner.d.ts.map +1 -1
  218. package/dist/ui/components/Spinner.js +5 -9
  219. package/dist/ui/components/Spinner.js.map +1 -1
  220. package/dist/ui/components/StreamingArea.d.ts +2 -1
  221. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  222. package/dist/ui/components/StreamingArea.js +11 -4
  223. package/dist/ui/components/StreamingArea.js.map +1 -1
  224. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  225. package/dist/ui/components/SubAgentPanel.js +27 -29
  226. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  227. package/dist/ui/components/TaskOverlay.d.ts.map +1 -1
  228. package/dist/ui/components/TaskOverlay.js +7 -3
  229. package/dist/ui/components/TaskOverlay.js.map +1 -1
  230. package/dist/ui/components/ThinkingBlock.d.ts.map +1 -1
  231. package/dist/ui/components/ThinkingBlock.js +4 -1
  232. package/dist/ui/components/ThinkingBlock.js.map +1 -1
  233. package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -1
  234. package/dist/ui/components/ThinkingIndicator.js +8 -33
  235. package/dist/ui/components/ThinkingIndicator.js.map +1 -1
  236. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  237. package/dist/ui/components/ToolExecution.js +95 -41
  238. package/dist/ui/components/ToolExecution.js.map +1 -1
  239. package/dist/ui/components/ToolGroupExecution.d.ts +7 -0
  240. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -0
  241. package/dist/ui/components/ToolGroupExecution.js +115 -0
  242. package/dist/ui/components/ToolGroupExecution.js.map +1 -0
  243. package/dist/ui/components/UserMessage.js +1 -1
  244. package/dist/ui/components/UserMessage.js.map +1 -1
  245. package/dist/ui/components/index.d.ts +1 -0
  246. package/dist/ui/components/index.d.ts.map +1 -1
  247. package/dist/ui/components/index.js +1 -0
  248. package/dist/ui/components/index.js.map +1 -1
  249. package/dist/ui/hooks/useAgentLoop.d.ts +8 -0
  250. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  251. package/dist/ui/hooks/useAgentLoop.js +320 -220
  252. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  253. package/dist/ui/hooks/useTerminalSize.d.ts +21 -9
  254. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  255. package/dist/ui/hooks/useTerminalSize.js +33 -16
  256. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  257. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
  258. package/dist/ui/hooks/useTerminalTitle.js +8 -16
  259. package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
  260. package/dist/ui/live-item-flush.d.ts +11 -1
  261. package/dist/ui/live-item-flush.d.ts.map +1 -1
  262. package/dist/ui/live-item-flush.js +81 -2
  263. package/dist/ui/live-item-flush.js.map +1 -1
  264. package/dist/ui/login.d.ts +1 -1
  265. package/dist/ui/login.d.ts.map +1 -1
  266. package/dist/ui/login.js +30 -6
  267. package/dist/ui/login.js.map +1 -1
  268. package/dist/ui/render.d.ts +11 -0
  269. package/dist/ui/render.d.ts.map +1 -1
  270. package/dist/ui/render.js +24 -10
  271. package/dist/ui/render.js.map +1 -1
  272. package/dist/ui/sessions.d.ts +2 -0
  273. package/dist/ui/sessions.d.ts.map +1 -0
  274. package/dist/ui/sessions.js +208 -0
  275. package/dist/ui/sessions.js.map +1 -0
  276. package/dist/ui/theme/dark.json +3 -1
  277. package/dist/ui/theme/light.json +3 -1
  278. package/dist/ui/theme/theme.d.ts +2 -0
  279. package/dist/ui/theme/theme.d.ts.map +1 -1
  280. package/dist/utils/error-handler.d.ts.map +1 -1
  281. package/dist/utils/error-handler.js +17 -5
  282. package/dist/utils/error-handler.js.map +1 -1
  283. package/dist/utils/image.d.ts.map +1 -1
  284. package/dist/utils/image.js +60 -5
  285. package/dist/utils/image.js.map +1 -1
  286. package/package.json +8 -8
@@ -1,52 +1,78 @@
1
- import { describe, it, expect } from "vitest";
2
- import { shouldCompact, findRecentCutPoint } from "./compactor.js";
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { shouldCompact, findRecentCutPoint, prepareMessagesForSummary, selectMessagesInBudget, buildFallbackSummary, extractSummaryText, compact, } from "./compactor.js";
3
3
  import { estimateConversationTokens } from "./token-estimator.js";
4
+ import { getContextWindow } from "../model-registry.js";
4
5
  function makeMessage(role, content) {
5
6
  return { role, content };
6
7
  }
7
- function makeToolCallMessage() {
8
+ function makeToolCallMessage(name = "read", args = { file_path: "foo.ts" }, id = "t1") {
8
9
  return {
9
10
  role: "assistant",
10
- content: [{ type: "tool_call", id: "t1", name: "read", args: { path: "foo.ts" } }],
11
+ content: [{ type: "tool_call", id, name, args }],
11
12
  };
12
13
  }
13
- function makeToolResultMessage() {
14
+ function makeToolResultMessage(toolCallId = "t1", content = "file contents") {
14
15
  return {
15
16
  role: "tool",
16
- content: [{ type: "tool_result", toolCallId: "t1", content: "file contents" }],
17
+ content: [{ type: "tool_result", toolCallId, content }],
18
+ };
19
+ }
20
+ function makeAssistantWithThinking(text, thinking) {
21
+ return {
22
+ role: "assistant",
23
+ content: [
24
+ { type: "thinking", text: thinking, signature: "sig123" },
25
+ { type: "text", text },
26
+ ],
17
27
  };
18
28
  }
19
29
  // ── shouldCompact ──────────────────────────────────────────
20
30
  describe("shouldCompact", () => {
21
31
  it("returns false when under threshold", () => {
22
32
  const messages = [makeMessage("system", "sys"), makeMessage("user", "hello")];
23
- // Estimated tokens ~= 13, contextWindow 200k, threshold 0.8 → 160k
24
33
  expect(shouldCompact(messages, 200_000, 0.8)).toBe(false);
25
34
  });
26
35
  it("returns true when over threshold", () => {
27
- // Create a message with enough content to exceed a small context window
28
- const bigContent = "x".repeat(1000); // ~250 tokens
36
+ const bigContent = "x".repeat(1000);
29
37
  const messages = [makeMessage("system", bigContent), makeMessage("user", bigContent)];
30
- // Total ~508 tokens, window=500, threshold 0.8 → 400
31
38
  expect(shouldCompact(messages, 500, 0.8)).toBe(true);
32
39
  });
33
40
  it("uses default threshold of 0.8", () => {
34
- const content = "x".repeat(400); // ~100 tokens + 4 overhead = 104
41
+ const content = "x".repeat(400);
35
42
  const messages = [makeMessage("user", content)];
36
43
  const estimated = estimateConversationTokens(messages);
37
- // With window = estimated / 0.7 → should be under 0.8 threshold
38
44
  expect(shouldCompact(messages, Math.ceil(estimated / 0.7))).toBe(false);
39
- // With window = estimated / 0.9 → should be over 0.8 threshold
40
45
  expect(shouldCompact(messages, Math.ceil(estimated / 0.9))).toBe(true);
41
46
  });
42
47
  it("handles custom threshold", () => {
43
- const content = "x".repeat(200); // ~50 tokens + 4 = 54
48
+ const content = "x".repeat(200);
44
49
  const messages = [makeMessage("user", content)];
45
50
  const estimated = estimateConversationTokens(messages);
46
- // Tight threshold: 0.5 → need window > estimated/0.5 to not compact
47
51
  expect(shouldCompact(messages, estimated * 3, 0.5)).toBe(false);
48
52
  expect(shouldCompact(messages, estimated, 0.5)).toBe(true);
49
53
  });
54
+ it("triggers compaction when switching from large to small context model", () => {
55
+ // Simulate a conversation that's at ~400k tokens (40% of Opus 1M, but >100% of Kimi 128k)
56
+ // Each message: ~10000 chars = ~2500 tokens + 4 overhead ≈ 2504 tokens
57
+ // 160 pairs ≈ 160 × 2 × 2504 ≈ 801k tokens — well over Kimi's 128k threshold
58
+ const messages = [makeMessage("system", "sys")];
59
+ for (let i = 0; i < 160; i++) {
60
+ messages.push(makeMessage("user", `msg ${i} ${"x".repeat(10_000)}`));
61
+ messages.push(makeMessage("assistant", `response ${i}`));
62
+ }
63
+ const estimated = estimateConversationTokens(messages);
64
+ const opusContext = getContextWindow("claude-opus-4-6");
65
+ const kimiContext = getContextWindow("kimi-k2.5");
66
+ // Sanity: Opus has 1M, Kimi has 128k
67
+ expect(opusContext).toBe(1_000_000);
68
+ expect(kimiContext).toBe(128_000);
69
+ // Under Opus (1M): conversation is well under 80% threshold — no compaction
70
+ expect(shouldCompact(messages, opusContext, 0.8)).toBe(false);
71
+ expect(estimated).toBeLessThan(opusContext * 0.8);
72
+ // Under Kimi (128k): same conversation exceeds 80% threshold — must compact
73
+ expect(shouldCompact(messages, kimiContext, 0.8)).toBe(true);
74
+ expect(estimated).toBeGreaterThan(kimiContext * 0.8);
75
+ });
50
76
  });
51
77
  // ── findRecentCutPoint ─────────────────────────────────────
52
78
  describe("findRecentCutPoint", () => {
@@ -56,21 +82,19 @@ describe("findRecentCutPoint", () => {
56
82
  makeMessage("user", "hello"),
57
83
  makeMessage("assistant", "hi"),
58
84
  ];
59
- // All messages are small, budget is huge
60
85
  const cut = findRecentCutPoint(messages, 100_000);
61
- expect(cut).toBe(1); // Only system (index 0) is excluded
86
+ expect(cut).toBe(1);
62
87
  });
63
88
  it("keeps only recent messages when total exceeds budget", () => {
64
- const big = "x".repeat(400); // ~100 tokens each
89
+ const big = "x".repeat(400);
65
90
  const messages = [
66
91
  makeMessage("system", "sys"),
67
- makeMessage("user", big), // ~104 tokens
68
- makeMessage("assistant", big), // ~104 tokens
69
- makeMessage("user", big), // ~104 tokens
70
- makeMessage("assistant", big), // ~104 tokens
71
- makeMessage("user", "last"), // ~5 tokens
92
+ makeMessage("user", big),
93
+ makeMessage("assistant", big),
94
+ makeMessage("user", big),
95
+ makeMessage("assistant", big),
96
+ makeMessage("user", "last"),
72
97
  ];
73
- // Budget of 120 tokens — should keep last ~1-2 messages
74
98
  const cut = findRecentCutPoint(messages, 120);
75
99
  expect(cut).toBeGreaterThan(1);
76
100
  expect(cut).toBeLessThan(messages.length);
@@ -81,18 +105,15 @@ describe("findRecentCutPoint", () => {
81
105
  expect(cut).toBeGreaterThanOrEqual(1);
82
106
  });
83
107
  it("does not split tool_call and tool_result pairs", () => {
84
- const big = "x".repeat(400); // ~100 tokens
108
+ const big = "x".repeat(400);
85
109
  const messages = [
86
110
  makeMessage("system", "sys"),
87
111
  makeMessage("user", big),
88
- makeToolCallMessage(), // assistant with tool_call
89
- makeToolResultMessage(), // tool result
112
+ makeToolCallMessage(),
113
+ makeToolResultMessage(),
90
114
  makeMessage("user", "thanks"),
91
115
  ];
92
- // Budget that would normally cut at the tool result (index 3)
93
- // should back up to include the tool_call (index 2)
94
116
  const cut = findRecentCutPoint(messages, 50);
95
- // The cut should NOT leave a tool result as the first kept message
96
117
  if (cut < messages.length) {
97
118
  expect(messages[cut].role).not.toBe("tool");
98
119
  }
@@ -100,7 +121,7 @@ describe("findRecentCutPoint", () => {
100
121
  it("handles conversation with only system message", () => {
101
122
  const messages = [makeMessage("system", "sys")];
102
123
  const cut = findRecentCutPoint(messages, 100);
103
- expect(cut).toBe(1); // Nothing to keep beyond system
124
+ expect(cut).toBe(1);
104
125
  });
105
126
  it("returns length when budget is 0", () => {
106
127
  const messages = [
@@ -109,8 +130,332 @@ describe("findRecentCutPoint", () => {
109
130
  makeMessage("assistant", "hi"),
110
131
  ];
111
132
  const cut = findRecentCutPoint(messages, 0);
112
- // Can't fit anything — cut at the end
113
133
  expect(cut).toBe(messages.length);
114
134
  });
115
135
  });
136
+ // ── prepareMessagesForSummary ──────────────────────────────
137
+ describe("prepareMessagesForSummary", () => {
138
+ it("strips thinking blocks from assistant messages", () => {
139
+ const msgs = [makeAssistantWithThinking("Hello there", "Let me think about this...")];
140
+ const prepared = prepareMessagesForSummary(msgs);
141
+ const content = prepared[0].content;
142
+ expect(content).toHaveLength(1);
143
+ expect(content[0].type).toBe("text");
144
+ });
145
+ it("truncates long tool results", () => {
146
+ const longContent = "x".repeat(5000);
147
+ const msgs = [makeToolResultMessage("t1", longContent)];
148
+ const prepared = prepareMessagesForSummary(msgs);
149
+ const results = prepared[0].content;
150
+ expect(results[0].content.length).toBeLessThan(longContent.length);
151
+ expect(results[0].content).toContain("truncated");
152
+ });
153
+ it("truncates long user messages", () => {
154
+ const longContent = "x".repeat(5000);
155
+ const msgs = [makeMessage("user", longContent)];
156
+ const prepared = prepareMessagesForSummary(msgs);
157
+ expect(prepared[0].content.length).toBeLessThan(longContent.length);
158
+ expect(prepared[0].content).toContain("truncated");
159
+ });
160
+ it("truncates long assistant text parts", () => {
161
+ const longText = "x".repeat(5000);
162
+ const msgs = [
163
+ { role: "assistant", content: [{ type: "text", text: longText }] },
164
+ ];
165
+ const prepared = prepareMessagesForSummary(msgs);
166
+ const content = prepared[0].content;
167
+ const textPart = content[0];
168
+ expect(textPart.text.length).toBeLessThan(longText.length);
169
+ expect(textPart.text).toContain("truncated");
170
+ });
171
+ it("does not mutate original messages", () => {
172
+ const longContent = "x".repeat(5000);
173
+ const original = makeToolResultMessage("t1", longContent);
174
+ const originalContent = original.content[0].content;
175
+ prepareMessagesForSummary([original]);
176
+ // Original should be unchanged
177
+ expect(original.content[0].content).toBe(originalContent);
178
+ expect(original.content[0].content.length).toBe(5000);
179
+ });
180
+ it("passes through short messages unchanged", () => {
181
+ const msgs = [makeMessage("user", "hello")];
182
+ const prepared = prepareMessagesForSummary(msgs);
183
+ expect(prepared[0].content).toBe("hello");
184
+ });
185
+ it("returns empty string content when all parts are thinking blocks", () => {
186
+ const msgs = [
187
+ {
188
+ role: "assistant",
189
+ content: [{ type: "thinking", text: "deep thoughts", signature: "sig" }],
190
+ },
191
+ ];
192
+ const prepared = prepareMessagesForSummary(msgs);
193
+ expect(prepared[0].content).toBe("");
194
+ });
195
+ });
196
+ // ── selectMessagesInBudget ─────────────────────────────────
197
+ describe("selectMessagesInBudget", () => {
198
+ it("selects all messages when budget is large", () => {
199
+ const msgs = [makeMessage("user", "hello"), makeMessage("assistant", "hi")];
200
+ const selected = selectMessagesInBudget(msgs, 100_000);
201
+ expect(selected).toHaveLength(2);
202
+ });
203
+ it("selects no messages when budget is 0", () => {
204
+ const msgs = [makeMessage("user", "hello")];
205
+ const selected = selectMessagesInBudget(msgs, 0);
206
+ expect(selected).toHaveLength(0);
207
+ });
208
+ it("stops when budget is exceeded", () => {
209
+ const big = "x".repeat(2000); // ~500 tokens each + overhead
210
+ const msgs = [
211
+ makeMessage("user", big),
212
+ makeMessage("assistant", big),
213
+ makeMessage("user", big),
214
+ makeMessage("assistant", big),
215
+ ];
216
+ const selected = selectMessagesInBudget(msgs, 600);
217
+ expect(selected.length).toBeGreaterThan(0);
218
+ expect(selected.length).toBeLessThan(msgs.length);
219
+ });
220
+ it("walks forward from start", () => {
221
+ const msgs = [
222
+ makeMessage("user", "first"),
223
+ makeMessage("assistant", "second"),
224
+ makeMessage("user", "third"),
225
+ ];
226
+ const selected = selectMessagesInBudget(msgs, 100_000);
227
+ expect(selected[0].content).toBe("first");
228
+ expect(selected[2].content).toBe("third");
229
+ });
230
+ });
231
+ // ── buildFallbackSummary ───────────────────────────────────
232
+ describe("buildFallbackSummary", () => {
233
+ it("includes goal from first user message", () => {
234
+ const msgs = [
235
+ makeMessage("user", "Fix the login bug"),
236
+ makeMessage("assistant", "I'll look into it"),
237
+ ];
238
+ const summary = buildFallbackSummary(msgs, { read: new Set(), modified: new Set() });
239
+ expect(summary).toContain("Fix the login bug");
240
+ expect(summary).toContain("## Goal");
241
+ });
242
+ it("includes message and tool call counts", () => {
243
+ const msgs = [
244
+ makeMessage("user", "Fix it"),
245
+ makeToolCallMessage(),
246
+ makeToolResultMessage(),
247
+ makeMessage("assistant", "Done"),
248
+ ];
249
+ const summary = buildFallbackSummary(msgs, { read: new Set(), modified: new Set() });
250
+ expect(summary).toContain("## Progress");
251
+ expect(summary).toContain("4 messages exchanged");
252
+ expect(summary).toContain("1 tool calls executed");
253
+ });
254
+ it("includes read files", () => {
255
+ const fileOps = {
256
+ read: new Set(["src/foo.ts", "src/bar.ts"]),
257
+ modified: new Set(),
258
+ };
259
+ const summary = buildFallbackSummary([makeMessage("user", "Check files")], fileOps);
260
+ expect(summary).toContain("## Files Read");
261
+ expect(summary).toContain("src/foo.ts");
262
+ expect(summary).toContain("src/bar.ts");
263
+ });
264
+ it("includes modified files", () => {
265
+ const fileOps = {
266
+ read: new Set(),
267
+ modified: new Set(["src/main.ts"]),
268
+ };
269
+ const summary = buildFallbackSummary([makeMessage("user", "Edit main")], fileOps);
270
+ expect(summary).toContain("## Files Modified");
271
+ expect(summary).toContain("src/main.ts");
272
+ });
273
+ it("handles no user messages gracefully", () => {
274
+ const summary = buildFallbackSummary([makeMessage("assistant", "Something")], {
275
+ read: new Set(),
276
+ modified: new Set(),
277
+ });
278
+ expect(summary).toContain("could not determine");
279
+ });
280
+ it("truncates very long first user message", () => {
281
+ const longMsg = "x".repeat(1000);
282
+ const summary = buildFallbackSummary([makeMessage("user", longMsg)], {
283
+ read: new Set(),
284
+ modified: new Set(),
285
+ });
286
+ expect(summary.length).toBeLessThan(longMsg.length);
287
+ });
288
+ });
289
+ // ── extractSummaryText ─────────────────────────────────────
290
+ describe("extractSummaryText", () => {
291
+ it("returns string content directly", () => {
292
+ expect(extractSummaryText("Hello summary")).toBe("Hello summary");
293
+ });
294
+ it("extracts text from ContentPart array", () => {
295
+ const parts = [
296
+ { type: "text", text: "Part one. " },
297
+ { type: "text", text: "Part two." },
298
+ ];
299
+ expect(extractSummaryText(parts)).toBe("Part one. Part two.");
300
+ });
301
+ it("filters out non-text parts", () => {
302
+ const parts = [
303
+ { type: "thinking", text: "hmm", signature: "sig" },
304
+ { type: "text", text: "The summary." },
305
+ ];
306
+ expect(extractSummaryText(parts)).toBe("The summary.");
307
+ });
308
+ it("returns empty string for empty array", () => {
309
+ expect(extractSummaryText([])).toBe("");
310
+ });
311
+ it("returns empty string for array with only thinking parts", () => {
312
+ const parts = [{ type: "thinking", text: "hmm", signature: "sig" }];
313
+ expect(extractSummaryText(parts)).toBe("");
314
+ });
315
+ });
316
+ // ── compact (integration) ──────────────────────────────────
317
+ vi.mock("@prestyj/ai", async (importOriginal) => {
318
+ const actual = await importOriginal();
319
+ return {
320
+ ...actual,
321
+ stream: vi.fn(),
322
+ };
323
+ });
324
+ // Must import stream AFTER mock setup
325
+ import { stream } from "@prestyj/ai";
326
+ describe("compact", () => {
327
+ const baseOptions = {
328
+ provider: "anthropic",
329
+ model: "claude-sonnet-4-6-20250514",
330
+ apiKey: "test-key",
331
+ contextWindow: 200_000,
332
+ };
333
+ // Each user message: ~20 + 10000 chars ≈ 2504 tokens + 4 overhead ≈ 2508 tokens
334
+ // Each assistant: ~12 chars ≈ 7 tokens
335
+ // 30 pairs ≈ 30 × 2515 ≈ 75K tokens total (well over 20K recent budget)
336
+ function buildConversation(middleCount) {
337
+ const msgs = [makeMessage("system", "You are a helpful assistant.")];
338
+ for (let i = 0; i < middleCount; i++) {
339
+ const big = `Message content ${i} ${"x".repeat(10_000)}`;
340
+ msgs.push(makeMessage("user", big));
341
+ msgs.push(makeMessage("assistant", `Response ${i}`));
342
+ }
343
+ // Add a recent small message
344
+ msgs.push(makeMessage("user", "latest question"));
345
+ return msgs;
346
+ }
347
+ /** Build a mock StreamResult-like object that resolves to the given response. */
348
+ function mockStreamResult(response) {
349
+ // Suppress unhandled rejection for error mocks
350
+ response.catch(() => { });
351
+ return {
352
+ response,
353
+ events: {
354
+ [Symbol.asyncIterator]: () => ({
355
+ next: () => Promise.resolve({ done: true, value: undefined }),
356
+ }),
357
+ },
358
+ [Symbol.asyncIterator]() {
359
+ return {
360
+ next: () => Promise.resolve({ done: true, value: undefined }),
361
+ };
362
+ },
363
+ };
364
+ }
365
+ it("skips compaction when too few middle messages", async () => {
366
+ const messages = [
367
+ makeMessage("system", "sys"),
368
+ makeMessage("user", "hi"),
369
+ makeMessage("assistant", "hello"),
370
+ ];
371
+ const result = await compact(messages, baseOptions);
372
+ expect(result.result.originalCount).toBe(3);
373
+ expect(result.result.newCount).toBe(3);
374
+ expect(result.messages).toHaveLength(3);
375
+ });
376
+ it("produces summary message with LLM response", async () => {
377
+ const mockStream = vi.mocked(stream);
378
+ mockStream.mockReturnValue(mockStreamResult(Promise.resolve({
379
+ message: { role: "assistant", content: "This is a great summary of the conversation." },
380
+ stopReason: "end_turn",
381
+ usage: { inputTokens: 1000, outputTokens: 200 },
382
+ })));
383
+ const messages = buildConversation(30);
384
+ const result = await compact(messages, baseOptions);
385
+ // Should have: system + summary + assistant ack + recent messages
386
+ expect(result.messages.length).toBeLessThan(messages.length);
387
+ expect(result.result.originalCount).toBe(messages.length);
388
+ // The summary message should contain the LLM's summary
389
+ const summaryMsg = result.messages[1];
390
+ expect(summaryMsg.role).toBe("user");
391
+ expect(summaryMsg.content).toContain("[Previous conversation summary]");
392
+ expect(summaryMsg.content).toContain("great summary");
393
+ });
394
+ it("uses fallback summary when LLM returns empty", async () => {
395
+ const mockStream = vi.mocked(stream);
396
+ mockStream.mockReturnValue(mockStreamResult(Promise.resolve({
397
+ message: { role: "assistant", content: "" },
398
+ stopReason: "end_turn",
399
+ usage: { inputTokens: 1000, outputTokens: 0 },
400
+ })));
401
+ const messages = buildConversation(30);
402
+ const result = await compact(messages, baseOptions);
403
+ const summaryMsg = result.messages[1];
404
+ expect(summaryMsg.role).toBe("user");
405
+ expect(summaryMsg.content).toContain("[Previous conversation summary]");
406
+ expect(summaryMsg.content).toContain("## Goal");
407
+ expect(summaryMsg.content).toContain("## Progress");
408
+ });
409
+ it("uses fallback summary when LLM throws error", async () => {
410
+ const mockStream = vi.mocked(stream);
411
+ mockStream.mockReturnValue(mockStreamResult(Promise.reject(new Error("API error"))));
412
+ const messages = buildConversation(30);
413
+ const result = await compact(messages, baseOptions);
414
+ const summaryMsg = result.messages[1];
415
+ expect(summaryMsg.content).toContain("## Goal");
416
+ });
417
+ it("preserves system message", async () => {
418
+ const mockStream = vi.mocked(stream);
419
+ mockStream.mockReturnValue(mockStreamResult(Promise.resolve({
420
+ message: { role: "assistant", content: "Summary text here." },
421
+ stopReason: "end_turn",
422
+ usage: { inputTokens: 500, outputTokens: 100 },
423
+ })));
424
+ const messages = buildConversation(30);
425
+ const result = await compact(messages, baseOptions);
426
+ expect(result.messages[0].role).toBe("system");
427
+ expect(result.messages[0].content).toBe("You are a helpful assistant.");
428
+ });
429
+ it("does not end with an assistant message", async () => {
430
+ const mockStream = vi.mocked(stream);
431
+ mockStream.mockReturnValue(mockStreamResult(Promise.resolve({
432
+ message: { role: "assistant", content: "Summary." },
433
+ stopReason: "end_turn",
434
+ usage: { inputTokens: 500, outputTokens: 50 },
435
+ })));
436
+ const messages = buildConversation(30);
437
+ const result = await compact(messages, baseOptions);
438
+ const lastMsg = result.messages[result.messages.length - 1];
439
+ expect(lastMsg.role).not.toBe("assistant");
440
+ });
441
+ it("retries on empty response before falling back", async () => {
442
+ const mockStream = vi.mocked(stream);
443
+ let callCount = 0;
444
+ mockStream.mockImplementation(() => {
445
+ callCount++;
446
+ const content = callCount <= 2 ? "" : "Summary on third try.";
447
+ return mockStreamResult(Promise.resolve({
448
+ message: { role: "assistant", content },
449
+ stopReason: "end_turn",
450
+ usage: { inputTokens: 500, outputTokens: callCount <= 2 ? 0 : 100 },
451
+ }));
452
+ });
453
+ const messages = buildConversation(30);
454
+ const result = await compact(messages, baseOptions);
455
+ // Should have retried and gotten the summary on the 3rd attempt
456
+ expect(callCount).toBe(3);
457
+ const summaryMsg = result.messages[1];
458
+ expect(summaryMsg.content).toContain("Summary on third try");
459
+ });
460
+ });
116
461
  //# sourceMappingURL=compactor.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compactor.test.js","sourceRoot":"","sources":["../../../src/core/compaction/compactor.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compactor.test.js","sourceRoot":"","sources":["../../../src/core/compaction/compactor.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  import type { Message } from "@prestyj/ai";
2
+ /**
3
+ * Set the active model name for token estimation.
4
+ * Call this when the model changes so estimates use the correct ratio.
5
+ */
6
+ export declare function setEstimatorModel(model: string): void;
2
7
  export declare function estimateTokens(text: string): number;
3
8
  export declare function estimateMessageTokens(message: Message): number;
4
9
  export declare function estimateConversationTokens(messages: Message[]): number;
@@ -1 +1 @@
1
- {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/token-estimator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,aAAa,CAAC;AAKpE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqB9D;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAMtE"}
1
+ {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/token-estimator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,aAAa,CAAC;AA8BpE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAErD;AAWD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqB9D;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAMtE"}
@@ -1,7 +1,46 @@
1
- const CHARS_PER_TOKEN = 4;
1
+ /**
2
+ * Model-family-specific chars-per-token ratios.
3
+ * These are empirically measured averages for English text.
4
+ * CJK/code/mixed content will vary, but these are better than a flat 4.0.
5
+ */
6
+ const MODEL_FAMILY_RATIOS = {
7
+ // Anthropic models: ~3.2 chars/token (BPE tokenizer, slightly more compact)
8
+ claude: 3.2,
9
+ // OpenAI models: ~3.7 chars/token (cl100k_base / o200k_base)
10
+ gpt: 3.7,
11
+ o1: 3.7,
12
+ o3: 3.7,
13
+ o4: 3.7,
14
+ // GLM models: ~2.5 chars/token (mixed CJK/English tokenizer)
15
+ glm: 2.5,
16
+ // Moonshot/Kimi: ~2.8 chars/token (multilingual tokenizer)
17
+ kimi: 2.8,
18
+ moonshot: 2.8,
19
+ };
20
+ /** Default ratio when model family is unknown */
21
+ const DEFAULT_CHARS_PER_TOKEN = 3.5;
2
22
  const PER_MESSAGE_OVERHEAD = 4; // tokens
23
+ /** Active model name, set via setEstimatorModel(). Used to select the right ratio. */
24
+ let activeModel = "";
25
+ /**
26
+ * Set the active model name for token estimation.
27
+ * Call this when the model changes so estimates use the correct ratio.
28
+ */
29
+ export function setEstimatorModel(model) {
30
+ activeModel = model;
31
+ }
32
+ function getCharsPerToken() {
33
+ if (!activeModel)
34
+ return DEFAULT_CHARS_PER_TOKEN;
35
+ const lower = activeModel.toLowerCase();
36
+ for (const [prefix, ratio] of Object.entries(MODEL_FAMILY_RATIOS)) {
37
+ if (lower.startsWith(prefix))
38
+ return ratio;
39
+ }
40
+ return DEFAULT_CHARS_PER_TOKEN;
41
+ }
3
42
  export function estimateTokens(text) {
4
- return Math.ceil(text.length / CHARS_PER_TOKEN);
43
+ return Math.ceil(text.length / getCharsPerToken());
5
44
  }
6
45
  export function estimateMessageTokens(message) {
7
46
  let tokens = PER_MESSAGE_OVERHEAD;
@@ -1 +1 @@
1
- {"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../../src/core/compaction/token-estimator.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,SAAS;AAEzC,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,IAAI,MAAM,GAAG,oBAAoB,CAAC;IAElC,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpD,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACvD,MAAM,EAAE,GAAG,IAA2C,CAAC;gBACvD,MAAM,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACzD,MAAM,EAAE,GAAG,IAA6B,CAAC;gBACzC,MAAM,IAAI,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAmB;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../../src/core/compaction/token-estimator.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,mBAAmB,GAA2B;IAClD,4EAA4E;IAC5E,MAAM,EAAE,GAAG;IACX,6DAA6D;IAC7D,GAAG,EAAE,GAAG;IACR,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,6DAA6D;IAC7D,GAAG,EAAE,GAAG;IACR,2DAA2D;IAC3D,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF,iDAAiD;AACjD,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,SAAS;AAEzC,sFAAsF;AACtF,IAAI,WAAW,GAAG,EAAE,CAAC;AAErB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,CAAC,WAAW;QAAE,OAAO,uBAAuB,CAAC;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAClE,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,IAAI,MAAM,GAAG,oBAAoB,CAAC;IAElC,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpD,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACvD,MAAM,EAAE,GAAG,IAA2C,CAAC;gBACvD,MAAM,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACzD,MAAM,EAAE,GAAG,IAA6B,CAAC;gBACzC,MAAM,IAAI,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAmB;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}