@diyor28/context 1.0.0

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 (280) hide show
  1. package/README.md +270 -0
  2. package/dist/__tests__/attachment-selector.test.d.ts +11 -0
  3. package/dist/__tests__/attachment-selector.test.d.ts.map +1 -0
  4. package/dist/__tests__/attachment-selector.test.js +449 -0
  5. package/dist/__tests__/attachment-selector.test.js.map +1 -0
  6. package/dist/__tests__/cache-breakpoints.test.d.ts +11 -0
  7. package/dist/__tests__/cache-breakpoints.test.d.ts.map +1 -0
  8. package/dist/__tests__/cache-breakpoints.test.js +398 -0
  9. package/dist/__tests__/cache-breakpoints.test.js.map +1 -0
  10. package/dist/__tests__/codecs.test.d.ts +7 -0
  11. package/dist/__tests__/codecs.test.d.ts.map +1 -0
  12. package/dist/__tests__/codecs.test.js +331 -0
  13. package/dist/__tests__/codecs.test.js.map +1 -0
  14. package/dist/__tests__/compactor.test.d.ts +11 -0
  15. package/dist/__tests__/compactor.test.d.ts.map +1 -0
  16. package/dist/__tests__/compactor.test.js +519 -0
  17. package/dist/__tests__/compactor.test.js.map +1 -0
  18. package/dist/__tests__/context-graph.test.d.ts +7 -0
  19. package/dist/__tests__/context-graph.test.d.ts.map +1 -0
  20. package/dist/__tests__/context-graph.test.js +262 -0
  21. package/dist/__tests__/context-graph.test.js.map +1 -0
  22. package/dist/__tests__/hash.test.d.ts +7 -0
  23. package/dist/__tests__/hash.test.d.ts.map +1 -0
  24. package/dist/__tests__/hash.test.js +228 -0
  25. package/dist/__tests__/hash.test.js.map +1 -0
  26. package/dist/__tests__/integration.test.d.ts +15 -0
  27. package/dist/__tests__/integration.test.d.ts.map +1 -0
  28. package/dist/__tests__/integration.test.js +728 -0
  29. package/dist/__tests__/integration.test.js.map +1 -0
  30. package/dist/__tests__/kind-order.test.d.ts +7 -0
  31. package/dist/__tests__/kind-order.test.d.ts.map +1 -0
  32. package/dist/__tests__/kind-order.test.js +243 -0
  33. package/dist/__tests__/kind-order.test.js.map +1 -0
  34. package/dist/__tests__/phase2-integration.test.d.ts +5 -0
  35. package/dist/__tests__/phase2-integration.test.d.ts.map +1 -0
  36. package/dist/__tests__/phase2-integration.test.js +222 -0
  37. package/dist/__tests__/phase2-integration.test.js.map +1 -0
  38. package/dist/__tests__/queries.test.d.ts +7 -0
  39. package/dist/__tests__/queries.test.d.ts.map +1 -0
  40. package/dist/__tests__/queries.test.js +254 -0
  41. package/dist/__tests__/queries.test.js.map +1 -0
  42. package/dist/__tests__/token-estimator.test.d.ts +7 -0
  43. package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
  44. package/dist/__tests__/token-estimator.test.js +267 -0
  45. package/dist/__tests__/token-estimator.test.js.map +1 -0
  46. package/dist/adapters/anthropic-estimator.d.ts +38 -0
  47. package/dist/adapters/anthropic-estimator.d.ts.map +1 -0
  48. package/dist/adapters/anthropic-estimator.js +108 -0
  49. package/dist/adapters/anthropic-estimator.js.map +1 -0
  50. package/dist/adapters/attachment-resolver.d.ts +96 -0
  51. package/dist/adapters/attachment-resolver.d.ts.map +1 -0
  52. package/dist/adapters/attachment-resolver.js +176 -0
  53. package/dist/adapters/attachment-resolver.js.map +1 -0
  54. package/dist/adapters/attachment-selector.d.ts +59 -0
  55. package/dist/adapters/attachment-selector.d.ts.map +1 -0
  56. package/dist/adapters/attachment-selector.js +163 -0
  57. package/dist/adapters/attachment-selector.js.map +1 -0
  58. package/dist/adapters/gemini-estimator.d.ts +27 -0
  59. package/dist/adapters/gemini-estimator.d.ts.map +1 -0
  60. package/dist/adapters/gemini-estimator.js +80 -0
  61. package/dist/adapters/gemini-estimator.js.map +1 -0
  62. package/dist/adapters/index.d.ts +12 -0
  63. package/dist/adapters/index.d.ts.map +1 -0
  64. package/dist/adapters/index.js +28 -0
  65. package/dist/adapters/index.js.map +1 -0
  66. package/dist/adapters/memory-store.d.ts +139 -0
  67. package/dist/adapters/memory-store.d.ts.map +1 -0
  68. package/dist/adapters/memory-store.js +187 -0
  69. package/dist/adapters/memory-store.js.map +1 -0
  70. package/dist/adapters/openai-estimator.d.ts +35 -0
  71. package/dist/adapters/openai-estimator.d.ts.map +1 -0
  72. package/dist/adapters/openai-estimator.js +89 -0
  73. package/dist/adapters/openai-estimator.js.map +1 -0
  74. package/dist/adapters/summarizer.d.ts +121 -0
  75. package/dist/adapters/summarizer.d.ts.map +1 -0
  76. package/dist/adapters/summarizer.js +121 -0
  77. package/dist/adapters/summarizer.js.map +1 -0
  78. package/dist/adapters/token-estimator.d.ts +63 -0
  79. package/dist/adapters/token-estimator.d.ts.map +1 -0
  80. package/dist/adapters/token-estimator.js +37 -0
  81. package/dist/adapters/token-estimator.js.map +1 -0
  82. package/dist/builder/context-builder.d.ts +186 -0
  83. package/dist/builder/context-builder.d.ts.map +1 -0
  84. package/dist/builder/context-builder.js +305 -0
  85. package/dist/builder/context-builder.js.map +1 -0
  86. package/dist/builder/context-fork.d.ts +166 -0
  87. package/dist/builder/context-fork.d.ts.map +1 -0
  88. package/dist/builder/context-fork.js +282 -0
  89. package/dist/builder/context-fork.js.map +1 -0
  90. package/dist/builder/index.d.ts +6 -0
  91. package/dist/builder/index.d.ts.map +1 -0
  92. package/dist/builder/index.js +22 -0
  93. package/dist/builder/index.js.map +1 -0
  94. package/dist/codecs/base.d.ts +18 -0
  95. package/dist/codecs/base.d.ts.map +1 -0
  96. package/dist/codecs/base.js +39 -0
  97. package/dist/codecs/base.js.map +1 -0
  98. package/dist/codecs/conversation-history.codec.d.ts +81 -0
  99. package/dist/codecs/conversation-history.codec.d.ts.map +1 -0
  100. package/dist/codecs/conversation-history.codec.js +89 -0
  101. package/dist/codecs/conversation-history.codec.js.map +1 -0
  102. package/dist/codecs/index.d.ts +31 -0
  103. package/dist/codecs/index.d.ts.map +1 -0
  104. package/dist/codecs/index.js +71 -0
  105. package/dist/codecs/index.js.map +1 -0
  106. package/dist/codecs/redacted-stub.codec.d.ts +32 -0
  107. package/dist/codecs/redacted-stub.codec.d.ts.map +1 -0
  108. package/dist/codecs/redacted-stub.codec.js +64 -0
  109. package/dist/codecs/redacted-stub.codec.js.map +1 -0
  110. package/dist/codecs/structured-reference.codec.d.ts +40 -0
  111. package/dist/codecs/structured-reference.codec.d.ts.map +1 -0
  112. package/dist/codecs/structured-reference.codec.js +81 -0
  113. package/dist/codecs/structured-reference.codec.js.map +1 -0
  114. package/dist/codecs/system-rules.codec.d.ts +32 -0
  115. package/dist/codecs/system-rules.codec.d.ts.map +1 -0
  116. package/dist/codecs/system-rules.codec.js +62 -0
  117. package/dist/codecs/system-rules.codec.js.map +1 -0
  118. package/dist/codecs/tool-output.codec.d.ts +66 -0
  119. package/dist/codecs/tool-output.codec.d.ts.map +1 -0
  120. package/dist/codecs/tool-output.codec.js +95 -0
  121. package/dist/codecs/tool-output.codec.js.map +1 -0
  122. package/dist/codecs/tool-schema.codec.d.ts +36 -0
  123. package/dist/codecs/tool-schema.codec.d.ts.map +1 -0
  124. package/dist/codecs/tool-schema.codec.js +74 -0
  125. package/dist/codecs/tool-schema.codec.js.map +1 -0
  126. package/dist/codecs/unsafe-text.codec.d.ts +28 -0
  127. package/dist/codecs/unsafe-text.codec.d.ts.map +1 -0
  128. package/dist/codecs/unsafe-text.codec.js +63 -0
  129. package/dist/codecs/unsafe-text.codec.js.map +1 -0
  130. package/dist/graph/context-graph.d.ts +121 -0
  131. package/dist/graph/context-graph.d.ts.map +1 -0
  132. package/dist/graph/context-graph.js +166 -0
  133. package/dist/graph/context-graph.js.map +1 -0
  134. package/dist/graph/index.d.ts +8 -0
  135. package/dist/graph/index.d.ts.map +1 -0
  136. package/dist/graph/index.js +24 -0
  137. package/dist/graph/index.js.map +1 -0
  138. package/dist/graph/kind-order.d.ts +60 -0
  139. package/dist/graph/kind-order.d.ts.map +1 -0
  140. package/dist/graph/kind-order.js +113 -0
  141. package/dist/graph/kind-order.js.map +1 -0
  142. package/dist/graph/queries.d.ts +68 -0
  143. package/dist/graph/queries.d.ts.map +1 -0
  144. package/dist/graph/queries.js +240 -0
  145. package/dist/graph/queries.js.map +1 -0
  146. package/dist/graph/views.d.ts +90 -0
  147. package/dist/graph/views.d.ts.map +1 -0
  148. package/dist/graph/views.js +173 -0
  149. package/dist/graph/views.js.map +1 -0
  150. package/dist/index.d.ts +16 -0
  151. package/dist/index.d.ts.map +1 -0
  152. package/dist/index.js +40 -0
  153. package/dist/index.js.map +1 -0
  154. package/dist/pipeline/compactor.d.ts +128 -0
  155. package/dist/pipeline/compactor.d.ts.map +1 -0
  156. package/dist/pipeline/compactor.js +346 -0
  157. package/dist/pipeline/compactor.js.map +1 -0
  158. package/dist/pipeline/index.d.ts +6 -0
  159. package/dist/pipeline/index.d.ts.map +1 -0
  160. package/dist/pipeline/index.js +22 -0
  161. package/dist/pipeline/index.js.map +1 -0
  162. package/dist/pipeline/summarizer.d.ts +18 -0
  163. package/dist/pipeline/summarizer.d.ts.map +1 -0
  164. package/dist/pipeline/summarizer.js +68 -0
  165. package/dist/pipeline/summarizer.js.map +1 -0
  166. package/dist/policies/default-policy.d.ts +29 -0
  167. package/dist/policies/default-policy.d.ts.map +1 -0
  168. package/dist/policies/default-policy.js +58 -0
  169. package/dist/policies/default-policy.js.map +1 -0
  170. package/dist/policies/index.d.ts +5 -0
  171. package/dist/policies/index.d.ts.map +1 -0
  172. package/dist/policies/index.js +21 -0
  173. package/dist/policies/index.js.map +1 -0
  174. package/dist/providers/anthropic-compiler.d.ts +58 -0
  175. package/dist/providers/anthropic-compiler.d.ts.map +1 -0
  176. package/dist/providers/anthropic-compiler.js +182 -0
  177. package/dist/providers/anthropic-compiler.js.map +1 -0
  178. package/dist/providers/capabilities.d.ts +54 -0
  179. package/dist/providers/capabilities.d.ts.map +1 -0
  180. package/dist/providers/capabilities.js +87 -0
  181. package/dist/providers/capabilities.js.map +1 -0
  182. package/dist/providers/gemini-compiler.d.ts +51 -0
  183. package/dist/providers/gemini-compiler.d.ts.map +1 -0
  184. package/dist/providers/gemini-compiler.js +206 -0
  185. package/dist/providers/gemini-compiler.js.map +1 -0
  186. package/dist/providers/index.d.ts +8 -0
  187. package/dist/providers/index.d.ts.map +1 -0
  188. package/dist/providers/index.js +24 -0
  189. package/dist/providers/index.js.map +1 -0
  190. package/dist/providers/openai-compiler.d.ts +46 -0
  191. package/dist/providers/openai-compiler.d.ts.map +1 -0
  192. package/dist/providers/openai-compiler.js +149 -0
  193. package/dist/providers/openai-compiler.js.map +1 -0
  194. package/dist/types/attachment.d.ts +62 -0
  195. package/dist/types/attachment.d.ts.map +1 -0
  196. package/dist/types/attachment.js +6 -0
  197. package/dist/types/attachment.js.map +1 -0
  198. package/dist/types/block.d.ts +61 -0
  199. package/dist/types/block.d.ts.map +1 -0
  200. package/dist/types/block.js +8 -0
  201. package/dist/types/block.js.map +1 -0
  202. package/dist/types/codec.d.ts +58 -0
  203. package/dist/types/codec.d.ts.map +1 -0
  204. package/dist/types/codec.js +6 -0
  205. package/dist/types/codec.js.map +1 -0
  206. package/dist/types/compiled.d.ts +91 -0
  207. package/dist/types/compiled.d.ts.map +1 -0
  208. package/dist/types/compiled.js +6 -0
  209. package/dist/types/compiled.js.map +1 -0
  210. package/dist/types/hash.d.ts +24 -0
  211. package/dist/types/hash.d.ts.map +1 -0
  212. package/dist/types/hash.js +49 -0
  213. package/dist/types/hash.js.map +1 -0
  214. package/dist/types/index.d.ts +10 -0
  215. package/dist/types/index.d.ts.map +1 -0
  216. package/dist/types/index.js +26 -0
  217. package/dist/types/index.js.map +1 -0
  218. package/dist/types/policy.d.ts +128 -0
  219. package/dist/types/policy.d.ts.map +1 -0
  220. package/dist/types/policy.js +55 -0
  221. package/dist/types/policy.js.map +1 -0
  222. package/package.json +55 -0
  223. package/postcss.config.js +4 -0
  224. package/src/__tests__/attachment-selector.test.ts +559 -0
  225. package/src/__tests__/cache-breakpoints.test.ts +566 -0
  226. package/src/__tests__/codecs.test.ts +417 -0
  227. package/src/__tests__/compactor.test.ts +608 -0
  228. package/src/__tests__/context-graph.test.ts +383 -0
  229. package/src/__tests__/hash.test.ts +274 -0
  230. package/src/__tests__/integration.test.ts +866 -0
  231. package/src/__tests__/kind-order.test.ts +312 -0
  232. package/src/__tests__/phase2-integration.test.ts +253 -0
  233. package/src/__tests__/queries.test.ts +387 -0
  234. package/src/__tests__/token-estimator.test.ts +326 -0
  235. package/src/adapters/anthropic-estimator.ts +125 -0
  236. package/src/adapters/attachment-resolver.ts +295 -0
  237. package/src/adapters/attachment-selector.ts +218 -0
  238. package/src/adapters/gemini-estimator.ts +93 -0
  239. package/src/adapters/index.ts +12 -0
  240. package/src/adapters/memory-store.ts +299 -0
  241. package/src/adapters/openai-estimator.ts +105 -0
  242. package/src/adapters/summarizer.ts +250 -0
  243. package/src/adapters/token-estimator.ts +74 -0
  244. package/src/builder/context-builder.ts +467 -0
  245. package/src/builder/context-fork.ts +471 -0
  246. package/src/builder/index.ts +6 -0
  247. package/src/codecs/base.ts +36 -0
  248. package/src/codecs/conversation-history.codec.ts +108 -0
  249. package/src/codecs/index.ts +57 -0
  250. package/src/codecs/redacted-stub.codec.ts +76 -0
  251. package/src/codecs/structured-reference.codec.ts +96 -0
  252. package/src/codecs/system-rules.codec.ts +74 -0
  253. package/src/codecs/tool-output.codec.ts +109 -0
  254. package/src/codecs/tool-schema.codec.ts +87 -0
  255. package/src/codecs/unsafe-text.codec.ts +74 -0
  256. package/src/graph/context-graph.ts +205 -0
  257. package/src/graph/index.ts +8 -0
  258. package/src/graph/kind-order.ts +125 -0
  259. package/src/graph/queries.ts +306 -0
  260. package/src/graph/views.ts +255 -0
  261. package/src/index.ts +31 -0
  262. package/src/pipeline/compactor.ts +563 -0
  263. package/src/pipeline/index.ts +6 -0
  264. package/src/pipeline/summarizer.ts +76 -0
  265. package/src/policies/default-policy.ts +69 -0
  266. package/src/policies/index.ts +5 -0
  267. package/src/providers/anthropic-compiler.ts +294 -0
  268. package/src/providers/capabilities.ts +144 -0
  269. package/src/providers/gemini-compiler.ts +272 -0
  270. package/src/providers/index.ts +8 -0
  271. package/src/providers/openai-compiler.ts +191 -0
  272. package/src/types/attachment.ts +86 -0
  273. package/src/types/block.ts +84 -0
  274. package/src/types/codec.ts +68 -0
  275. package/src/types/compiled.ts +109 -0
  276. package/src/types/hash.ts +58 -0
  277. package/src/types/index.ts +10 -0
  278. package/src/types/policy.ts +194 -0
  279. package/tsconfig.json +21 -0
  280. package/vitest.config.ts +21 -0
