logicstamp-context 0.8.5 → 0.8.7

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 (276) hide show
  1. package/README.md +3 -2
  2. package/dist/cli/commands/clean.d.ts.map +1 -1
  3. package/dist/cli/commands/clean.js +8 -3
  4. package/dist/cli/commands/clean.js.map +1 -1
  5. package/dist/cli/commands/compare/cleanup.d.ts.map +1 -1
  6. package/dist/cli/commands/compare/cleanup.js.map +1 -1
  7. package/dist/cli/commands/compare/core.d.ts.map +1 -1
  8. package/dist/cli/commands/compare/core.js +47 -19
  9. package/dist/cli/commands/compare/core.js.map +1 -1
  10. package/dist/cli/commands/compare/display.d.ts.map +1 -1
  11. package/dist/cli/commands/compare/display.js +31 -18
  12. package/dist/cli/commands/compare/display.js.map +1 -1
  13. package/dist/cli/commands/compare/multiFile.d.ts.map +1 -1
  14. package/dist/cli/commands/compare/multiFile.js +8 -8
  15. package/dist/cli/commands/compare/multiFile.js.map +1 -1
  16. package/dist/cli/commands/compare/singleFile.d.ts.map +1 -1
  17. package/dist/cli/commands/compare/singleFile.js +19 -13
  18. package/dist/cli/commands/compare/singleFile.js.map +1 -1
  19. package/dist/cli/commands/compare/types.d.ts.map +1 -1
  20. package/dist/cli/commands/compare/utils.d.ts.map +1 -1
  21. package/dist/cli/commands/compare/utils.js +2 -2
  22. package/dist/cli/commands/compare/utils.js.map +1 -1
  23. package/dist/cli/commands/context/bundleFormatter.d.ts.map +1 -1
  24. package/dist/cli/commands/context/bundleFormatter.js +8 -4
  25. package/dist/cli/commands/context/bundleFormatter.js.map +1 -1
  26. package/dist/cli/commands/context/configManager.d.ts.map +1 -1
  27. package/dist/cli/commands/context/configManager.js +2 -2
  28. package/dist/cli/commands/context/configManager.js.map +1 -1
  29. package/dist/cli/commands/context/contractBuilder.d.ts.map +1 -1
  30. package/dist/cli/commands/context/contractBuilder.js +3 -1
  31. package/dist/cli/commands/context/contractBuilder.js.map +1 -1
  32. package/dist/cli/commands/context/fileWriter.d.ts.map +1 -1
  33. package/dist/cli/commands/context/fileWriter.js +13 -6
  34. package/dist/cli/commands/context/fileWriter.js.map +1 -1
  35. package/dist/cli/commands/context/statsCalculator.d.ts +1 -1
  36. package/dist/cli/commands/context/statsCalculator.d.ts.map +1 -1
  37. package/dist/cli/commands/context/statsCalculator.js +22 -8
  38. package/dist/cli/commands/context/statsCalculator.js.map +1 -1
  39. package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -1
  40. package/dist/cli/commands/context/tokenEstimator.js +52 -25
  41. package/dist/cli/commands/context/tokenEstimator.js.map +1 -1
  42. package/dist/cli/commands/context/watchMode/incrementalWatch.d.ts.map +1 -1
  43. package/dist/cli/commands/context/watchMode/incrementalWatch.js +15 -13
  44. package/dist/cli/commands/context/watchMode/incrementalWatch.js.map +1 -1
  45. package/dist/cli/commands/context/watchMode/watchDiff.d.ts.map +1 -1
  46. package/dist/cli/commands/context/watchMode/watchDiff.js +58 -35
  47. package/dist/cli/commands/context/watchMode/watchDiff.js.map +1 -1
  48. package/dist/cli/commands/context/watchMode/watchMode.d.ts.map +1 -1
  49. package/dist/cli/commands/context/watchMode/watchMode.js +76 -42
  50. package/dist/cli/commands/context/watchMode/watchMode.js.map +1 -1
  51. package/dist/cli/commands/context.d.ts.map +1 -1
  52. package/dist/cli/commands/context.js +32 -11
  53. package/dist/cli/commands/context.js.map +1 -1
  54. package/dist/cli/commands/ignore.d.ts.map +1 -1
  55. package/dist/cli/commands/ignore.js +5 -5
  56. package/dist/cli/commands/ignore.js.map +1 -1
  57. package/dist/cli/commands/init.d.ts.map +1 -1
  58. package/dist/cli/commands/init.js +8 -4
  59. package/dist/cli/commands/init.js.map +1 -1
  60. package/dist/cli/commands/security.d.ts.map +1 -1
  61. package/dist/cli/commands/security.js +19 -10
  62. package/dist/cli/commands/security.js.map +1 -1
  63. package/dist/cli/commands/validate.d.ts.map +1 -1
  64. package/dist/cli/commands/validate.js +12 -7
  65. package/dist/cli/commands/validate.js.map +1 -1
  66. package/dist/cli/handlers/cleanHandler.d.ts.map +1 -1
  67. package/dist/cli/handlers/cleanHandler.js.map +1 -1
  68. package/dist/cli/handlers/compareHandler.d.ts.map +1 -1
  69. package/dist/cli/handlers/compareHandler.js +76 -25
  70. package/dist/cli/handlers/compareHandler.js.map +1 -1
  71. package/dist/cli/handlers/contextHandler.d.ts.map +1 -1
  72. package/dist/cli/handlers/contextHandler.js +1 -1
  73. package/dist/cli/handlers/contextHandler.js.map +1 -1
  74. package/dist/cli/handlers/ignoreHandler.d.ts.map +1 -1
  75. package/dist/cli/handlers/ignoreHandler.js.map +1 -1
  76. package/dist/cli/handlers/securityHandler.d.ts.map +1 -1
  77. package/dist/cli/handlers/securityHandler.js +1 -1
  78. package/dist/cli/handlers/securityHandler.js.map +1 -1
  79. package/dist/cli/handlers/styleHandler.d.ts.map +1 -1
  80. package/dist/cli/handlers/styleHandler.js.map +1 -1
  81. package/dist/cli/index.js +1 -1
  82. package/dist/cli/index.js.map +1 -1
  83. package/dist/cli/parser/argumentParser.d.ts.map +1 -1
  84. package/dist/cli/parser/argumentParser.js +2 -4
  85. package/dist/cli/parser/argumentParser.js.map +1 -1
  86. package/dist/cli/stamp.js +4 -2
  87. package/dist/cli/stamp.js.map +1 -1
  88. package/dist/core/astParser/detectors.d.ts +1 -1
  89. package/dist/core/astParser/detectors.d.ts.map +1 -1
  90. package/dist/core/astParser/detectors.js +48 -32
  91. package/dist/core/astParser/detectors.js.map +1 -1
  92. package/dist/core/astParser.d.ts.map +1 -1
  93. package/dist/core/astParser.js +10 -7
  94. package/dist/core/astParser.js.map +1 -1
  95. package/dist/core/contractBuilder.d.ts.map +1 -1
  96. package/dist/core/contractBuilder.js +10 -6
  97. package/dist/core/contractBuilder.js.map +1 -1
  98. package/dist/core/manifest.d.ts.map +1 -1
  99. package/dist/core/manifest.js +12 -5
  100. package/dist/core/manifest.js.map +1 -1
  101. package/dist/core/pack/builder.d.ts.map +1 -1
  102. package/dist/core/pack/builder.js +4 -2
  103. package/dist/core/pack/builder.js.map +1 -1
  104. package/dist/core/pack/collector.d.ts.map +1 -1
  105. package/dist/core/pack/collector.js +4 -2
  106. package/dist/core/pack/collector.js.map +1 -1
  107. package/dist/core/pack/loader.d.ts.map +1 -1
  108. package/dist/core/pack/loader.js +12 -6
  109. package/dist/core/pack/loader.js.map +1 -1
  110. package/dist/core/pack/packageInfo.d.ts +18 -1
  111. package/dist/core/pack/packageInfo.d.ts.map +1 -1
  112. package/dist/core/pack/packageInfo.js +57 -62
  113. package/dist/core/pack/packageInfo.js.map +1 -1
  114. package/dist/core/pack/resolver.d.ts.map +1 -1
  115. package/dist/core/pack/resolver.js +8 -3
  116. package/dist/core/pack/resolver.js.map +1 -1
  117. package/dist/core/pack.d.ts.map +1 -1
  118. package/dist/core/pack.js +8 -5
  119. package/dist/core/pack.js.map +1 -1
  120. package/dist/core/signature.d.ts.map +1 -1
  121. package/dist/core/signature.js +35 -13
  122. package/dist/core/signature.js.map +1 -1
  123. package/dist/core/violations.d.ts.map +1 -1
  124. package/dist/core/violations.js +41 -20
  125. package/dist/core/violations.js.map +1 -1
  126. package/dist/extractors/express/expressExtractor.d.ts +1 -1
  127. package/dist/extractors/express/expressExtractor.d.ts.map +1 -1
  128. package/dist/extractors/express/expressExtractor.js +5 -4
  129. package/dist/extractors/express/expressExtractor.js.map +1 -1
  130. package/dist/extractors/express/index.d.ts +1 -1
  131. package/dist/extractors/express/index.d.ts.map +1 -1
  132. package/dist/extractors/express/index.js +1 -1
  133. package/dist/extractors/express/index.js.map +1 -1
  134. package/dist/extractors/nest/nestjsExtractor.d.ts +1 -1
  135. package/dist/extractors/nest/nestjsExtractor.d.ts.map +1 -1
  136. package/dist/extractors/nest/nestjsExtractor.js +5 -3
  137. package/dist/extractors/nest/nestjsExtractor.js.map +1 -1
  138. package/dist/extractors/react/componentExtractor.d.ts +1 -1
  139. package/dist/extractors/react/componentExtractor.d.ts.map +1 -1
  140. package/dist/extractors/react/componentExtractor.js +9 -3
  141. package/dist/extractors/react/componentExtractor.js.map +1 -1
  142. package/dist/extractors/react/eventExtractor.d.ts +1 -1
  143. package/dist/extractors/react/eventExtractor.d.ts.map +1 -1
  144. package/dist/extractors/react/eventExtractor.js +11 -6
  145. package/dist/extractors/react/eventExtractor.js.map +1 -1
  146. package/dist/extractors/react/hookParameterExtractor.d.ts +1 -1
  147. package/dist/extractors/react/hookParameterExtractor.d.ts.map +1 -1
  148. package/dist/extractors/react/hookParameterExtractor.js +13 -9
  149. package/dist/extractors/react/hookParameterExtractor.js.map +1 -1
  150. package/dist/extractors/react/index.d.ts +1 -1
  151. package/dist/extractors/react/index.d.ts.map +1 -1
  152. package/dist/extractors/react/index.js +1 -1
  153. package/dist/extractors/react/index.js.map +1 -1
  154. package/dist/extractors/react/propExtractor.d.ts +1 -1
  155. package/dist/extractors/react/propExtractor.d.ts.map +1 -1
  156. package/dist/extractors/react/propExtractor.js +17 -8
  157. package/dist/extractors/react/propExtractor.js.map +1 -1
  158. package/dist/extractors/react/stateExtractor.d.ts +1 -1
  159. package/dist/extractors/react/stateExtractor.d.ts.map +1 -1
  160. package/dist/extractors/react/stateExtractor.js +7 -3
  161. package/dist/extractors/react/stateExtractor.js.map +1 -1
  162. package/dist/extractors/shared/backendExtractor.d.ts +1 -1
  163. package/dist/extractors/shared/backendExtractor.d.ts.map +1 -1
  164. package/dist/extractors/shared/backendExtractor.js +7 -5
  165. package/dist/extractors/shared/backendExtractor.js.map +1 -1
  166. package/dist/extractors/shared/index.d.ts +1 -1
  167. package/dist/extractors/shared/index.d.ts.map +1 -1
  168. package/dist/extractors/shared/index.js +1 -1
  169. package/dist/extractors/shared/index.js.map +1 -1
  170. package/dist/extractors/shared/propTypeNormalizer.d.ts.map +1 -1
  171. package/dist/extractors/shared/propTypeNormalizer.js +4 -4
  172. package/dist/extractors/shared/propTypeNormalizer.js.map +1 -1
  173. package/dist/extractors/styling/antd.d.ts +1 -1
  174. package/dist/extractors/styling/antd.d.ts.map +1 -1
  175. package/dist/extractors/styling/antd.js +119 -45
  176. package/dist/extractors/styling/antd.js.map +1 -1
  177. package/dist/extractors/styling/chakra.d.ts +1 -1
  178. package/dist/extractors/styling/chakra.d.ts.map +1 -1
  179. package/dist/extractors/styling/chakra.js +144 -37
  180. package/dist/extractors/styling/chakra.js.map +1 -1
  181. package/dist/extractors/styling/index.d.ts +1 -1
  182. package/dist/extractors/styling/index.d.ts.map +1 -1
  183. package/dist/extractors/styling/index.js +1 -1
  184. package/dist/extractors/styling/index.js.map +1 -1
  185. package/dist/extractors/styling/layout.d.ts +1 -1
  186. package/dist/extractors/styling/layout.d.ts.map +1 -1
  187. package/dist/extractors/styling/layout.js +27 -19
  188. package/dist/extractors/styling/layout.js.map +1 -1
  189. package/dist/extractors/styling/material.d.ts +1 -1
  190. package/dist/extractors/styling/material.d.ts.map +1 -1
  191. package/dist/extractors/styling/material.js +129 -38
  192. package/dist/extractors/styling/material.js.map +1 -1
  193. package/dist/extractors/styling/motion.d.ts +1 -1
  194. package/dist/extractors/styling/motion.d.ts.map +1 -1
  195. package/dist/extractors/styling/motion.js +47 -19
  196. package/dist/extractors/styling/motion.js.map +1 -1
  197. package/dist/extractors/styling/radix.d.ts +1 -1
  198. package/dist/extractors/styling/radix.d.ts.map +1 -1
  199. package/dist/extractors/styling/radix.js +163 -23
  200. package/dist/extractors/styling/radix.js.map +1 -1
  201. package/dist/extractors/styling/scss.d.ts +1 -1
  202. package/dist/extractors/styling/scss.d.ts.map +1 -1
  203. package/dist/extractors/styling/scss.js +141 -23
  204. package/dist/extractors/styling/scss.js.map +1 -1
  205. package/dist/extractors/styling/shadcn.d.ts +1 -1
  206. package/dist/extractors/styling/shadcn.d.ts.map +1 -1
  207. package/dist/extractors/styling/shadcn.js +173 -58
  208. package/dist/extractors/styling/shadcn.js.map +1 -1
  209. package/dist/extractors/styling/styleExtractor.d.ts +1 -1
  210. package/dist/extractors/styling/styleExtractor.d.ts.map +1 -1
  211. package/dist/extractors/styling/styleExtractor.js +78 -38
  212. package/dist/extractors/styling/styleExtractor.js.map +1 -1
  213. package/dist/extractors/styling/styled.d.ts +1 -1
  214. package/dist/extractors/styling/styled.d.ts.map +1 -1
  215. package/dist/extractors/styling/styled.js +9 -5
  216. package/dist/extractors/styling/styled.js.map +1 -1
  217. package/dist/extractors/styling/styledJsx.d.ts +1 -1
  218. package/dist/extractors/styling/styledJsx.d.ts.map +1 -1
  219. package/dist/extractors/styling/styledJsx.js +8 -6
  220. package/dist/extractors/styling/styledJsx.js.map +1 -1
  221. package/dist/extractors/styling/tailwind.d.ts +1 -1
  222. package/dist/extractors/styling/tailwind.d.ts.map +1 -1
  223. package/dist/extractors/styling/tailwind.js +22 -17
  224. package/dist/extractors/styling/tailwind.js.map +1 -1
  225. package/dist/extractors/vue/componentExtractor.d.ts +1 -1
  226. package/dist/extractors/vue/componentExtractor.d.ts.map +1 -1
  227. package/dist/extractors/vue/componentExtractor.js +97 -35
  228. package/dist/extractors/vue/componentExtractor.js.map +1 -1
  229. package/dist/index.d.ts +11 -9
  230. package/dist/index.d.ts.map +1 -1
  231. package/dist/index.js +5 -4
  232. package/dist/index.js.map +1 -1
  233. package/dist/types/UIFContract.d.ts.map +1 -1
  234. package/dist/types/UIFContract.js.map +1 -1
  235. package/dist/utils/cleanup.js +2 -2
  236. package/dist/utils/cleanup.js.map +1 -1
  237. package/dist/utils/codeSanitizer.d.ts.map +1 -1
  238. package/dist/utils/codeSanitizer.js +13 -7
  239. package/dist/utils/codeSanitizer.js.map +1 -1
  240. package/dist/utils/config.d.ts.map +1 -1
  241. package/dist/utils/config.js +4 -4
  242. package/dist/utils/config.js.map +1 -1
  243. package/dist/utils/debug.d.ts.map +1 -1
  244. package/dist/utils/debug.js.map +1 -1
  245. package/dist/utils/fileLock.d.ts.map +1 -1
  246. package/dist/utils/fileLock.js +3 -3
  247. package/dist/utils/fileLock.js.map +1 -1
  248. package/dist/utils/fsx.d.ts.map +1 -1
  249. package/dist/utils/fsx.js +4 -4
  250. package/dist/utils/fsx.js.map +1 -1
  251. package/dist/utils/git.d.ts.map +1 -1
  252. package/dist/utils/git.js +11 -7
  253. package/dist/utils/git.js.map +1 -1
  254. package/dist/utils/gitignore.d.ts.map +1 -1
  255. package/dist/utils/gitignore.js +11 -9
  256. package/dist/utils/gitignore.js.map +1 -1
  257. package/dist/utils/hash.d.ts.map +1 -1
  258. package/dist/utils/hash.js +18 -6
  259. package/dist/utils/hash.js.map +1 -1
  260. package/dist/utils/llmContext.d.ts.map +1 -1
  261. package/dist/utils/llmContext.js +1 -4
  262. package/dist/utils/llmContext.js.map +1 -1
  263. package/dist/utils/schemaValidator.d.ts.map +1 -1
  264. package/dist/utils/schemaValidator.js +10 -3
  265. package/dist/utils/schemaValidator.js.map +1 -1
  266. package/dist/utils/secretDetector.d.ts.map +1 -1
  267. package/dist/utils/secretDetector.js +13 -9
  268. package/dist/utils/secretDetector.js.map +1 -1
  269. package/dist/utils/stampignore.d.ts.map +1 -1
  270. package/dist/utils/stampignore.js +4 -4
  271. package/dist/utils/stampignore.js.map +1 -1
  272. package/dist/utils/tokens.d.ts +28 -26
  273. package/dist/utils/tokens.d.ts.map +1 -1
  274. package/dist/utils/tokens.js +97 -115
  275. package/dist/utils/tokens.js.map +1 -1
  276. package/package.json +11 -4
