byterover-cli 0.4.1 → 1.0.1

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 (474) hide show
  1. package/README.md +1 -9
  2. package/dist/commands/curate.d.ts +1 -3
  3. package/dist/commands/curate.js +14 -51
  4. package/dist/commands/main.d.ts +8 -0
  5. package/dist/commands/main.js +29 -8
  6. package/dist/commands/query.d.ts +1 -3
  7. package/dist/commands/query.js +8 -35
  8. package/dist/config/context-tree-domains.d.ts +5 -0
  9. package/dist/config/context-tree-domains.js +6 -1
  10. package/dist/config/environment.js +9 -9
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.js +18 -0
  13. package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
  14. package/dist/core/domain/cipher/agent/agent-info.js +143 -0
  15. package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
  16. package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
  17. package/dist/core/domain/cipher/agent/index.d.ts +4 -1
  18. package/dist/core/domain/cipher/agent/index.js +7 -1
  19. package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
  20. package/dist/core/domain/cipher/agent-events/types.js +11 -0
  21. package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
  22. package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
  23. package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
  24. package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
  25. package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
  26. package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
  27. package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
  28. package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
  29. package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
  30. package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
  31. package/dist/core/domain/cipher/llm/error-codes.js +51 -0
  32. package/dist/core/domain/cipher/llm/index.d.ts +9 -0
  33. package/dist/core/domain/cipher/llm/index.js +13 -0
  34. package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
  35. package/dist/core/domain/cipher/llm/registry.js +244 -0
  36. package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
  37. package/dist/core/domain/cipher/llm/schemas.js +151 -0
  38. package/dist/core/domain/cipher/llm/types.d.ts +121 -0
  39. package/dist/core/domain/cipher/llm/types.js +60 -0
  40. package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
  41. package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
  42. package/dist/core/domain/cipher/streaming/types.js +16 -0
  43. package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
  44. package/dist/core/domain/cipher/todos/types.d.ts +34 -0
  45. package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
  46. package/dist/core/domain/cipher/tools/constants.js +5 -2
  47. package/dist/core/domain/cipher/tools/types.d.ts +31 -0
  48. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  49. package/dist/core/domain/errors/connection-error.js +54 -0
  50. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  51. package/dist/core/domain/errors/core-process-error.js +43 -0
  52. package/dist/core/domain/errors/task-error.d.ts +64 -0
  53. package/dist/core/domain/errors/task-error.js +116 -0
  54. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  55. package/dist/core/domain/errors/transport-error.js +114 -0
  56. package/dist/core/domain/instance/index.d.ts +1 -0
  57. package/dist/core/domain/instance/index.js +1 -0
  58. package/dist/core/domain/instance/types.d.ts +57 -0
  59. package/dist/core/domain/instance/types.js +72 -0
  60. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  61. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  62. package/dist/core/domain/transport/index.d.ts +2 -0
  63. package/dist/core/domain/transport/index.js +2 -0
  64. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  65. package/dist/core/domain/transport/schemas.js +554 -0
  66. package/dist/core/domain/transport/types.d.ts +67 -0
  67. package/dist/core/domain/transport/types.js +7 -0
  68. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  69. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  70. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  71. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  72. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  73. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  74. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  75. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  76. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  77. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  79. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  80. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  81. package/dist/core/interfaces/cipher/index.js +11 -0
  82. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  83. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  84. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  85. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  86. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  87. package/dist/core/interfaces/cipher/message-types.js +6 -0
  88. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  89. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  90. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  91. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  92. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  93. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  94. package/dist/core/interfaces/executor/index.d.ts +2 -0
  95. package/dist/core/interfaces/executor/index.js +2 -0
  96. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  97. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  98. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  99. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  100. package/dist/core/interfaces/instance/index.d.ts +2 -0
  101. package/dist/core/interfaces/instance/index.js +2 -0
  102. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  103. package/dist/core/interfaces/noop-implementations.js +62 -0
  104. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  105. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  106. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  107. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  108. package/dist/core/interfaces/transport/index.d.ts +2 -0
  109. package/dist/core/interfaces/transport/index.js +2 -0
  110. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  111. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  112. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  113. package/dist/infra/cipher/agent/agent-error.js +79 -0
  114. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  115. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  116. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  117. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  118. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  119. package/dist/infra/cipher/agent/base-agent.js +240 -0
  120. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  121. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  122. package/dist/infra/cipher/agent/index.d.ts +22 -0
  123. package/dist/infra/cipher/agent/index.js +24 -0
  124. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  125. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  126. package/dist/infra/cipher/agent/types.d.ts +35 -0
  127. package/dist/infra/cipher/agent/types.js +1 -0
  128. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  129. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  130. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  131. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  132. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  133. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  134. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  135. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  136. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  137. package/dist/infra/cipher/consumer/index.js +2 -1
  138. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  139. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  140. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  141. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  142. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  143. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  144. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  145. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  146. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  147. package/dist/infra/cipher/interactive-loop.js +41 -33
  148. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  149. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  150. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  151. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  152. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  153. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  154. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  155. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  156. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  157. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  158. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  159. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  160. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  161. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  162. package/dist/infra/cipher/llm/context/utils.js +17 -4
  163. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  164. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  165. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  166. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  167. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  168. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  169. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  170. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  171. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  172. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  173. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  174. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  175. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  176. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  177. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  178. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  179. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  180. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  181. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  182. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  183. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  184. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  185. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  186. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  187. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  188. package/dist/infra/cipher/process/command-validator.js +75 -0
  189. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  190. package/dist/infra/cipher/process/path-utils.js +94 -0
  191. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  192. package/dist/infra/cipher/process/process-service.js +98 -17
  193. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  194. package/dist/infra/cipher/session/chat-session.js +163 -13
  195. package/dist/infra/cipher/session/index.d.ts +1 -0
  196. package/dist/infra/cipher/session/index.js +2 -0
  197. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  198. package/dist/infra/cipher/session/message-queue.js +90 -0
  199. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  200. package/dist/infra/cipher/session/session-manager.js +254 -7
  201. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  202. package/dist/infra/cipher/session/session-status.js +184 -0
  203. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  204. package/dist/infra/cipher/session/title-generator.js +31 -0
  205. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  206. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  207. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  208. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  209. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  210. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  211. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  212. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  213. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  214. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  215. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  216. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  217. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  218. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  219. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  220. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  221. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  222. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  223. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  224. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  225. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  226. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  227. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  228. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  229. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  230. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  231. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  232. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  233. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  234. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  235. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  236. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  237. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  238. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  239. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  240. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  241. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  242. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  243. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  244. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  245. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  246. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  247. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  249. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  250. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  251. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  252. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  253. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  254. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  255. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  256. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  257. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  258. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  259. package/dist/infra/cipher/tools/index.d.ts +1 -1
  260. package/dist/infra/cipher/tools/index.js +1 -1
  261. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  262. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  263. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  264. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  265. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  266. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  267. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  268. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  269. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  270. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  271. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  272. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  273. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  274. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  275. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  276. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  277. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  278. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  279. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  280. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  281. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  282. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  283. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  284. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  285. package/dist/infra/context-tree/path-utils.js +7 -0
  286. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  287. package/dist/infra/core/executors/curate-executor.js +123 -0
  288. package/dist/infra/core/executors/index.d.ts +2 -0
  289. package/dist/infra/core/executors/index.js +2 -0
  290. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  291. package/dist/infra/core/executors/query-executor.js +51 -0
  292. package/dist/infra/core/task-processor.d.ts +81 -0
  293. package/dist/infra/core/task-processor.js +115 -0
  294. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  295. package/dist/infra/instance/file-instance-discovery.js +84 -0
  296. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  297. package/dist/infra/instance/file-instance-manager.js +123 -0
  298. package/dist/infra/instance/index.d.ts +3 -0
  299. package/dist/infra/instance/index.js +3 -0
  300. package/dist/infra/instance/process-utils.d.ts +14 -0
  301. package/dist/infra/instance/process-utils.js +39 -0
  302. package/dist/infra/process/agent-worker.d.ts +20 -0
  303. package/dist/infra/process/agent-worker.js +602 -0
  304. package/dist/infra/process/index.d.ts +12 -0
  305. package/dist/infra/process/index.js +11 -0
  306. package/dist/infra/process/ipc-types.d.ts +55 -0
  307. package/dist/infra/process/ipc-types.js +12 -0
  308. package/dist/infra/process/process-manager.d.ts +154 -0
  309. package/dist/infra/process/process-manager.js +471 -0
  310. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  311. package/dist/infra/process/task-queue-manager.js +226 -0
  312. package/dist/infra/process/transport-handlers.d.ts +124 -0
  313. package/dist/infra/process/transport-handlers.js +348 -0
  314. package/dist/infra/process/transport-worker.d.ts +20 -0
  315. package/dist/infra/process/transport-worker.js +168 -0
  316. package/dist/infra/repl/commands/curate-command.js +0 -5
  317. package/dist/infra/repl/commands/query-command.js +0 -3
  318. package/dist/infra/repl/repl-startup.d.ts +4 -0
  319. package/dist/infra/repl/repl-startup.js +8 -1
  320. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  321. package/dist/infra/repl/transport-client-helper.js +96 -0
  322. package/dist/infra/transport/index.d.ts +4 -0
  323. package/dist/infra/transport/index.js +4 -0
  324. package/dist/infra/transport/port-utils.d.ts +42 -0
  325. package/dist/infra/transport/port-utils.js +84 -0
  326. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  327. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  328. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  329. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  330. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  331. package/dist/infra/transport/transport-client-factory.js +168 -0
  332. package/dist/infra/transport/transport-factory.d.ts +33 -0
  333. package/dist/infra/transport/transport-factory.js +59 -0
  334. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  335. package/dist/infra/usecase/curate-use-case.js +71 -262
  336. package/dist/infra/usecase/init-use-case.js +3 -2
  337. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  338. package/dist/infra/usecase/query-use-case.js +250 -326
  339. package/dist/infra/usecase/status-use-case.js +1 -1
  340. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  341. package/dist/resources/prompts/explore.yml +78 -0
  342. package/dist/resources/prompts/plan.yml +114 -0
  343. package/dist/resources/prompts/reflection.yml +1 -1
  344. package/dist/resources/prompts/system-prompt.yml +15 -8
  345. package/dist/resources/prompts/tool-outputs.yml +0 -5
  346. package/dist/resources/tools/bash_exec.txt +98 -0
  347. package/dist/resources/tools/bash_output.txt +40 -0
  348. package/dist/resources/tools/batch.txt +28 -0
  349. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  350. package/dist/resources/tools/curate.txt +22 -0
  351. package/dist/resources/tools/delete_memory.txt +1 -0
  352. package/dist/resources/tools/detect_domains.txt +11 -0
  353. package/dist/resources/tools/edit_file.txt +1 -0
  354. package/dist/resources/tools/edit_memory.txt +1 -0
  355. package/dist/resources/tools/glob_files.txt +20 -0
  356. package/dist/resources/tools/grep_content.txt +18 -0
  357. package/dist/resources/tools/kill_process.txt +16 -0
  358. package/dist/resources/tools/list_directory.txt +16 -0
  359. package/dist/resources/tools/list_memories.txt +1 -0
  360. package/dist/resources/tools/read_file.txt +31 -0
  361. package/dist/resources/tools/read_memory.txt +1 -0
  362. package/dist/resources/tools/read_todos.txt +17 -0
  363. package/dist/resources/tools/search_history.txt +1 -0
  364. package/dist/resources/tools/task.txt +23 -0
  365. package/dist/resources/tools/write_file.txt +1 -0
  366. package/dist/resources/tools/write_memory.txt +1 -0
  367. package/dist/resources/tools/write_todos.txt +29 -0
  368. package/dist/tui/app.js +9 -13
  369. package/dist/tui/components/command-details.d.ts +14 -0
  370. package/dist/tui/components/command-details.js +35 -0
  371. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  372. package/dist/tui/components/execution/execution-changes.js +19 -4
  373. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  374. package/dist/tui/components/execution/execution-content.js +26 -13
  375. package/dist/tui/components/execution/execution-input.js +3 -3
  376. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  377. package/dist/tui/components/execution/execution-progress.js +8 -6
  378. package/dist/tui/components/execution/log-item.d.ts +3 -4
  379. package/dist/tui/components/execution/log-item.js +2 -5
  380. package/dist/tui/components/footer.js +9 -4
  381. package/dist/tui/components/header.d.ts +3 -3
  382. package/dist/tui/components/header.js +5 -3
  383. package/dist/tui/components/index.d.ts +1 -0
  384. package/dist/tui/components/index.js +1 -0
  385. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  386. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  387. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  388. package/dist/tui/components/scrollable-list.js +12 -10
  389. package/dist/tui/components/suggestions.js +39 -41
  390. package/dist/tui/components/tab-bar.d.ts +2 -1
  391. package/dist/tui/components/tab-bar.js +3 -4
  392. package/dist/tui/constants.d.ts +0 -5
  393. package/dist/tui/constants.js +0 -5
  394. package/dist/tui/contexts/auth-context.js +9 -2
  395. package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
  396. package/dist/tui/contexts/index.d.ts +6 -1
  397. package/dist/tui/contexts/index.js +6 -1
  398. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  399. package/dist/tui/contexts/onboarding-context.js +9 -9
  400. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  401. package/dist/tui/contexts/tasks-context.js +218 -0
  402. package/dist/tui/contexts/transport-context.d.ts +29 -0
  403. package/dist/tui/contexts/transport-context.js +82 -0
  404. package/dist/tui/hooks/index.d.ts +10 -6
  405. package/dist/tui/hooks/index.js +7 -6
  406. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  407. package/dist/tui/hooks/use-activity-logs.js +87 -34
  408. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  409. package/dist/tui/hooks/use-auth-polling.js +104 -0
  410. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  411. package/dist/tui/hooks/use-slash-completion.js +1 -1
  412. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  413. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  414. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  415. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  416. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  417. package/dist/tui/hooks/use-ui-heights.js +88 -0
  418. package/dist/tui/providers/app-providers.js +2 -6
  419. package/dist/tui/types/commands.d.ts +0 -26
  420. package/dist/tui/types/index.d.ts +1 -1
  421. package/dist/tui/types/ui.d.ts +9 -4
  422. package/dist/tui/utils/line.d.ts +11 -0
  423. package/dist/tui/utils/line.js +16 -0
  424. package/dist/tui/utils/log.d.ts +27 -0
  425. package/dist/tui/utils/log.js +114 -0
  426. package/dist/tui/views/command-view.d.ts +7 -0
  427. package/dist/tui/views/command-view.js +103 -80
  428. package/dist/tui/views/login-view.js +7 -4
  429. package/dist/tui/views/logs-view.d.ts +13 -0
  430. package/dist/tui/views/logs-view.js +27 -52
  431. package/dist/utils/connection-error-handler.d.ts +16 -0
  432. package/dist/utils/connection-error-handler.js +49 -0
  433. package/dist/utils/crash-log.d.ts +14 -0
  434. package/dist/utils/crash-log.js +19 -0
  435. package/dist/utils/file-helpers.d.ts +14 -0
  436. package/dist/utils/file-helpers.js +21 -0
  437. package/dist/utils/global-logs-path.d.ts +11 -0
  438. package/dist/utils/global-logs-path.js +37 -0
  439. package/dist/utils/process-logger.d.ts +53 -0
  440. package/dist/utils/process-logger.js +253 -0
  441. package/dist/utils/sandbox-detector.d.ts +31 -0
  442. package/dist/utils/sandbox-detector.js +122 -0
  443. package/oclif.manifest.json +10 -198
  444. package/package.json +5 -1
  445. package/dist/commands/cipher-agent/run.d.ts +0 -142
  446. package/dist/commands/cipher-agent/run.js +0 -555
  447. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  448. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  449. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  450. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  451. package/dist/commands/foo.d.ts +0 -14
  452. package/dist/commands/foo.js +0 -66
  453. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  454. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  455. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  456. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  457. package/dist/infra/cipher/cipher-agent.js +0 -317
  458. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  459. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  460. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  461. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  462. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  463. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  464. package/dist/tui/contexts/consumer.d.ts +0 -31
  465. package/dist/tui/contexts/consumer.js +0 -56
  466. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  467. package/dist/tui/hooks/use-consumer.js +0 -50
  468. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  469. package/dist/tui/hooks/use-queue-polling.js +0 -90
  470. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  471. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  472. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  473. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  474. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Stream Processor