@@ -0,0 +1,449 @@
1
+ "use strict";
2
+ /**
3
+ * Unit tests for AttachmentSelector: budget enforcement and ranking.
4
+ *
5
+ * Tests:
6
+ * - Budget enforcement (token limit)
7
+ * - Ranking by purpose, user mention, recency
8
+ * - Deterministic ordering (same input → same selection)
9
+ * - Token estimation for different attachment types
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const vitest_1 = require("vitest");
13
+ const attachment_selector_js_1 = require("../adapters/attachment-selector.js");
14
+ // Mock TokenEstimator
15
+ const mockEstimator = {
16
+ estimateTokens: async () => ({ tokens: 100 }),
17
+ };
18
+ (0, vitest_1.describe)('AttachmentSelector', () => {
19
+ (0, vitest_1.describe)('Budget Enforcement', () => {
20
+ (0, vitest_1.it)('should select attachments within budget', async () => {
21
+ const policy = {
22
+ maxTokensTotal: 1000, // Budget for ~10 text attachments (100 tokens each)
23
+ selectionStrategy: {
24
+ rankBy: ['purpose'],
25
+ },
26
+ };
27
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
28
+ const attachments = [
29
+ createRankedAttachment('att1', 'evidence', false, 'Short text', 400), // ~100 tokens
30
+ createRankedAttachment('att2', 'evidence', false, 'Short text', 400), // ~100 tokens
31
+ createRankedAttachment('att3', 'evidence', false, 'Short text', 400), // ~100 tokens
32
+ ];
33
+ const result = await selector.selectAttachments(attachments);
34
+ (0, vitest_1.expect)(result.selected).toHaveLength(3);
35
+ (0, vitest_1.expect)(result.tokensUsed).toBeLessThanOrEqual(1000);
36
+ });
37
+ (0, vitest_1.it)('should exclude attachments over budget', async () => {
38
+ const policy = {
39
+ maxTokensTotal: 500, // Small budget
40
+ selectionStrategy: {
41
+ rankBy: ['purpose'],
42
+ },
43
+ };
44
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
45
+ const largeText = 'x'.repeat(2000); // ~500 tokens
46
+ const attachments = [
47
+ createRankedAttachment('att1', 'evidence', false, largeText, 500), // ~500 tokens
48
+ createRankedAttachment('att2', 'evidence', false, largeText, 500), // ~500 tokens (over budget)
49
+ ];
50
+ const result = await selector.selectAttachments(attachments);
51
+ (0, vitest_1.expect)(result.selected).toHaveLength(1);
52
+ (0, vitest_1.expect)(result.excluded).toHaveLength(1);
53
+ (0, vitest_1.expect)(result.excluded[0].attachmentId).toBe('att2');
54
+ });
55
+ (0, vitest_1.it)('should track total tokens used', async () => {
56
+ const policy = {
57
+ maxTokensTotal: 2000,
58
+ selectionStrategy: {
59
+ rankBy: ['purpose'],
60
+ },
61
+ };
62
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
63
+ const attachments = [
64
+ createRankedAttachment('att1', 'evidence', false, 'Short text', 400), // ~100 tokens
65
+ createRankedAttachment('att2', 'evidence', false, 'Short text', 400), // ~100 tokens
66
+ ];
67
+ const result = await selector.selectAttachments(attachments);
68
+ (0, vitest_1.expect)(result.tokensUsed).toBeGreaterThan(0);
69
+ (0, vitest_1.expect)(result.tokensUsed).toBeLessThanOrEqual(2000);
70
+ });
71
+ (0, vitest_1.it)('should handle zero budget gracefully', async () => {
72
+ const policy = {
73
+ maxTokensTotal: 0,
74
+ selectionStrategy: {
75
+ rankBy: ['purpose'],
76
+ },
77
+ };
78
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
79
+ const attachments = [
80
+ createRankedAttachment('att1', 'evidence', false, 'text', 100),
81
+ ];
82
+ const result = await selector.selectAttachments(attachments);
83
+ (0, vitest_1.expect)(result.selected).toHaveLength(0);
84
+ (0, vitest_1.expect)(result.excluded).toHaveLength(1);
85
+ (0, vitest_1.expect)(result.tokensUsed).toBe(0);
86
+ });
87
+ });
88
+ (0, vitest_1.describe)('Purpose Ranking', () => {
89
+ (0, vitest_1.it)('should prioritize evidence > input > context > artifact', async () => {
90
+ const policy = {
91
+ maxTokensTotal: 200, // Only 2 attachments fit (100 tokens each)
92
+ selectionStrategy: {
93
+ rankBy: ['purpose'],
94
+ },
95
+ };
96
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
97
+ // Each attachment: 400 chars = ~100 tokens (text.length / 4)
98
+ const largeText = 'x'.repeat(400);
99
+ const attachments = [
100
+ createRankedAttachment('att1', 'artifact', false, largeText, 100), // Lowest priority
101
+ createRankedAttachment('att2', 'evidence', false, largeText, 100), // Highest priority
102
+ createRankedAttachment('att3', 'context', false, largeText, 100), // Medium priority
103
+ createRankedAttachment('att4', 'input', false, largeText, 100), // High priority
104
+ ];
105
+ const result = await selector.selectAttachments(attachments);
106
+ // Should select evidence and input (highest priority)
107
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
108
+ const selectedIds = result.selected.map((a) => a.attachmentId);
109
+ (0, vitest_1.expect)(selectedIds).toContain('att2'); // evidence
110
+ (0, vitest_1.expect)(selectedIds).toContain('att4'); // input
111
+ });
112
+ (0, vitest_1.it)('should use custom purpose priority if provided', async () => {
113
+ const policy = {
114
+ maxTokensTotal: 200,
115
+ selectionStrategy: {
116
+ rankBy: ['purpose'],
117
+ purposePriority: {
118
+ artifact: 1, // Highest
119
+ context: 2,
120
+ input: 3,
121
+ evidence: 4, // Lowest
122
+ },
123
+ },
124
+ };
125
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
126
+ const attachments = [
127
+ createRankedAttachment('att1', 'artifact', false, 'text', 100),
128
+ createRankedAttachment('att2', 'evidence', false, 'text', 100),
129
+ ];
130
+ const result = await selector.selectAttachments(attachments);
131
+ // Should prioritize artifact over evidence
132
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
133
+ (0, vitest_1.expect)(result.selected[0].attachmentId).toBe('att1'); // artifact first
134
+ });
135
+ });
136
+ (0, vitest_1.describe)('User Mention Ranking', () => {
137
+ (0, vitest_1.it)('should prioritize user-mentioned attachments', async () => {
138
+ const policy = {
139
+ maxTokensTotal: 200,
140
+ selectionStrategy: {
141
+ rankBy: ['user_mention'],
142
+ },
143
+ };
144
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
145
+ // Each attachment: 400 chars = ~100 tokens
146
+ const largeText = 'x'.repeat(400);
147
+ const attachments = [
148
+ createRankedAttachment('att1', 'context', false, largeText, 100), // Not mentioned
149
+ createRankedAttachment('att2', 'context', true, largeText, 100), // User mentioned
150
+ createRankedAttachment('att3', 'context', true, largeText, 100), // User mentioned
151
+ ];
152
+ const result = await selector.selectAttachments(attachments);
153
+ // Should select mentioned attachments first
154
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
155
+ const selectedIds = result.selected.map((a) => a.attachmentId);
156
+ (0, vitest_1.expect)(selectedIds).toContain('att2');
157
+ (0, vitest_1.expect)(selectedIds).toContain('att3');
158
+ });
159
+ });
160
+ (0, vitest_1.describe)('Recency Ranking', () => {
161
+ (0, vitest_1.it)('should prioritize recent attachments', async () => {
162
+ const now = Date.now() / 1000;
163
+ const policy = {
164
+ maxTokensTotal: 200,
165
+ selectionStrategy: {
166
+ rankBy: ['recency'],
167
+ },
168
+ };
169
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
170
+ // Each attachment: 400 chars = ~100 tokens
171
+ const largeText = 'x'.repeat(400);
172
+ const attachments = [
173
+ createRankedAttachment('att1', 'context', false, largeText, now - 1000), // Older
174
+ createRankedAttachment('att2', 'context', false, largeText, now - 100), // Recent
175
+ createRankedAttachment('att3', 'context', false, largeText, now - 10), // Most recent
176
+ ];
177
+ const result = await selector.selectAttachments(attachments);
178
+ // Should select most recent
179
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
180
+ const selectedIds = result.selected.map((a) => a.attachmentId);
181
+ (0, vitest_1.expect)(selectedIds).toContain('att3'); // Most recent
182
+ (0, vitest_1.expect)(selectedIds).toContain('att2'); // Second most recent
183
+ });
184
+ });
185
+ (0, vitest_1.describe)('Multi-Criterion Ranking', () => {
186
+ (0, vitest_1.it)('should rank by multiple criteria in priority order', async () => {
187
+ const policy = {
188
+ maxTokensTotal: 200,
189
+ selectionStrategy: {
190
+ rankBy: ['user_mention', 'purpose'], // Mention first, then purpose
191
+ },
192
+ };
193
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
194
+ // Each attachment: 400 chars = ~100 tokens
195
+ const largeText = 'x'.repeat(400);
196
+ const attachments = [
197
+ createRankedAttachment('att1', 'evidence', false, largeText, 100), // Not mentioned, high purpose
198
+ createRankedAttachment('att2', 'artifact', true, largeText, 100), // Mentioned, low purpose
199
+ createRankedAttachment('att3', 'input', true, largeText, 100), // Mentioned, medium purpose
200
+ ];
201
+ const result = await selector.selectAttachments(attachments);
202
+ // Should select mentioned attachments (att2, att3), prioritize input over artifact
203
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
204
+ const selectedIds = result.selected.map((a) => a.attachmentId);
205
+ (0, vitest_1.expect)(selectedIds).toContain('att2');
206
+ (0, vitest_1.expect)(selectedIds).toContain('att3');
207
+ });
208
+ });
209
+ (0, vitest_1.describe)('Deterministic Ordering', () => {
210
+ (0, vitest_1.it)('should produce same selection for same input', async () => {
211
+ const policy = {
212
+ maxTokensTotal: 500,
213
+ selectionStrategy: {
214
+ rankBy: ['purpose', 'recency'],
215
+ },
216
+ };
217
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
218
+ const attachments = [
219
+ createRankedAttachment('att1', 'evidence', false, 'text', 100),
220
+ createRankedAttachment('att2', 'context', false, 'text', 200),
221
+ createRankedAttachment('att3', 'input', false, 'text', 150),
222
+ ];
223
+ const result1 = await selector.selectAttachments([...attachments]);
224
+ const result2 = await selector.selectAttachments([...attachments]);
225
+ (0, vitest_1.expect)(result1.selected.map((a) => a.attachmentId)).toEqual(result2.selected.map((a) => a.attachmentId));
226
+ });
227
+ (0, vitest_1.it)('should use attachmentId as tiebreaker', async () => {
228
+ const policy = {
229
+ maxTokensTotal: 200,
230
+ selectionStrategy: {
231
+ rankBy: ['purpose'], // Same purpose = tie
232
+ },
233
+ };
234
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
235
+ // Each attachment: 400 chars = ~100 tokens
236
+ const largeText = 'x'.repeat(400);
237
+ const attachments = [
238
+ createRankedAttachment('bbb', 'evidence', false, largeText, 100),
239
+ createRankedAttachment('aaa', 'evidence', false, largeText, 100),
240
+ createRankedAttachment('ccc', 'evidence', false, largeText, 100),
241
+ ];
242
+ const result = await selector.selectAttachments(attachments);
243
+ // Should select in alphabetical order (tiebreaker)
244
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
245
+ (0, vitest_1.expect)(result.selected[0].attachmentId).toBe('aaa');
246
+ (0, vitest_1.expect)(result.selected[1].attachmentId).toBe('bbb');
247
+ });
248
+ });
249
+ (0, vitest_1.describe)('Token Estimation', () => {
250
+ (0, vitest_1.it)('should estimate tokens for text attachments', async () => {
251
+ const policy = {
252
+ maxTokensTotal: 200,
253
+ selectionStrategy: {
254
+ rankBy: ['purpose'],
255
+ },
256
+ };
257
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
258
+ // ~400 chars = ~100 tokens
259
+ const text = 'x'.repeat(400);
260
+ const attachments = [
261
+ createRankedAttachment('att1', 'evidence', false, text, 100),
262
+ ];
263
+ const result = await selector.selectAttachments(attachments);
264
+ (0, vitest_1.expect)(result.tokensUsed).toBeGreaterThan(0);
265
+ (0, vitest_1.expect)(result.tokensUsed).toBeLessThanOrEqual(200);
266
+ });
267
+ (0, vitest_1.it)('should estimate tokens for image attachments', async () => {
268
+ const policy = {
269
+ maxTokensTotal: 1000,
270
+ selectionStrategy: {
271
+ rankBy: ['purpose'],
272
+ },
273
+ };
274
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
275
+ const imageAttachment = {
276
+ attachmentId: 'img1',
277
+ purpose: 'evidence',
278
+ userMention: false,
279
+ rankScore: 0,
280
+ filename: 'test.png',
281
+ mimeType: 'image/png',
282
+ sizeBytes: 1024,
283
+ storage: 'local',
284
+ storagePath: '/test/test.png',
285
+ createdAt: Date.now() / 1000,
286
+ content: 'base64data',
287
+ };
288
+ const result = await selector.selectAttachments([imageAttachment]);
289
+ // Image should have conservative token estimate (~340 tokens)
290
+ (0, vitest_1.expect)(result.tokensUsed).toBeGreaterThan(0);
291
+ });
292
+ (0, vitest_1.it)('should estimate tokens for PDF attachments', async () => {
293
+ const policy = {
294
+ maxTokensTotal: 1000,
295
+ selectionStrategy: {
296
+ rankBy: ['purpose'],
297
+ },
298
+ };
299
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
300
+ const pdfAttachment = {
301
+ attachmentId: 'pdf1',
302
+ purpose: 'evidence',
303
+ userMention: false,
304
+ rankScore: 0,
305
+ filename: 'doc.pdf',
306
+ mimeType: 'application/pdf',
307
+ sizeBytes: 2048,
308
+ storage: 'local',
309
+ storagePath: '/test/doc.pdf',
310
+ createdAt: Date.now() / 1000,
311
+ content: 'base64pdfdata',
312
+ };
313
+ const result = await selector.selectAttachments([pdfAttachment]);
314
+ (0, vitest_1.expect)(result.tokensUsed).toBeGreaterThan(0);
315
+ });
316
+ });
317
+ (0, vitest_1.describe)('selectFromList convenience method', () => {
318
+ (0, vitest_1.it)('should build ranked attachments from list and metadata', async () => {
319
+ const policy = {
320
+ maxTokensTotal: 500,
321
+ selectionStrategy: {
322
+ rankBy: ['purpose'],
323
+ },
324
+ };
325
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
326
+ const attachments = [
327
+ {
328
+ attachmentId: 'att1',
329
+ filename: 'test.txt',
330
+ mimeType: 'text/plain',
331
+ sizeBytes: 12,
332
+ storage: 'local',
333
+ storagePath: '/test/test.txt',
334
+ createdAt: Date.now() / 1000,
335
+ text: 'Test content',
336
+ },
337
+ {
338
+ attachmentId: 'att2',
339
+ filename: 'test2.txt',
340
+ mimeType: 'text/plain',
341
+ sizeBytes: 14,
342
+ storage: 'local',
343
+ storagePath: '/test/test2.txt',
344
+ createdAt: Date.now() / 1000,
345
+ text: 'Test content 2',
346
+ },
347
+ ];
348
+ const metadata = new Map([
349
+ ['att1', { purpose: 'evidence', userMention: true }],
350
+ ['att2', { purpose: 'context', userMention: false }],
351
+ ]);
352
+ const result = await selector.selectFromList(attachments, metadata);
353
+ (0, vitest_1.expect)(result.selected).toHaveLength(2);
354
+ });
355
+ (0, vitest_1.it)('should use default metadata when not provided', async () => {
356
+ const policy = {
357
+ maxTokensTotal: 500,
358
+ selectionStrategy: {
359
+ rankBy: ['purpose'],
360
+ },
361
+ };
362
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
363
+ const attachments = [
364
+ {
365
+ attachmentId: 'att1',
366
+ filename: 'test.txt',
367
+ mimeType: 'text/plain',
368
+ sizeBytes: 12,
369
+ storage: 'local',
370
+ storagePath: '/test/test.txt',
371
+ createdAt: Date.now() / 1000,
372
+ text: 'Test content',
373
+ },
374
+ ];
375
+ const metadata = new Map(); // Empty metadata
376
+ const result = await selector.selectFromList(attachments, metadata);
377
+ // Should use default: purpose = 'context', userMention = false
378
+ (0, vitest_1.expect)(result.selected).toHaveLength(1);
379
+ });
380
+ });
381
+ (0, vitest_1.describe)('Edge Cases', () => {
382
+ (0, vitest_1.it)('should handle empty attachment list', async () => {
383
+ const policy = {
384
+ maxTokensTotal: 1000,
385
+ selectionStrategy: {
386
+ rankBy: ['purpose'],
387
+ },
388
+ };
389
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
390
+ const result = await selector.selectAttachments([]);
391
+ (0, vitest_1.expect)(result.selected).toHaveLength(0);
392
+ (0, vitest_1.expect)(result.excluded).toHaveLength(0);
393
+ (0, vitest_1.expect)(result.tokensUsed).toBe(0);
394
+ });
395
+ (0, vitest_1.it)('should handle single attachment', async () => {
396
+ const policy = {
397
+ maxTokensTotal: 1000,
398
+ selectionStrategy: {
399
+ rankBy: ['purpose'],
400
+ },
401
+ };
402
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
403
+ const attachments = [
404
+ createRankedAttachment('att1', 'evidence', false, 'text', 100),
405
+ ];
406
+ const result = await selector.selectAttachments(attachments);
407
+ (0, vitest_1.expect)(result.selected).toHaveLength(1);
408
+ (0, vitest_1.expect)(result.excluded).toHaveLength(0);
409
+ });
410
+ (0, vitest_1.it)('should handle all attachments over budget', async () => {
411
+ const policy = {
412
+ maxTokensTotal: 50, // Very small budget
413
+ selectionStrategy: {
414
+ rankBy: ['purpose'],
415
+ },
416
+ };
417
+ const selector = new attachment_selector_js_1.AttachmentSelector(policy, mockEstimator);
418
+ const largeText = 'x'.repeat(1000);
419
+ const attachments = [
420
+ createRankedAttachment('att1', 'evidence', false, largeText, 100),
421
+ createRankedAttachment('att2', 'evidence', false, largeText, 100),
422
+ ];
423
+ const result = await selector.selectAttachments(attachments);
424
+ (0, vitest_1.expect)(result.selected).toHaveLength(0);
425
+ (0, vitest_1.expect)(result.excluded).toHaveLength(2);
426
+ (0, vitest_1.expect)(result.tokensUsed).toBe(0);
427
+ });
428
+ });
429
+ });
430
+ // Test helpers
431
+ function createRankedAttachment(id, purpose, userMention, text, createdAt) {
432
+ // If createdAt looks like a character count (small number), assume it's meant as a timestamp offset
433
+ // Otherwise, treat it as Unix timestamp in seconds
434
+ const normalizedCreatedAt = createdAt < 10000 ? Date.now() / 1000 - createdAt : createdAt;
435
+ return {
436
+ attachmentId: id,
437
+ purpose,
438
+ userMention,
439
+ rankScore: 0, // Will be computed
440
+ filename: `${id}.txt`,
441
+ mimeType: 'text/plain',
442
+ sizeBytes: text.length,
443
+ storage: 'local',
444
+ storagePath: `/test/${id}.txt`,
445
+ createdAt: normalizedCreatedAt,
446
+ text,
447
+ };
448
+ }
449
+ //# sourceMappingURL=attachment-selector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-selector.test.js","sourceRoot":"","sources":["../../src/__tests__/attachment-selector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Unit tests for Anthropic cache breakpoint resolution.
3
+ *
4
+ * Tests:
5
+ * - "After last matching block" rule
6
+ * - Selector matching (kind, codecId, tag, source)
7
+ * - Diagnostics for no matches / many matches
8
+ * - Cache control placement in system messages
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cache-breakpoints.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-breakpoints.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cache-breakpoints.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}