@blockrun/clawrouter 0.12.102 → 0.12.104

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 (283) hide show
  1. package/dist/cli.d.ts +0 -15
  2. package/dist/cli.js +80068 -407
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +1406 -34
  5. package/dist/index.js +81085 -1075
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/scripts/reinstall.sh +43 -7
  9. package/scripts/update.sh +35 -1
  10. package/dist/auth.d.ts +0 -82
  11. package/dist/auth.d.ts.map +0 -1
  12. package/dist/auth.js +0 -388
  13. package/dist/auth.js.map +0 -1
  14. package/dist/balance.d.ts +0 -97
  15. package/dist/balance.d.ts.map +0 -1
  16. package/dist/balance.js +0 -157
  17. package/dist/balance.js.map +0 -1
  18. package/dist/cli.d.ts.map +0 -1
  19. package/dist/compression/codebook.d.ts +0 -24
  20. package/dist/compression/codebook.d.ts.map +0 -1
  21. package/dist/compression/codebook.js +0 -119
  22. package/dist/compression/codebook.js.map +0 -1
  23. package/dist/compression/index.d.ts +0 -33
  24. package/dist/compression/index.d.ts.map +0 -1
  25. package/dist/compression/index.js +0 -246
  26. package/dist/compression/index.js.map +0 -1
  27. package/dist/compression/layers/deduplication.d.ts +0 -28
  28. package/dist/compression/layers/deduplication.d.ts.map +0 -1
  29. package/dist/compression/layers/deduplication.js +0 -101
  30. package/dist/compression/layers/deduplication.js.map +0 -1
  31. package/dist/compression/layers/dictionary.d.ts +0 -21
  32. package/dist/compression/layers/dictionary.d.ts.map +0 -1
  33. package/dist/compression/layers/dictionary.js +0 -73
  34. package/dist/compression/layers/dictionary.js.map +0 -1
  35. package/dist/compression/layers/dynamic-codebook.d.ts +0 -26
  36. package/dist/compression/layers/dynamic-codebook.d.ts.map +0 -1
  37. package/dist/compression/layers/dynamic-codebook.js +0 -149
  38. package/dist/compression/layers/dynamic-codebook.js.map +0 -1
  39. package/dist/compression/layers/json-compact.d.ts +0 -23
  40. package/dist/compression/layers/json-compact.d.ts.map +0 -1
  41. package/dist/compression/layers/json-compact.js +0 -79
  42. package/dist/compression/layers/json-compact.js.map +0 -1
  43. package/dist/compression/layers/observation.d.ts +0 -21
  44. package/dist/compression/layers/observation.d.ts.map +0 -1
  45. package/dist/compression/layers/observation.js +0 -130
  46. package/dist/compression/layers/observation.js.map +0 -1
  47. package/dist/compression/layers/paths.d.ts +0 -24
  48. package/dist/compression/layers/paths.d.ts.map +0 -1
  49. package/dist/compression/layers/paths.js +0 -110
  50. package/dist/compression/layers/paths.js.map +0 -1
  51. package/dist/compression/layers/whitespace.d.ts +0 -27
  52. package/dist/compression/layers/whitespace.d.ts.map +0 -1
  53. package/dist/compression/layers/whitespace.js +0 -60
  54. package/dist/compression/layers/whitespace.js.map +0 -1
  55. package/dist/compression/types.d.ts +0 -84
  56. package/dist/compression/types.d.ts.map +0 -1
  57. package/dist/compression/types.js +0 -27
  58. package/dist/compression/types.js.map +0 -1
  59. package/dist/config.d.ts +0 -12
  60. package/dist/config.d.ts.map +0 -1
  61. package/dist/config.js +0 -22
  62. package/dist/config.js.map +0 -1
  63. package/dist/dedup.d.ts +0 -34
  64. package/dist/dedup.d.ts.map +0 -1
  65. package/dist/dedup.js +0 -150
  66. package/dist/dedup.js.map +0 -1
  67. package/dist/doctor.d.ts +0 -8
  68. package/dist/doctor.d.ts.map +0 -1
  69. package/dist/doctor.js +0 -375
  70. package/dist/doctor.js.map +0 -1
  71. package/dist/error-classification.test.d.ts +0 -2
  72. package/dist/error-classification.test.d.ts.map +0 -1
  73. package/dist/error-classification.test.js +0 -59
  74. package/dist/error-classification.test.js.map +0 -1
  75. package/dist/errors.d.ts +0 -54
  76. package/dist/errors.d.ts.map +0 -1
  77. package/dist/errors.js +0 -85
  78. package/dist/errors.js.map +0 -1
  79. package/dist/exclude-models.d.ts +0 -28
  80. package/dist/exclude-models.d.ts.map +0 -1
  81. package/dist/exclude-models.integration.test.d.ts +0 -2
  82. package/dist/exclude-models.integration.test.d.ts.map +0 -1
  83. package/dist/exclude-models.integration.test.js +0 -46
  84. package/dist/exclude-models.integration.test.js.map +0 -1
  85. package/dist/exclude-models.js +0 -70
  86. package/dist/exclude-models.js.map +0 -1
  87. package/dist/exclude-models.test.d.ts +0 -5
  88. package/dist/exclude-models.test.d.ts.map +0 -1
  89. package/dist/exclude-models.test.js +0 -95
  90. package/dist/exclude-models.test.js.map +0 -1
  91. package/dist/fs-read.d.ts +0 -11
  92. package/dist/fs-read.d.ts.map +0 -1
  93. package/dist/fs-read.js +0 -47
  94. package/dist/fs-read.js.map +0 -1
  95. package/dist/index.d.ts.map +0 -1
  96. package/dist/journal.d.ts +0 -67
  97. package/dist/journal.d.ts.map +0 -1
  98. package/dist/journal.js +0 -184
  99. package/dist/journal.js.map +0 -1
  100. package/dist/journal.test.d.ts +0 -2
  101. package/dist/journal.test.d.ts.map +0 -1
  102. package/dist/journal.test.js +0 -201
  103. package/dist/journal.test.js.map +0 -1
  104. package/dist/logger.d.ts +0 -33
  105. package/dist/logger.d.ts.map +0 -1
  106. package/dist/logger.js +0 -35
  107. package/dist/logger.js.map +0 -1
  108. package/dist/models.d.ts +0 -107
  109. package/dist/models.d.ts.map +0 -1
  110. package/dist/models.js +0 -941
  111. package/dist/models.js.map +0 -1
  112. package/dist/models.test.d.ts +0 -2
  113. package/dist/models.test.d.ts.map +0 -1
  114. package/dist/models.test.js +0 -38
  115. package/dist/models.test.js.map +0 -1
  116. package/dist/partners/index.d.ts +0 -8
  117. package/dist/partners/index.d.ts.map +0 -1
  118. package/dist/partners/index.js +0 -6
  119. package/dist/partners/index.js.map +0 -1
  120. package/dist/partners/registry.d.ts +0 -51
  121. package/dist/partners/registry.d.ts.map +0 -1
  122. package/dist/partners/registry.js +0 -256
  123. package/dist/partners/registry.js.map +0 -1
  124. package/dist/partners/tools.d.ts +0 -24
  125. package/dist/partners/tools.d.ts.map +0 -1
  126. package/dist/partners/tools.js +0 -97
  127. package/dist/partners/tools.js.map +0 -1
  128. package/dist/payment-preauth.d.ts +0 -17
  129. package/dist/payment-preauth.d.ts.map +0 -1
  130. package/dist/payment-preauth.js +0 -102
  131. package/dist/payment-preauth.js.map +0 -1
  132. package/dist/provider.d.ts +0 -19
  133. package/dist/provider.d.ts.map +0 -1
  134. package/dist/provider.js +0 -45
  135. package/dist/provider.js.map +0 -1
  136. package/dist/proxy.d.ts +0 -210
  137. package/dist/proxy.d.ts.map +0 -1
  138. package/dist/proxy.debrand.test.d.ts +0 -2
  139. package/dist/proxy.debrand.test.d.ts.map +0 -1
  140. package/dist/proxy.debrand.test.js +0 -101
  141. package/dist/proxy.debrand.test.js.map +0 -1
  142. package/dist/proxy.degraded-response.test.d.ts +0 -2
  143. package/dist/proxy.degraded-response.test.d.ts.map +0 -1
  144. package/dist/proxy.degraded-response.test.js +0 -105
  145. package/dist/proxy.degraded-response.test.js.map +0 -1
  146. package/dist/proxy.image-download.test.d.ts +0 -2
  147. package/dist/proxy.image-download.test.d.ts.map +0 -1
  148. package/dist/proxy.image-download.test.js +0 -92
  149. package/dist/proxy.image-download.test.js.map +0 -1
  150. package/dist/proxy.js +0 -3810
  151. package/dist/proxy.js.map +0 -1
  152. package/dist/proxy.models-endpoint.test.d.ts +0 -2
  153. package/dist/proxy.models-endpoint.test.d.ts.map +0 -1
  154. package/dist/proxy.models-endpoint.test.js +0 -19
  155. package/dist/proxy.models-endpoint.test.js.map +0 -1
  156. package/dist/proxy.multiturn-thinking.test.d.ts +0 -2
  157. package/dist/proxy.multiturn-thinking.test.d.ts.map +0 -1
  158. package/dist/proxy.multiturn-thinking.test.js +0 -82
  159. package/dist/proxy.multiturn-thinking.test.js.map +0 -1
  160. package/dist/proxy.payment-chain-reuse.test.d.ts +0 -2
  161. package/dist/proxy.payment-chain-reuse.test.d.ts.map +0 -1
  162. package/dist/proxy.payment-chain-reuse.test.js +0 -30
  163. package/dist/proxy.payment-chain-reuse.test.js.map +0 -1
  164. package/dist/proxy.solana-resilience.test.d.ts +0 -12
  165. package/dist/proxy.solana-resilience.test.d.ts.map +0 -1
  166. package/dist/proxy.solana-resilience.test.js +0 -39
  167. package/dist/proxy.solana-resilience.test.js.map +0 -1
  168. package/dist/report.d.ts +0 -6
  169. package/dist/report.d.ts.map +0 -1
  170. package/dist/report.js +0 -44
  171. package/dist/report.js.map +0 -1
  172. package/dist/response-cache.advanced.test.d.ts +0 -2
  173. package/dist/response-cache.advanced.test.d.ts.map +0 -1
  174. package/dist/response-cache.advanced.test.js +0 -566
  175. package/dist/response-cache.advanced.test.js.map +0 -1
  176. package/dist/response-cache.d.ts +0 -85
  177. package/dist/response-cache.d.ts.map +0 -1
  178. package/dist/response-cache.edge-cases.test.d.ts +0 -2
  179. package/dist/response-cache.edge-cases.test.d.ts.map +0 -1
  180. package/dist/response-cache.edge-cases.test.js +0 -488
  181. package/dist/response-cache.edge-cases.test.js.map +0 -1
  182. package/dist/response-cache.extreme.test.d.ts +0 -2
  183. package/dist/response-cache.extreme.test.d.ts.map +0 -1
  184. package/dist/response-cache.extreme.test.js +0 -561
  185. package/dist/response-cache.extreme.test.js.map +0 -1
  186. package/dist/response-cache.js +0 -240
  187. package/dist/response-cache.js.map +0 -1
  188. package/dist/response-cache.test.d.ts +0 -2
  189. package/dist/response-cache.test.d.ts.map +0 -1
  190. package/dist/response-cache.test.js +0 -242
  191. package/dist/response-cache.test.js.map +0 -1
  192. package/dist/retry.d.ts +0 -42
  193. package/dist/retry.d.ts.map +0 -1
  194. package/dist/retry.js +0 -99
  195. package/dist/retry.js.map +0 -1
  196. package/dist/router/config.d.ts +0 -11
  197. package/dist/router/config.d.ts.map +0 -1
  198. package/dist/router/config.js +0 -1215
  199. package/dist/router/config.js.map +0 -1
  200. package/dist/router/index.d.ts +0 -18
  201. package/dist/router/index.d.ts.map +0 -1
  202. package/dist/router/index.js +0 -19
  203. package/dist/router/index.js.map +0 -1
  204. package/dist/router/llm-classifier.d.ts +0 -29
  205. package/dist/router/llm-classifier.d.ts.map +0 -1
  206. package/dist/router/llm-classifier.js +0 -99
  207. package/dist/router/llm-classifier.js.map +0 -1
  208. package/dist/router/rules.d.ts +0 -12
  209. package/dist/router/rules.d.ts.map +0 -1
  210. package/dist/router/rules.js +0 -202
  211. package/dist/router/rules.js.map +0 -1
  212. package/dist/router/selector.d.ts +0 -58
  213. package/dist/router/selector.d.ts.map +0 -1
  214. package/dist/router/selector.js +0 -165
  215. package/dist/router/selector.js.map +0 -1
  216. package/dist/router/selector.test.d.ts +0 -2
  217. package/dist/router/selector.test.d.ts.map +0 -1
  218. package/dist/router/selector.test.js +0 -67
  219. package/dist/router/selector.test.js.map +0 -1
  220. package/dist/router/strategy.d.ts +0 -19
  221. package/dist/router/strategy.d.ts.map +0 -1
  222. package/dist/router/strategy.js +0 -138
  223. package/dist/router/strategy.js.map +0 -1
  224. package/dist/router/strategy.test.d.ts +0 -2
  225. package/dist/router/strategy.test.d.ts.map +0 -1
  226. package/dist/router/strategy.test.js +0 -131
  227. package/dist/router/strategy.test.js.map +0 -1
  228. package/dist/router/types.d.ts +0 -127
  229. package/dist/router/types.d.ts.map +0 -1
  230. package/dist/router/types.js +0 -11
  231. package/dist/router/types.js.map +0 -1
  232. package/dist/session.d.ts +0 -124
  233. package/dist/session.d.ts.map +0 -1
  234. package/dist/session.js +0 -256
  235. package/dist/session.js.map +0 -1
  236. package/dist/session.test.d.ts +0 -2
  237. package/dist/session.test.d.ts.map +0 -1
  238. package/dist/session.test.js +0 -163
  239. package/dist/session.test.js.map +0 -1
  240. package/dist/solana-balance.d.ts +0 -48
  241. package/dist/solana-balance.d.ts.map +0 -1
  242. package/dist/solana-balance.js +0 -142
  243. package/dist/solana-balance.js.map +0 -1
  244. package/dist/spend-control.d.ts +0 -112
  245. package/dist/spend-control.d.ts.map +0 -1
  246. package/dist/spend-control.js +0 -278
  247. package/dist/spend-control.js.map +0 -1
  248. package/dist/spend-control.test.d.ts +0 -5
  249. package/dist/spend-control.test.d.ts.map +0 -1
  250. package/dist/spend-control.test.js +0 -210
  251. package/dist/spend-control.test.js.map +0 -1
  252. package/dist/stats.d.ts +0 -64
  253. package/dist/stats.d.ts.map +0 -1
  254. package/dist/stats.js +0 -295
  255. package/dist/stats.js.map +0 -1
  256. package/dist/types.d.ts +0 -150
  257. package/dist/types.d.ts.map +0 -1
  258. package/dist/types.js +0 -9
  259. package/dist/types.js.map +0 -1
  260. package/dist/update-hint.test.d.ts +0 -9
  261. package/dist/update-hint.test.d.ts.map +0 -1
  262. package/dist/update-hint.test.js +0 -156
  263. package/dist/update-hint.test.js.map +0 -1
  264. package/dist/updater.d.ts +0 -10
  265. package/dist/updater.d.ts.map +0 -1
  266. package/dist/updater.js +0 -55
  267. package/dist/updater.js.map +0 -1
  268. package/dist/version.d.ts +0 -3
  269. package/dist/version.d.ts.map +0 -1
  270. package/dist/version.js +0 -16
  271. package/dist/version.js.map +0 -1
  272. package/dist/wallet.d.ts +0 -52
  273. package/dist/wallet.d.ts.map +0 -1
  274. package/dist/wallet.js +0 -94
  275. package/dist/wallet.js.map +0 -1
  276. package/dist/wallet.test.d.ts +0 -6
  277. package/dist/wallet.test.d.ts.map +0 -1
  278. package/dist/wallet.test.js +0 -117
  279. package/dist/wallet.test.js.map +0 -1
  280. package/dist/x402-sdk.test.d.ts +0 -6
  281. package/dist/x402-sdk.test.d.ts.map +0 -1
  282. package/dist/x402-sdk.test.js +0 -161
  283. package/dist/x402-sdk.test.js.map +0 -1