3
+ *
4
+ * Handles granular LLM stream processing following the OpenCode pattern.
5
+ * Provides real-time event emission for streaming text, tool calls, and step tracking.
6
+ *
7
+ * Key features:
8
+ * - Delta-based text updates for responsive UI
9
+ * - Tool call lifecycle tracking (pending → running → completed/error)
10
+ * - Step-level cost and token tracking
11
+ * - Part creation and updates with unique IDs
12
+ */
13
+ /**
14
+ * Stream Processor class.
15
+ *
16
+ * Processes streaming events from LLM providers and emits granular events
17
+ * for real-time UI updates. Follows the OpenCode pattern of part-based
18
+ * message construction with delta updates.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const processor = new StreamProcessor()
23
+ *
24
+ * const state = await processor.process(streamEvents, {
25
+ * eventBus: sessionEventBus,
26
+ * generateId: () => crypto.randomUUID(),
27
+ * sessionId: 'session-123',
28
+ * })
29
+ *
30
+ * console.log('Accumulated text:', state.textContent)
31
+ * console.log('Parts created:', state.parts.length)
32
+ * ```
33
+ */
34
+ export class StreamProcessor {
35
+ /**
36
+ * Process a stream of events and emit granular updates.
37
+ *
38
+ * @param stream - Async iterable of stream events
39
+ * @param context - Processing context with event bus and utilities
40
+ * @returns Final processor state with accumulated parts
41
+ */
42
+ async process(stream, context) {
43
+ const state = {
44
+ currentStepIndex: 0,
45
+ parts: [],
46
+ textContent: '',
47
+ toolParts: new Map(),
48
+ };
49
+ for await (const event of stream) {
50
+ await this.handleEvent(event, state, context);
51
+ }
52
+ return state;
53
+ }
54
+ /**
55
+ * Finalize text part if there's accumulated content.
56
+ */
57
+ finalizeTextPart(state, context) {
58
+ if (state.textContent.length > 0) {
59
+ const textPart = {
60
+ text: state.textContent,
61
+ type: 'text',
62
+ };
63
+ state.parts.push(textPart);
64
+ // Emit final chunk
65
+ context.eventBus.emit('llmservice:chunk', {
66
+ content: '',
67
+ isComplete: true,
68
+ type: 'text',
69
+ });
70
+ }
71
+ }
72
+ /**
73
+ * Handle a single stream event.
74
+ */
75
+ async handleEvent(event, state, context) {
76
+ switch (event.type) {
77
+ case 'finish': {
78
+ // Finalize any pending text part
79
+ this.finalizeTextPart(state, context);
80
+ break;
81
+ }
82
+ case 'reasoning-delta': {
83
+ // Emit reasoning chunk for UI streaming
84
+ context.eventBus.emit('llmservice:chunk', {
85
+ content: event.delta,
86
+ type: 'reasoning',
87
+ });
88
+ break;
89
+ }
90
+ case 'step-finish': {
91
+ this.handleStepFinish({
92
+ cost: event.cost,
93
+ finishReason: event.finishReason,
94
+ stepIndex: event.stepIndex,
95
+ tokens: event.tokens,
96
+ }, state, context);
97
+ break;
98
+ }
99
+ case 'step-start': {
100
+ this.handleStepStart(event.stepIndex, state, context);
101
+ break;
102
+ }
103
+ case 'text-delta': {
104
+ this.handleTextDelta(event.delta, state, context);
105
+ break;
106
+ }
107
+ case 'tool-call-complete': {
108
+ this.handleToolCallComplete(event.callId, event.output, state);
109
+ break;
110
+ }
111
+ case 'tool-call-error': {
112
+ this.handleToolCallError(event.callId, event.error, state);
113
+ break;
114
+ }
115
+ case 'tool-call-input': {
116
+ this.handleToolCallInput(event.callId, event.input, state);
117
+ break;
118
+ }
119
+ case 'tool-call-running': {
120
+ this.handleToolCallRunning(event.callId, state);
121
+ break;
122
+ }
123
+ case 'tool-call-start': {
124
+ this.handleToolCallStart(event.callId, event.toolName, state, context);
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ /**
130
+ * Handle step finish event.
131
+ */
132
+ handleStepFinish(options, state, context) {
133
+ const stepFinishPart = {
134
+ cost: options.cost,
135
+ finishReason: options.finishReason,
136
+ id: context.generateId(),
137
+ stepIndex: options.stepIndex,
138
+ timestamp: Date.now(),
139
+ tokens: options.tokens,
140
+ type: 'step_finish',
141
+ };
142
+ state.parts.push(stepFinishPart);
143
+ // Emit step finished event
144
+ context.eventBus.emit('step:finished', {
145
+ cost: options.cost,
146
+ finishReason: options.finishReason,
147
+ stepIndex: options.stepIndex,
148
+ tokens: options.tokens,
149
+ });
150
+ }
151
+ /**
152
+ * Handle step start event.
153
+ */
154
+ handleStepStart(stepIndex, state, context) {
155
+ state.currentStepIndex = stepIndex;
156
+ const stepStartPart = {
157
+ id: context.generateId(),
158
+ stepIndex,
159
+ timestamp: Date.now(),
160
+ type: 'step_start',
161
+ };
162
+ state.parts.push(stepStartPart);
163
+ // Emit step started event
164
+ context.eventBus.emit('step:started', {
165
+ stepIndex,
166
+ });
167
+ }
168
+ /**
169
+ * Handle text delta - accumulate and emit.
170
+ */
171
+ handleTextDelta(delta, state, context) {
172
+ state.textContent += delta;
173
+ // Emit chunk with delta for real-time UI update
174
+ context.eventBus.emit('llmservice:chunk', {
175
+ content: delta,
176
+ type: 'text',
177
+ });
178
+ }
179
+ /**
180
+ * Handle tool call completion.
181
+ */
182
+ handleToolCallComplete(callId, output, state) {
183
+ const toolPart = state.toolParts.get(callId);
184
+ if (toolPart && toolPart.state.status === 'running') {
185
+ const startTime = toolPart.state.startedAt;
186
+ toolPart.state = {
187
+ input: toolPart.state.input,
188
+ output,
189
+ status: 'completed',
190
+ time: {
191
+ end: Date.now(),
192
+ start: startTime,
193
+ },
194
+ };
195
+ }
196
+ }
197
+ /**
198
+ * Handle tool call error.
199
+ */
200
+ handleToolCallError(callId, error, state) {
201
+ const toolPart = state.toolParts.get(callId);
202
+ if (toolPart) {
203
+ const startTime = toolPart.state.status === 'running' ? toolPart.state.startedAt : Date.now();
204
+ toolPart.state = {
205
+ error,
206
+ input: toolPart.state.input,
207
+ status: 'error',
208
+ time: {
209
+ end: Date.now(),
210
+ start: startTime,
211
+ },
212
+ };
213
+ }
214
+ }
215
+ /**
216
+ * Handle tool call input received.
217
+ */
218
+ handleToolCallInput(callId, input, state) {
219
+ const toolPart = state.toolParts.get(callId);
220
+ if (toolPart && toolPart.state.status === 'pending') {
221
+ toolPart.state = {
222
+ input,
223
+ status: 'pending',
224
+ };
225
+ }
226
+ }
227
+ /**
228
+ * Handle tool call transition to running.
229
+ */
230
+ handleToolCallRunning(callId, state) {
231
+ const toolPart = state.toolParts.get(callId);
232
+ if (toolPart && toolPart.state.status === 'pending') {
233
+ toolPart.state = {
234
+ input: toolPart.state.input,
235
+ startedAt: Date.now(),
236
+ status: 'running',
237
+ };
238
+ }
239
+ }
240
+ /**
241
+ * Handle tool call start - create pending tool part.
242
+ */
243
+ handleToolCallStart(callId, toolName, state, context) {
244
+ // Finalize any pending text before tool call
245
+ this.finalizeTextPart(state, context);
246
+ state.textContent = '';
247
+ const toolPart = {
248
+ callId,
249
+ state: {
250
+ input: {},
251
+ status: 'pending',
252
+ },
253
+ toolName,
254
+ type: 'tool',
255
+ };
256
+ state.toolParts.set(callId, toolPart);
257
+ state.parts.push(toolPart);
258
+ // Emit tool call event
259
+ context.eventBus.emit('llmservice:toolCall', {
260
+ args: {},
261
+ callId,
262
+ toolName,
263
+ });
264
+ }
265
+ }
266
+ /**
267
+ * Helper to create a unique ID generator.
268
+ */
269
+ export function createIdGenerator() {
270
+ let counter = 0;
271
+ return () => `part-${Date.now()}-${++counter}`;
272
+ }
273
+ /**
274
+ * Singleton stream processor instance.
275
+ */
276
+ export const streamProcessor = new StreamProcessor();
@@ -1,44 +1,37 @@
1
1
  import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
2
2
  /**
3
- * Tokenizer for Anthropic Claude models - CURRENTLY USING APPROXIMATION.
3
+ * Tokenizer for Anthropic Claude models.
4
4
  *
5
- * This implementation uses a character-based approximation rather than
6
- * accurate token counting. This is a temporary solution due to the
7
- * complexity of integrating Anthropic's token counting API.
5
+ * Uses the LLM registry for model-specific character-per-token ratios,
6
+ * providing better estimation accuracy across different Claude models.
8
7
  *
9
- * Claude models use a tokenizer similar to GPT's, with approximately
10
- * 3.5-4 characters per token for English text. We use 3.5 as a middle ground.
8
+ * This implementation uses a character-based approximation rather than
9
+ * accurate token counting. The ratio is now model-aware via the registry.
11
10
  *
12
11
  * TODO: Consider these improvements:
13
- * 1. Use Anthropic's official token counting API (requires async handling or separate service)
12
+ * 1. Use Anthropic's official token counting API (requires async handling)
14
13
  * 2. Implement a WASM-based tokenizer for accurate synchronous counting
15
14
  * 3. Cache token counts for frequently used text
16
- * 4. Model-specific adjustments based on actual Claude tokenization patterns
17
15
  *
18
16
  * Reference: https://docs.anthropic.com/en/docs/about-claude/models
19
17
  */
20
18
  export declare class ClaudeTokenizer implements ITokenizer {
21
- private readonly modelName;
19
+ private readonly charsPerToken;
22
20
  /**
23
21
  * Creates a new Claude tokenizer instance.
24
22
  *
25
- * @param model - The Claude model name (e.g., 'claude-3-5-sonnet-20241022', 'claude-3-opus-20240229')
26
- * Currently not used for approximation, but stored for future improvements
23
+ * @param model - The Claude model name (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-sonnet-20241022')
24
+ * Used to look up model-specific token ratio from registry
27
25
  */
28
26
  constructor(model: string);
29
27
  /**
30
28
  * Approximates the token count for Anthropic Claude models.
31
29
  *
32
- * Uses a character-based approximation: ~3.5 characters per token.
33
- * This is based on Anthropic's documentation and common patterns for
34
- * English text with Claude's tokenizer.
30
+ * Uses model-specific character-per-token ratio from the LLM registry.
31
+ * Default for Claude models is ~3.5 characters per token.
35
32
  *
36
- * IMPORTANT: This is NOT accurate for Claude models and should be replaced
37
- * with a proper implementation when possible. The actual token count can vary
38
- * significantly based on:
39
- * - Language (non-English text may have different ratios)
40
- * - Content type (code vs prose)
41
- * - Special characters and formatting
33
+ * IMPORTANT: This is still an approximation. The actual token count can vary
34
+ * based on language, content type (code vs prose), and special characters.
42
35
  *
43
36
  * @param text - Text content to count tokens for
44
37
  * @returns Approximate number of tokens
@@ -1,45 +1,40 @@
1
+ import { DEFAULT_CHARS_PER_TOKEN, getCharsPerToken } from '../../../../core/domain/cipher/llm/index.js';
1
2
  /**
2
- * Tokenizer for Anthropic Claude models - CURRENTLY USING APPROXIMATION.
3
+ * Tokenizer for Anthropic Claude models.
3
4
  *
4
- * This implementation uses a character-based approximation rather than
5
- * accurate token counting. This is a temporary solution due to the
6
- * complexity of integrating Anthropic's token counting API.
5
+ * Uses the LLM registry for model-specific character-per-token ratios,
6
+ * providing better estimation accuracy across different Claude models.
7
7
  *
8
- * Claude models use a tokenizer similar to GPT's, with approximately
9
- * 3.5-4 characters per token for English text. We use 3.5 as a middle ground.
8
+ * This implementation uses a character-based approximation rather than
9
+ * accurate token counting. The ratio is now model-aware via the registry.
10
10
  *
11
11
  * TODO: Consider these improvements:
12
- * 1. Use Anthropic's official token counting API (requires async handling or separate service)
12
+ * 1. Use Anthropic's official token counting API (requires async handling)
13
13
  * 2. Implement a WASM-based tokenizer for accurate synchronous counting
14
14
  * 3. Cache token counts for frequently used text
15
- * 4. Model-specific adjustments based on actual Claude tokenization patterns
16
15
  *
17
16
  * Reference: https://docs.anthropic.com/en/docs/about-claude/models
18
17
  */
19
18
  export class ClaudeTokenizer {
20
- modelName;
19
+ charsPerToken;
21
20
  /**
22
21
  * Creates a new Claude tokenizer instance.
23
22
  *
24
- * @param model - The Claude model name (e.g., 'claude-3-5-sonnet-20241022', 'claude-3-opus-20240229')
25
- * Currently not used for approximation, but stored for future improvements
23
+ * @param model - The Claude model name (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-sonnet-20241022')
24
+ * Used to look up model-specific token ratio from registry
26
25
  */
27
26
  constructor(model) {
28
- this.modelName = model;
27
+ // Look up model-specific ratio from registry, fallback to default
28
+ this.charsPerToken = getCharsPerToken('claude', model) ?? DEFAULT_CHARS_PER_TOKEN;
29
29
  }
30
30
  /**
31
31
  * Approximates the token count for Anthropic Claude models.
32
32
  *
33
- * Uses a character-based approximation: ~3.5 characters per token.
34
- * This is based on Anthropic's documentation and common patterns for
35
- * English text with Claude's tokenizer.
33
+ * Uses model-specific character-per-token ratio from the LLM registry.
34
+ * Default for Claude models is ~3.5 characters per token.
36
35
  *
37
- * IMPORTANT: This is NOT accurate for Claude models and should be replaced
38
- * with a proper implementation when possible. The actual token count can vary
39
- * significantly based on:
40
- * - Language (non-English text may have different ratios)
41
- * - Content type (code vs prose)
42
- * - Special characters and formatting
36
+ * IMPORTANT: This is still an approximation. The actual token count can vary
37
+ * based on language, content type (code vs prose), and special characters.
43
38
  *
44
39
  * @param text - Text content to count tokens for
45
40
  * @returns Approximate number of tokens
@@ -48,8 +43,6 @@ export class ClaudeTokenizer {
48
43
  if (!text) {
49
44
  return 0;
50
45
  }
51
- // Approximation: ~3.5 characters per token
52
- // Claude's tokenizer is similar to GPT's, typically more efficient than 4 chars/token
53
- return Math.ceil(text.length / 3.5);
46
+ return Math.ceil(text.length / this.charsPerToken);
54
47
  }
55
48
  }
@@ -1,34 +1,35 @@
1
1
  import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
2
2
  /**
3
- * Tokenizer for Google Gemini models - CURRENTLY USING APPROXIMATION.
3
+ * Tokenizer for Google Gemini models.
4
+ *
5
+ * Uses the LLM registry for model-specific character-per-token ratios,
6
+ * providing better estimation accuracy across different Gemini models.
4
7
  *
5
8
  * This implementation uses a character-based approximation rather than
6
- * accurate token counting. This is a temporary solution due to the
7
- * asynchronous nature of the official Gemini countTokens API.
9
+ * accurate token counting. The ratio is now model-aware via the registry.
8
10
  *
9
11
  * TODO: Consider these improvements:
10
12
  * 1. Use the official @google/genai countTokens method (requires async handling)
11
13
  * 2. Implement a WASM-based tokenizer for accurate synchronous counting
12
14
  * 3. Cache token counts for frequently used text
13
- * 4. Model-specific adjustments based on actual Gemini tokenization patterns
14
15
  */
15
16
  export declare class GeminiTokenizer implements ITokenizer {
16
- private readonly modelName;
17
+ private readonly charsPerToken;
17
18
  /**
18
19
  * Creates a new Gemini tokenizer instance.
19
20
  *
20
- * @param model - The Gemini model name (e.g., 'gemini-2.5-flash', 'gemini-pro')
21
- * Currently not used for approximation, but stored for future improvements
21
+ * @param model - The Gemini model name (e.g., 'gemini-2.0-flash', 'gemini-1.5-pro')
22
+ * Used to look up model-specific token ratio from registry
22
23
  */
23
24
  constructor(model: string);
24
25
  /**
25
26
  * Approximates the token count for Google Gemini models.
26
27
  *
27
- * Uses a rough character-based approximation: ~4 characters per token.
28
- * This is based on common estimates for English text with modern tokenizers.
28
+ * Uses model-specific character-per-token ratio from the LLM registry.
29
+ * Default for Gemini models is ~4 characters per token.
29
30
  *
30
- * IMPORTANT: This is NOT accurate for Gemini models and should be replaced
31
- * with a proper implementation when possible.
31
+ * IMPORTANT: This is still an approximation. The actual token count can vary
32
+ * based on language, content type (code vs prose), and special characters.
32
33
  *
33
34
  * @param text - Text content to count tokens for
34
35
  * @returns Approximate number of tokens
@@ -1,35 +1,38 @@
1
+ import { DEFAULT_CHARS_PER_TOKEN, getCharsPerToken } from '../../../../core/domain/cipher/llm/index.js';
1
2
  /**
2
- * Tokenizer for Google Gemini models - CURRENTLY USING APPROXIMATION.
3
+ * Tokenizer for Google Gemini models.
4
+ *
5
+ * Uses the LLM registry for model-specific character-per-token ratios,
6
+ * providing better estimation accuracy across different Gemini models.
3
7
  *
4
8
  * This implementation uses a character-based approximation rather than
5
- * accurate token counting. This is a temporary solution due to the
6
- * asynchronous nature of the official Gemini countTokens API.
9
+ * accurate token counting. The ratio is now model-aware via the registry.
7
10
  *
8
11
  * TODO: Consider these improvements:
9
12
  * 1. Use the official @google/genai countTokens method (requires async handling)
10
13
  * 2. Implement a WASM-based tokenizer for accurate synchronous counting
11
14
  * 3. Cache token counts for frequently used text
12
- * 4. Model-specific adjustments based on actual Gemini tokenization patterns
13
15
  */
14
16
  export class GeminiTokenizer {
15
- modelName;
17
+ charsPerToken;
16
18
  /**
17
19
  * Creates a new Gemini tokenizer instance.
18
20
  *
19
- * @param model - The Gemini model name (e.g., 'gemini-2.5-flash', 'gemini-pro')
20
- * Currently not used for approximation, but stored for future improvements
21
+ * @param model - The Gemini model name (e.g., 'gemini-2.0-flash', 'gemini-1.5-pro')
22
+ * Used to look up model-specific token ratio from registry
21
23
  */
22
24
  constructor(model) {
23
- this.modelName = model;
25
+ // Look up model-specific ratio from registry, fallback to default
26
+ this.charsPerToken = getCharsPerToken('gemini', model) ?? DEFAULT_CHARS_PER_TOKEN;
24
27
  }
25
28
  /**
26
29
  * Approximates the token count for Google Gemini models.
27
30
  *
28
- * Uses a rough character-based approximation: ~4 characters per token.
29
- * This is based on common estimates for English text with modern tokenizers.
31
+ * Uses model-specific character-per-token ratio from the LLM registry.
32
+ * Default for Gemini models is ~4 characters per token.
30
33
  *
31
- * IMPORTANT: This is NOT accurate for Gemini models and should be replaced
32
- * with a proper implementation when possible.
34
+ * IMPORTANT: This is still an approximation. The actual token count can vary
35
+ * based on language, content type (code vs prose), and special characters.
33
36
  *
34
37
  * @param text - Text content to count tokens for
35
38
  * @returns Approximate number of tokens
@@ -38,8 +41,6 @@ export class GeminiTokenizer {
38
41
  if (!text) {
39
42
  return 0;
40
43
  }
41
- // Rough approximation: ~4 characters per token
42
- // This is a simplified heuristic and varies by language and content type
43
- return Math.ceil(text.length / 4);
44
+ return Math.ceil(text.length / this.charsPerToken);
44
45
  }
45
46
  }
@@ -3,18 +3,26 @@ import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.
3
3
  * Tokenizer for OpenRouter API.
4
4
  *
5
5
  * OpenRouter supports multiple model providers (OpenAI, Anthropic, etc.),
6
- * each with different tokenization schemes. This tokenizer provides a
7
- * generic approximation that works reasonably well across different models.
6
+ * each with different tokenization schemes. This tokenizer uses the LLM
7
+ * registry to look up model-specific character-per-token ratios when available.
8
8
  *
9
- * For more accurate token counting, model-specific tokenizers could be
10
- * implemented based on the selected model's provider.
9
+ * For models not in the registry, falls back to a generic approximation
10
+ * that works reasonably well across different model providers.
11
11
  */
12
12
  export declare class OpenRouterTokenizer implements ITokenizer {
13
+ private readonly charsPerToken;
13
14
  /**
14
- * Approximates token count using a character-based heuristic.
15
+ * Creates a new OpenRouter tokenizer instance.
15
16
  *
16
- * Uses ~4 characters per token, which is a common approximation
17
- * for modern tokenizers (GPT, Claude, Gemini, etc.).
17
+ * @param model - The OpenRouter model name (e.g., 'anthropic/claude-sonnet-4', 'openai/gpt-4o')
18
+ * Used to look up model-specific token ratio from registry
19
+ */
20
+ constructor(model?: string);
21
+ /**
22
+ * Approximates token count using model-specific character-per-token ratio.
23
+ *
24
+ * Uses the LLM registry when available, otherwise defaults to ~4 characters
25
+ * per token which is a common approximation for modern tokenizers.
18
26
  *
19
27
  * @param text - Text content to count tokens for
20
28
  * @returns Approximate number of tokens
@@ -1,19 +1,33 @@
1
+ import { DEFAULT_CHARS_PER_TOKEN, getCharsPerToken } from '../../../../core/domain/cipher/llm/index.js';
1
2
  /**
2
3
  * Tokenizer for OpenRouter API.
3
4
  *
4
5
  * OpenRouter supports multiple model providers (OpenAI, Anthropic, etc.),
5
- * each with different tokenization schemes. This tokenizer provides a
6
- * generic approximation that works reasonably well across different models.
6
+ * each with different tokenization schemes. This tokenizer uses the LLM
7
+ * registry to look up model-specific character-per-token ratios when available.
7
8
  *
8
- * For more accurate token counting, model-specific tokenizers could be
9
- * implemented based on the selected model's provider.
9
+ * For models not in the registry, falls back to a generic approximation
10
+ * that works reasonably well across different model providers.
10
11
  */
11
12
  export class OpenRouterTokenizer {
13
+ charsPerToken;
12
14
  /**
13
- * Approximates token count using a character-based heuristic.
15
+ * Creates a new OpenRouter tokenizer instance.
14
16
  *
15
- * Uses ~4 characters per token, which is a common approximation
16
- * for modern tokenizers (GPT, Claude, Gemini, etc.).
17
+ * @param model - The OpenRouter model name (e.g., 'anthropic/claude-sonnet-4', 'openai/gpt-4o')
18
+ * Used to look up model-specific token ratio from registry
19
+ */
20
+ constructor(model) {
21
+ // Look up model-specific ratio from registry, fallback to default
22
+ this.charsPerToken = model
23
+ ? (getCharsPerToken('openrouter', model) ?? DEFAULT_CHARS_PER_TOKEN)
24
+ : DEFAULT_CHARS_PER_TOKEN;
25
+ }
26
+ /**
27
+ * Approximates token count using model-specific character-per-token ratio.
28
+ *
29
+ * Uses the LLM registry when available, otherwise defaults to ~4 characters
30
+ * per token which is a common approximation for modern tokenizers.
17
31
  *
18
32
  * @param text - Text content to count tokens for
19
33
  * @returns Approximate number of tokens
@@ -22,9 +36,7 @@ export class OpenRouterTokenizer {
22
36
  if (!text) {
23
37
  return 0;
24
38
  }
25
- // Simple heuristic: ~4 characters per token
26
- // This works reasonably well for most OpenRouter models
27
- return Math.ceil(text.length / 4);
39
+ return Math.ceil(text.length / this.charsPerToken);
28
40
  }
29
41
  /**
30
42
  * Gets the provider name for this tokenizer.