@@ -2,143 +2,125 @@
2
2
  * Token estimation utilities for GPT and Claude models
3
3
  * Uses character-based approximations by default
4
4
  *
5
- * For accurate token counts: These are included as optional dependencies in package.json.
6
- * npm automatically attempts to install them when installing logicstamp-context.
7
- * If installation succeeds, accurate token counts are used.
8
- * If installation fails or is skipped, falls back to character-based estimation.
9
- * - @dqbd/tiktoken for GPT models (gpt-4o encoding)
10
- * - @anthropic-ai/tokenizer for Claude (claude-3-5-sonnet-20241022 encoding)
5
+ * Optional tokenizers (package.json optionalDependencies; npm tries to install them):
6
+ * - @dqbd/tiktoken GPT-4o encoding; counts align with that tiktoken model when load succeeds.
7
+ * - @anthropic-ai/tokenizer Anthropic documents this as intended for older models; for Claude 3+
8
+ * it is only a rough approximation vs API tokenization. Prefer `usage` in API responses for billing.
9
+ * If installation fails or is skipped, falls back to character-based estimation (~4 chars/token GPT,
10
+ * ~4.5 Claude).
11
11
  */
12
- // Lazy-loaded tokenizers (only loaded if available)
13
- // Note: Tokenizers are intentionally cached as singletons - they're expensive to load
14
- // Use clearTokenizerCache() to free memory if needed in long-running processes
15
- let tiktokenEncoder = null;
16
- let anthropicTokenizer = null;
17
- let tiktokenLoaded = false;
18
- let anthropicLoaded = false;
19
- /**
20
- * Clear tokenizer caches to free memory
21
- * Note: Tokenizers will be reloaded on next use (expensive operation)
22
- * Only call this in long-running processes that need to minimize memory
23
- */
24
- export function clearTokenizerCache() {
25
- // Free the encoder if it has a free() method (tiktoken does)
26
- if (tiktokenEncoder && typeof tiktokenEncoder.free === 'function') {
27
- try {
28
- tiktokenEncoder.free();
29
- }
30
- catch {
31
- // Ignore errors during cleanup
32
- }
33
- }
12
+ /** Mutable tokenizer state lives on this class instead of module-level lets. */
13
+ export class TokenizerRuntime {
34
14
  tiktokenEncoder = null;
35
15
  anthropicTokenizer = null;
36
16
  tiktokenLoaded = false;
37
17
  anthropicLoaded = false;
38
- }
39
- /**
40
- * Try to load tiktoken encoder (lazy, only once)
41
- */
42
- async function loadTiktoken() {
43
- if (tiktokenLoaded) {
44
- return tiktokenEncoder !== null;
18
+ /**
19
+ * Free tokenizer memory. Tokenizers reload on next use (expensive).
20
+ * Use in long-running processes when you need to minimize memory.
21
+ */
22
+ clear() {
23
+ const enc = this.tiktokenEncoder;
24
+ if (enc && typeof enc.free === 'function') {
25
+ try {
26
+ enc.free();
27
+ }
28
+ catch {
29
+ // Ignore errors during cleanup
30
+ }
31
+ }
32
+ this.tiktokenEncoder = null;
33
+ this.anthropicTokenizer = null;
34
+ this.tiktokenLoaded = false;
35
+ this.anthropicLoaded = false;
45
36
  }
46
- tiktokenLoaded = true;
47
- try {
48
- const tiktoken = await import('@dqbd/tiktoken');
49
- // Try encoding_for_model first (preferred API)
50
- if (typeof tiktoken.encoding_for_model === 'function') {
51
- tiktokenEncoder = tiktoken.encoding_for_model('gpt-4o');
52
- return true;
37
+ async loadTiktoken() {
38
+ if (this.tiktokenLoaded) {
39
+ return this.tiktokenEncoder !== null;
53
40
  }
54
- // Fallback to get_encoding if available
55
- if (typeof tiktoken.get_encoding === 'function') {
56
- tiktokenEncoder = tiktoken.get_encoding('cl100k_base');
57
- return true;
41
+ this.tiktokenLoaded = true;
42
+ try {
43
+ const tiktoken = await import('@dqbd/tiktoken');
44
+ if (typeof tiktoken.encoding_for_model === 'function') {
45
+ this.tiktokenEncoder = tiktoken.encoding_for_model('gpt-4o');
46
+ return true;
47
+ }
48
+ if (typeof tiktoken.get_encoding === 'function') {
49
+ this.tiktokenEncoder = tiktoken.get_encoding('cl100k_base');
50
+ return true;
51
+ }
52
+ return false;
58
53
  }
59
- // If neither method exists, tokenizer not usable
60
- return false;
61
- }
62
- catch (error) {
63
- // tiktoken not installed - use fallback
64
- return false;
65
- }
66
- }
67
- /**
68
- * Try to load Anthropic tokenizer (lazy, only once)
69
- */
70
- async function loadAnthropicTokenizer() {
71
- if (anthropicLoaded) {
72
- return anthropicTokenizer !== null;
73
- }
74
- anthropicLoaded = true;
75
- try {
76
- const tokenizer = await import('@anthropic-ai/tokenizer');
77
- // @anthropic-ai/tokenizer exports countTokens as a named export
78
- if (typeof tokenizer.countTokens === 'function') {
79
- anthropicTokenizer = tokenizer;
80
- return true;
54
+ catch {
55
+ return false;
81
56
  }
82
- // If countTokens not available, tokenizer not usable
83
- return false;
84
57
  }
85
- catch (error) {
86
- // tokenizer not installed - use fallback
87
- return false;
88
- }
89
- }
90
- /**
91
- * Estimate GPT-4 tokens
92
- * Uses @dqbd/tiktoken if available, otherwise falls back to character-based approximation
93
- */
94
- export async function estimateGPT4Tokens(text) {
95
- const hasTiktoken = await loadTiktoken();
96
- if (hasTiktoken && tiktokenEncoder) {
58
+ async loadAnthropicTokenizer() {
59
+ if (this.anthropicLoaded) {
60
+ return this.anthropicTokenizer !== null;
61
+ }
62
+ this.anthropicLoaded = true;
97
63
  try {
98
- return tiktokenEncoder.encode(text).length;
64
+ const tokenizer = await import('@anthropic-ai/tokenizer');
65
+ if (typeof tokenizer.countTokens === 'function') {
66
+ this.anthropicTokenizer = tokenizer;
67
+ return true;
68
+ }
69
+ return false;
99
70
  }
100
- catch (error) {
101
- // Fall through to character-based estimation
71
+ catch {
72
+ return false;
102
73
  }
103
74
  }
104
- // Fallback: character-based approximation
105
- // GPT-4 typically uses ~4 characters per token for code/JSON
106
- return Math.ceil(text.length / 4);
107
- }
108
- /**
109
- * Estimate Claude tokens
110
- * Uses @anthropic-ai/tokenizer if available, otherwise falls back to character-based approximation
111
- */
112
- export async function estimateClaudeTokens(text) {
113
- const hasTokenizer = await loadAnthropicTokenizer();
114
- if (hasTokenizer && anthropicTokenizer) {
115
- try {
116
- // @anthropic-ai/tokenizer exports countTokens as a named export
117
- if (typeof anthropicTokenizer.countTokens === 'function') {
118
- return anthropicTokenizer.countTokens(text);
75
+ async estimateGPT4Tokens(text) {
76
+ const hasTiktoken = await this.loadTiktoken();
77
+ const encoder = this.tiktokenEncoder;
78
+ if (hasTiktoken && encoder && typeof encoder.encode === 'function') {
79
+ try {
80
+ return encoder.encode(text).length;
81
+ }
82
+ catch {
83
+ // Fall through to character-based estimation
119
84
  }
120
85
  }
121
- catch (error) {
122
- // Fall through to character-based estimation
86
+ return Math.ceil(text.length / 4);
87
+ }
88
+ async estimateClaudeTokens(text) {
89
+ const hasTokenizer = await this.loadAnthropicTokenizer();
90
+ if (hasTokenizer && this.anthropicTokenizer?.countTokens) {
91
+ try {
92
+ return this.anthropicTokenizer.countTokens(text);
93
+ }
94
+ catch {
95
+ // Fall through to character-based estimation
96
+ }
123
97
  }
98
+ return Math.ceil(text.length / 4.5);
99
+ }
100
+ async getTokenizerStatus() {
101
+ const gpt4 = await this.loadTiktoken();
102
+ const claude = await this.loadAnthropicTokenizer();
103
+ return { gpt4, claude };
124
104
  }
125
- // Fallback: character-based approximation
126
- // Claude typically uses ~4.5 characters per token for code/JSON
127
- return Math.ceil(text.length / 4.5);
128
105
  }
129
- /**
130
- * Format token count with commas for readability
131
- */
106
+ const defaultTokenizerRuntime = new TokenizerRuntime();
107
+ /** @internal For tests or alternate lifetimes; CLI uses {@link defaultTokenizerRuntime}. */
108
+ export function createTokenizerRuntime() {
109
+ return new TokenizerRuntime();
110
+ }
111
+ export function clearTokenizerCache() {
112
+ defaultTokenizerRuntime.clear();
113
+ }
114
+ export async function estimateGPT4Tokens(text) {
115
+ return defaultTokenizerRuntime.estimateGPT4Tokens(text);
116
+ }
117
+ export async function estimateClaudeTokens(text) {
118
+ return defaultTokenizerRuntime.estimateClaudeTokens(text);
119
+ }
132
120
  export function formatTokenCount(count) {
133
121
  return count.toLocaleString();
134
122
  }
135
- /**
136
- * Check if tokenizers are available
137
- * Returns status for both GPT-4 and Claude tokenizers
138
- */
139
123
  export async function getTokenizerStatus() {
140
- const gpt4 = await loadTiktoken();
141
- const claude = await loadAnthropicTokenizer();
142
- return { gpt4, claude };
124
+ return defaultTokenizerRuntime.getTokenizerStatus();
143
125
  }
144
126
  //# sourceMappingURL=tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,16 +1,19 @@
1
1
  {
2
2
  "name": "logicstamp-context",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "description": "The context compiler for TypeScript. Compile your codebase into deterministic architectural contracts and dependency graphs for AI coding workflows.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "exports": {
9
- ".": "./dist/index.js"
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
10
13
  },
11
14
  "bin": {
12
- "logicstamp-context": "dist/cli/stamp.js",
13
- "stamp": "dist/cli/stamp.js"
15
+ "logicstamp-context": "./dist/cli/stamp.js",
16
+ "stamp": "./dist/cli/stamp.js"
14
17
  },
15
18
  "files": [
16
19
  "dist",
@@ -21,6 +24,9 @@
21
24
  ],
22
25
  "scripts": {
23
26
  "build": "tsc",
27
+ "lint": "biome lint src tests vitest.config.ts",
28
+ "lint:fix": "biome lint --write src tests vitest.config.ts",
29
+ "format": "biome format --write src tests biome.json package.json tsconfig.json vitest.config.ts",
24
30
  "prepublishOnly": "npm run build",
25
31
  "test": "vitest run",
26
32
  "test:watch": "vitest",
@@ -73,6 +79,7 @@
73
79
  "@dqbd/tiktoken": "^1.0.17"
74
80
  },
75
81
  "devDependencies": {
82
+ "@biomejs/biome": "^2.4.11",
76
83
  "@types/node": "^20.19.27",
77
84
  "@vitest/coverage-v8": "^4.0.16",
78
85
  "@vitest/ui": "^4.0.16",