@@ -1,246 +0,0 @@
1
- /**
2
- * LLM-Safe Context Compression
3
- *
4
- * Reduces token usage by 15-40% while preserving semantic meaning.
5
- * Implements 7 compression layers inspired by claw-compactor.
6
- *
7
- * Usage:
8
- * const result = await compressContext(messages);
9
- * // result.messages -> compressed version to send to provider
10
- * // result.originalMessages -> original for logging
11
- */
12
- import { DEFAULT_COMPRESSION_CONFIG, } from "./types.js";
13
- import { deduplicateMessages } from "./layers/deduplication.js";
14
- import { normalizeMessagesWhitespace } from "./layers/whitespace.js";
15
- import { encodeMessages } from "./layers/dictionary.js";
16
- import { shortenPaths } from "./layers/paths.js";
17
- import { compactMessagesJson } from "./layers/json-compact.js";
18
- import { compressObservations } from "./layers/observation.js";
19
- import { applyDynamicCodebook, generateDynamicCodebookHeader } from "./layers/dynamic-codebook.js";
20
- import { generateCodebookHeader, STATIC_CODEBOOK } from "./codebook.js";
21
- export * from "./types.js";
22
- export { STATIC_CODEBOOK } from "./codebook.js";
23
- /**
24
- * Calculate total character count for messages.
25
- */
26
- function calculateTotalChars(messages) {
27
- return messages.reduce((total, msg) => {
28
- let chars = 0;
29
- if (typeof msg.content === "string") {
30
- chars = msg.content.length;
31
- }
32
- else if (Array.isArray(msg.content)) {
33
- // For multimodal content, stringify to get approximate size
34
- chars = JSON.stringify(msg.content).length;
35
- }
36
- if (msg.tool_calls) {
37
- chars += JSON.stringify(msg.tool_calls).length;
38
- }
39
- return total + chars;
40
- }, 0);
41
- }
42
- /**
43
- * Deep clone messages to preserve originals.
44
- */
45
- function cloneMessages(messages) {
46
- return JSON.parse(JSON.stringify(messages));
47
- }
48
- /**
49
- * Prepend codebook header to the first USER message (not system).
50
- *
51
- * Why not system message?
52
- * - Google Gemini uses systemInstruction which doesn't support codebook format
53
- * - The codebook header in user message is still visible to all LLMs
54
- * - This ensures compatibility across all providers
55
- */
56
- function prependCodebookHeader(messages, usedCodes, pathMap) {
57
- const header = generateCodebookHeader(usedCodes, pathMap);
58
- if (!header)
59
- return messages;
60
- // Find first user message (not system - Google's systemInstruction doesn't support codebook)
61
- const userIndex = messages.findIndex((m) => m.role === "user");
62
- if (userIndex === -1) {
63
- // No user message, add codebook as system (fallback)
64
- return [{ role: "system", content: header }, ...messages];
65
- }
66
- // Prepend to first user message (only if content is a string)
67
- return messages.map((msg, i) => {
68
- if (i === userIndex) {
69
- // Only prepend to string content - skip arrays (multimodal messages)
70
- if (typeof msg.content === "string") {
71
- return {
72
- ...msg,
73
- content: `${header}\n\n${msg.content}`,
74
- };
75
- }
76
- // For non-string content, don't modify the message
77
- // The codebook header would corrupt array content
78
- }
79
- return msg;
80
- });
81
- }
82
- /**
83
- * Main compression function.
84
- *
85
- * Applies 5 layers in sequence:
86
- * 1. Deduplication - Remove exact duplicate messages
87
- * 2. Whitespace - Normalize excessive whitespace
88
- * 3. Dictionary - Replace common phrases with codes
89
- * 4. Paths - Shorten repeated file paths
90
- * 5. JSON - Compact JSON in tool calls
91
- *
92
- * Then prepends a codebook header for the LLM to decode in-context.
93
- */
94
- export async function compressContext(messages, config = {}) {
95
- const fullConfig = {
96
- ...DEFAULT_COMPRESSION_CONFIG,
97
- ...config,
98
- layers: {
99
- ...DEFAULT_COMPRESSION_CONFIG.layers,
100
- ...config.layers,
101
- },
102
- dictionary: {
103
- ...DEFAULT_COMPRESSION_CONFIG.dictionary,
104
- ...config.dictionary,
105
- },
106
- };
107
- // If compression disabled, return as-is
108
- if (!fullConfig.enabled) {
109
- const originalChars = calculateTotalChars(messages);
110
- return {
111
- messages,
112
- originalMessages: messages,
113
- originalChars,
114
- compressedChars: originalChars,
115
- compressionRatio: 1,
116
- stats: {
117
- duplicatesRemoved: 0,
118
- whitespaceSavedChars: 0,
119
- dictionarySubstitutions: 0,
120
- pathsShortened: 0,
121
- jsonCompactedChars: 0,
122
- observationsCompressed: 0,
123
- observationCharsSaved: 0,
124
- dynamicSubstitutions: 0,
125
- dynamicCharsSaved: 0,
126
- },
127
- codebook: {},
128
- pathMap: {},
129
- dynamicCodes: {},
130
- };
131
- }
132
- // Preserve originals for logging
133
- const originalMessages = fullConfig.preserveRaw ? cloneMessages(messages) : messages;
134
- const originalChars = calculateTotalChars(messages);
135
- // Initialize stats
136
- const stats = {
137
- duplicatesRemoved: 0,
138
- whitespaceSavedChars: 0,
139
- dictionarySubstitutions: 0,
140
- pathsShortened: 0,
141
- jsonCompactedChars: 0,
142
- observationsCompressed: 0,
143
- observationCharsSaved: 0,
144
- dynamicSubstitutions: 0,
145
- dynamicCharsSaved: 0,
146
- };
147
- let result = cloneMessages(messages);
148
- let usedCodes = new Set();
149
- let pathMap = {};
150
- let dynamicCodes = {};
151
- // Layer 1: Deduplication
152
- if (fullConfig.layers.deduplication) {
153
- const dedupResult = deduplicateMessages(result);
154
- result = dedupResult.messages;
155
- stats.duplicatesRemoved = dedupResult.duplicatesRemoved;
156
- }
157
- // Layer 2: Whitespace normalization
158
- if (fullConfig.layers.whitespace) {
159
- const wsResult = normalizeMessagesWhitespace(result);
160
- result = wsResult.messages;
161
- stats.whitespaceSavedChars = wsResult.charsSaved;
162
- }
163
- // Layer 3: Dictionary encoding
164
- if (fullConfig.layers.dictionary) {
165
- const dictResult = encodeMessages(result);
166
- result = dictResult.messages;
167
- stats.dictionarySubstitutions = dictResult.substitutionCount;
168
- usedCodes = dictResult.usedCodes;
169
- }
170
- // Layer 4: Path shortening
171
- if (fullConfig.layers.paths) {
172
- const pathResult = shortenPaths(result);
173
- result = pathResult.messages;
174
- pathMap = pathResult.pathMap;
175
- stats.pathsShortened = Object.keys(pathMap).length;
176
- }
177
- // Layer 5: JSON compaction
178
- if (fullConfig.layers.jsonCompact) {
179
- const jsonResult = compactMessagesJson(result);
180
- result = jsonResult.messages;
181
- stats.jsonCompactedChars = jsonResult.charsSaved;
182
- }
183
- // Layer 6: Observation compression (BIG WIN - 97% on tool results)
184
- if (fullConfig.layers.observation) {
185
- const obsResult = compressObservations(result);
186
- result = obsResult.messages;
187
- stats.observationsCompressed = obsResult.observationsCompressed;
188
- stats.observationCharsSaved = obsResult.charsSaved;
189
- }
190
- // Layer 7: Dynamic codebook (learns from actual content)
191
- if (fullConfig.layers.dynamicCodebook) {
192
- const dynResult = applyDynamicCodebook(result);
193
- result = dynResult.messages;
194
- stats.dynamicSubstitutions = dynResult.substitutions;
195
- stats.dynamicCharsSaved = dynResult.charsSaved;
196
- dynamicCodes = dynResult.dynamicCodes;
197
- }
198
- // Add codebook header if enabled and we have codes to include
199
- if (fullConfig.dictionary.includeCodebookHeader &&
200
- (usedCodes.size > 0 || Object.keys(pathMap).length > 0 || Object.keys(dynamicCodes).length > 0)) {
201
- result = prependCodebookHeader(result, usedCodes, pathMap);
202
- // Also add dynamic codebook header if we have dynamic codes
203
- if (Object.keys(dynamicCodes).length > 0) {
204
- const dynHeader = generateDynamicCodebookHeader(dynamicCodes);
205
- if (dynHeader) {
206
- const systemIndex = result.findIndex((m) => m.role === "system");
207
- // Only prepend to string content - skip arrays (multimodal messages)
208
- if (systemIndex >= 0 && typeof result[systemIndex].content === "string") {
209
- result[systemIndex] = {
210
- ...result[systemIndex],
211
- content: `${dynHeader}\n${result[systemIndex].content}`,
212
- };
213
- }
214
- }
215
- }
216
- }
217
- // Calculate final stats
218
- const compressedChars = calculateTotalChars(result);
219
- const compressionRatio = compressedChars / originalChars;
220
- // Build used codebook for logging
221
- const usedCodebook = {};
222
- usedCodes.forEach((code) => {
223
- usedCodebook[code] = STATIC_CODEBOOK[code];
224
- });
225
- return {
226
- messages: result,
227
- originalMessages,
228
- originalChars,
229
- compressedChars,
230
- compressionRatio,
231
- stats,
232
- codebook: usedCodebook,
233
- pathMap,
234
- dynamicCodes,
235
- };
236
- }
237
- /**
238
- * Quick check if compression would benefit these messages.
239
- * Returns true if messages are large enough to warrant compression.
240
- */
241
- export function shouldCompress(messages) {
242
- const chars = calculateTotalChars(messages);
243
- // Only compress if > 5000 chars (roughly 1000 tokens)
244
- return chars > 5000;
245
- }
246
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * Layer 1: Message Deduplication
3
- *
4
- * Removes exact duplicate messages from conversation history.
5
- * Common in heartbeat patterns and repeated tool calls.
6
- *
7
- * Safe for LLM: Identical messages add no new information.
8
- * Expected savings: 2-5%
9
- */
10
- import { NormalizedMessage } from "../types.js";
11
- export interface DeduplicationResult {
12
- messages: NormalizedMessage[];
13
- duplicatesRemoved: number;
14
- originalCount: number;
15
- }
16
- /**
17
- * Remove exact duplicate messages from the conversation.
18
- *
19
- * Strategy:
20
- * - Keep first occurrence of each unique message
21
- * - Preserve order for semantic coherence
22
- * - Never dedupe system messages (they set context)
23
- * - Allow duplicate user messages (user might repeat intentionally)
24
- * - CRITICAL: Never dedupe assistant messages with tool_calls that are
25
- * referenced by subsequent tool messages (breaks Anthropic tool_use/tool_result pairing)
26
- */
27
- export declare function deduplicateMessages(messages: NormalizedMessage[]): DeduplicationResult;
28
- //# sourceMappingURL=deduplication.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deduplication.d.ts","sourceRoot":"","sources":["../../../src/compression/layers/deduplication.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAiCD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,mBAAmB,CA+DtF"}
@@ -1,101 +0,0 @@
1
- /**
2
- * Layer 1: Message Deduplication
3
- *
4
- * Removes exact duplicate messages from conversation history.
5
- * Common in heartbeat patterns and repeated tool calls.
6
- *
7
- * Safe for LLM: Identical messages add no new information.
8
- * Expected savings: 2-5%
9
- */
10
- import crypto from "crypto";
11
- /**
12
- * Generate a hash for a message based on its semantic content.
13
- * Uses role + content + tool_call_id to identify duplicates.
14
- */
15
- function hashMessage(message) {
16
- // Handle content - stringify arrays (multimodal), use string directly, or empty string
17
- let contentStr = "";
18
- if (typeof message.content === "string") {
19
- contentStr = message.content;
20
- }
21
- else if (Array.isArray(message.content)) {
22
- contentStr = JSON.stringify(message.content);
23
- }
24
- const parts = [message.role, contentStr, message.tool_call_id || "", message.name || ""];
25
- // Include tool_calls if present
26
- if (message.tool_calls) {
27
- parts.push(JSON.stringify(message.tool_calls.map((tc) => ({
28
- name: tc.function.name,
29
- args: tc.function.arguments,
30
- }))));
31
- }
32
- const content = parts.join("|");
33
- return crypto.createHash("md5").update(content).digest("hex");
34
- }
35
- /**
36
- * Remove exact duplicate messages from the conversation.
37
- *
38
- * Strategy:
39
- * - Keep first occurrence of each unique message
40
- * - Preserve order for semantic coherence
41
- * - Never dedupe system messages (they set context)
42
- * - Allow duplicate user messages (user might repeat intentionally)
43
- * - CRITICAL: Never dedupe assistant messages with tool_calls that are
44
- * referenced by subsequent tool messages (breaks Anthropic tool_use/tool_result pairing)
45
- */
46
- export function deduplicateMessages(messages) {
47
- const seen = new Set();
48
- const result = [];
49
- let duplicatesRemoved = 0;
50
- // First pass: collect all tool_call_ids that are referenced by tool messages
51
- // These tool_calls MUST be preserved to maintain tool_use/tool_result pairing
52
- const referencedToolCallIds = new Set();
53
- for (const message of messages) {
54
- if (message.role === "tool" && message.tool_call_id) {
55
- referencedToolCallIds.add(message.tool_call_id);
56
- }
57
- }
58
- for (const message of messages) {
59
- // Always keep system messages (they set important context)
60
- if (message.role === "system") {
61
- result.push(message);
62
- continue;
63
- }
64
- // Always keep user messages (user might repeat intentionally)
65
- if (message.role === "user") {
66
- result.push(message);
67
- continue;
68
- }
69
- // Always keep tool messages (they are results of tool calls)
70
- // Removing them would break the tool_use/tool_result pairing
71
- if (message.role === "tool") {
72
- result.push(message);
73
- continue;
74
- }
75
- // For assistant messages with tool_calls, check if any are referenced
76
- // by subsequent tool messages - if so, we MUST keep this message
77
- if (message.role === "assistant" && message.tool_calls) {
78
- const hasReferencedToolCall = message.tool_calls.some((tc) => referencedToolCallIds.has(tc.id));
79
- if (hasReferencedToolCall) {
80
- // This assistant message has tool_calls that are referenced - keep it
81
- result.push(message);
82
- continue;
83
- }
84
- }
85
- // For other assistant messages, check for duplicates
86
- const hash = hashMessage(message);
87
- if (!seen.has(hash)) {
88
- seen.add(hash);
89
- result.push(message);
90
- }
91
- else {
92
- duplicatesRemoved++;
93
- }
94
- }
95
- return {
96
- messages: result,
97
- duplicatesRemoved,
98
- originalCount: messages.length,
99
- };
100
- }
101
- //# sourceMappingURL=deduplication.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deduplication.js","sourceRoot":"","sources":["../../../src/compression/layers/deduplication.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * Layer 3: Dictionary Encoding
3
- *
4
- * Replaces frequently repeated long phrases with short codes.
5
- * Uses a static codebook of common patterns from production logs.
6
- *
7
- * Safe for LLM: Reversible substitution with codebook header.
8
- * Expected savings: 4-8%
9
- */
10
- import { NormalizedMessage } from "../types.js";
11
- export interface DictionaryResult {
12
- messages: NormalizedMessage[];
13
- substitutionCount: number;
14
- usedCodes: Set<string>;
15
- charsSaved: number;
16
- }
17
- /**
18
- * Apply dictionary encoding to all messages.
19
- */
20
- export declare function encodeMessages(messages: NormalizedMessage[]): DictionaryResult;
21
- //# sourceMappingURL=dictionary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../../src/compression/layers/dictionary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,CA+B9E"}
@@ -1,73 +0,0 @@
1
- /**
2
- * Layer 3: Dictionary Encoding
3
- *
4
- * Replaces frequently repeated long phrases with short codes.
5
- * Uses a static codebook of common patterns from production logs.
6
- *
7
- * Safe for LLM: Reversible substitution with codebook header.
8
- * Expected savings: 4-8%
9
- */
10
- import { getInverseCodebook } from "../codebook.js";
11
- /**
12
- * Apply dictionary encoding to a string.
13
- * Returns the encoded string and stats.
14
- */
15
- function encodeContent(content, inverseCodebook) {
16
- // Defensive type check - content might be array/object for multimodal messages
17
- if (!content || typeof content !== "string") {
18
- return { encoded: content, substitutions: 0, codes: new Set(), charsSaved: 0 };
19
- }
20
- let encoded = content;
21
- let substitutions = 0;
22
- let charsSaved = 0;
23
- const codes = new Set();
24
- // Sort phrases by length (longest first) to avoid partial matches
25
- const phrases = Object.keys(inverseCodebook).sort((a, b) => b.length - a.length);
26
- for (const phrase of phrases) {
27
- const code = inverseCodebook[phrase];
28
- const regex = new RegExp(escapeRegex(phrase), "g");
29
- const matches = encoded.match(regex);
30
- if (matches && matches.length > 0) {
31
- encoded = encoded.replace(regex, code);
32
- substitutions += matches.length;
33
- charsSaved += matches.length * (phrase.length - code.length);
34
- codes.add(code);
35
- }
36
- }
37
- return { encoded, substitutions, codes, charsSaved };
38
- }
39
- /**
40
- * Escape special regex characters in a string.
41
- */
42
- function escapeRegex(str) {
43
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
44
- }
45
- /**
46
- * Apply dictionary encoding to all messages.
47
- */
48
- export function encodeMessages(messages) {
49
- const inverseCodebook = getInverseCodebook();
50
- let totalSubstitutions = 0;
51
- let totalCharsSaved = 0;
52
- const allUsedCodes = new Set();
53
- const result = messages.map((message) => {
54
- // Only process string content (skip arrays for multimodal messages)
55
- if (!message.content || typeof message.content !== "string")
56
- return message;
57
- const { encoded, substitutions, codes, charsSaved } = encodeContent(message.content, inverseCodebook);
58
- totalSubstitutions += substitutions;
59
- totalCharsSaved += charsSaved;
60
- codes.forEach((code) => allUsedCodes.add(code));
61
- return {
62
- ...message,
63
- content: encoded,
64
- };
65
- });
66
- return {
67
- messages: result,
68
- substitutionCount: totalSubstitutions,
69
- usedCodes: allUsedCodes,
70
- charsSaved: totalCharsSaved,
71
- };
72
- }
73
- //# sourceMappingURL=dictionary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../../src/compression/layers/dictionary.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- /**
2
- * L7: Dynamic Codebook Builder
3
- *
4
- * Inspired by claw-compactor's frequency-based codebook.
5
- * Builds codebook from actual content being compressed,
6
- * rather than relying on static patterns.
7
- *
8
- * Finds phrases that appear 3+ times and replaces with short codes.
9
- */
10
- import { NormalizedMessage } from "../types.js";
11
- interface DynamicCodebookResult {
12
- messages: NormalizedMessage[];
13
- charsSaved: number;
14
- dynamicCodes: Record<string, string>;
15
- substitutions: number;
16
- }
17
- /**
18
- * Apply dynamic codebook to messages.
19
- */
20
- export declare function applyDynamicCodebook(messages: NormalizedMessage[]): DynamicCodebookResult;
21
- /**
22
- * Generate header for dynamic codes (to include in system message).
23
- */
24
- export declare function generateDynamicCodebookHeader(codebook: Record<string, string>): string;
25
- export {};
26
- //# sourceMappingURL=dynamic-codebook.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dynamic-codebook.d.ts","sourceRoot":"","sources":["../../../src/compression/layers/dynamic-codebook.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB;AAyFD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,qBAAqB,CAmDzF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAatF"}