byterover-cli 0.2.1 → 0.3.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 (490) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +63 -3
  18. package/dist/commands/init.js +285 -70
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/pull.d.ts +33 -0
  21. package/dist/commands/pull.js +115 -0
  22. package/dist/commands/push.d.ts +13 -13
  23. package/dist/commands/push.js +81 -101
  24. package/dist/commands/query.d.ts +63 -0
  25. package/dist/commands/query.js +349 -0
  26. package/dist/commands/space/list.d.ts +5 -2
  27. package/dist/commands/space/list.js +60 -56
  28. package/dist/commands/space/switch.d.ts +16 -0
  29. package/dist/commands/space/switch.js +102 -53
  30. package/dist/commands/status.d.ts +5 -2
  31. package/dist/commands/status.js +43 -33
  32. package/dist/commands/watch.d.ts +23 -0
  33. package/dist/commands/watch.js +171 -0
  34. package/dist/config/auth.config.js +14 -2
  35. package/dist/config/context-tree-domains.d.ts +12 -0
  36. package/dist/config/context-tree-domains.js +29 -0
  37. package/dist/config/environment.d.ts +6 -0
  38. package/dist/config/environment.js +9 -2
  39. package/dist/constants.d.ts +5 -0
  40. package/dist/constants.js +6 -0
  41. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  42. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  43. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  44. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  45. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  46. package/dist/core/domain/cipher/agent/index.js +7 -0
  47. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  48. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  50. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  51. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  52. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  53. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  54. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  55. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  56. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  57. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  58. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  59. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  60. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  61. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  62. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  63. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  64. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  65. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  66. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  67. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  68. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  69. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  70. package/dist/core/domain/cipher/memory/types.js +4 -0
  71. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  72. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  73. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  74. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  75. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  76. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  77. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  78. package/dist/core/domain/cipher/todos/index.js +4 -0
  79. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  80. package/dist/core/domain/cipher/todos/types.js +5 -0
  81. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  82. package/dist/core/domain/cipher/tools/constants.js +24 -0
  83. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  84. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  85. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  86. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  87. package/dist/core/domain/entities/brv-config.js +115 -17
  88. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  89. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  90. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  91. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  92. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  93. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  94. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  95. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  96. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  97. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  98. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  99. package/dist/core/domain/entities/context-tree-index.js +27 -0
  100. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  101. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  102. package/dist/core/domain/entities/event.d.ts +1 -1
  103. package/dist/core/domain/entities/event.js +3 -1
  104. package/dist/core/domain/entities/parser.d.ts +567 -0
  105. package/dist/core/domain/entities/parser.js +10 -0
  106. package/dist/core/domain/entities/playbook.d.ts +2 -23
  107. package/dist/core/domain/entities/playbook.js +2 -70
  108. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  109. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  110. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  111. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  112. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  113. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  114. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  115. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  116. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  117. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  118. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  119. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  120. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  121. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  122. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  123. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  124. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  125. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  128. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  129. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  130. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  131. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  132. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  133. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  134. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  135. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  136. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  137. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  139. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  140. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  141. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  142. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  143. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  144. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  145. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  146. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  147. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  148. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  149. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  150. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  151. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  153. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  155. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  156. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  157. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  158. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  159. package/dist/core/interfaces/cipher/message-types.js +5 -0
  160. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  161. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  162. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  163. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  164. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  165. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  166. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  167. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  168. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  169. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  171. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  173. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  174. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  175. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  176. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  177. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  178. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  179. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  180. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  181. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  182. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  183. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  184. package/dist/hooks/error/clean-errors.d.ts +7 -0
  185. package/dist/hooks/error/clean-errors.js +50 -0
  186. package/dist/hooks/init/welcome.js +72 -1
  187. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  188. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  189. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  190. package/dist/infra/cipher/agent-service-factory.js +212 -0
  191. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  192. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  193. package/dist/infra/cipher/blob/index.d.ts +10 -0
  194. package/dist/infra/cipher/blob/index.js +12 -0
  195. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  196. package/dist/infra/cipher/blob/migrations.js +148 -0
  197. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  198. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  199. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  200. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  201. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  202. package/dist/infra/cipher/cipher-agent.js +317 -0
  203. package/dist/infra/cipher/command-parser.d.ts +23 -0
  204. package/dist/infra/cipher/command-parser.js +85 -0
  205. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  206. package/dist/infra/cipher/display/todo-display.js +129 -0
  207. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  208. package/dist/infra/cipher/events/event-emitter.js +158 -0
  209. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  210. package/dist/infra/cipher/exit-codes.js +58 -0
  211. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  212. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  213. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  214. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  215. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  216. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  217. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  218. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  219. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  220. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  221. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  222. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  223. package/dist/infra/cipher/interactive-commands.js +198 -0
  224. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  225. package/dist/infra/cipher/interactive-loop.js +352 -0
  226. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  227. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  228. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  229. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  230. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  231. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  232. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  233. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  234. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  235. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  236. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  237. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  238. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  239. package/dist/infra/cipher/llm/context/index.js +2 -0
  240. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  241. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  242. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  243. package/dist/infra/cipher/llm/context/utils.js +89 -0
  244. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  245. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  246. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  247. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  248. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  249. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  250. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  251. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  252. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  253. package/dist/infra/cipher/llm/generators/index.js +13 -0
  254. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  255. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  256. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  257. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  258. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  259. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  260. package/dist/infra/cipher/llm/index.d.ts +9 -0
  261. package/dist/infra/cipher/llm/index.js +13 -0
  262. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  263. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  264. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  265. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  266. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  267. package/dist/infra/cipher/llm/response-validator.js +157 -0
  268. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  269. package/dist/infra/cipher/llm/retry/index.js +10 -0
  270. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  271. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  272. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  273. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  274. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  275. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  276. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  277. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  278. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  279. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  280. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  281. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  282. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  283. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  284. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  285. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  286. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  287. package/dist/infra/cipher/logger/console-logger.js +63 -0
  288. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  289. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  290. package/dist/infra/cipher/memory/index.d.ts +6 -0
  291. package/dist/infra/cipher/memory/index.js +7 -0
  292. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  293. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  294. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  295. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  296. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  297. package/dist/infra/cipher/process/command-validator.js +266 -0
  298. package/dist/infra/cipher/process/index.d.ts +8 -0
  299. package/dist/infra/cipher/process/index.js +8 -0
  300. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  301. package/dist/infra/cipher/process/process-service.js +439 -0
  302. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  303. package/dist/infra/cipher/session/chat-session.js +165 -0
  304. package/dist/infra/cipher/session/index.d.ts +6 -0
  305. package/dist/infra/cipher/session/index.js +5 -0
  306. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  307. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  308. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  309. package/dist/infra/cipher/session/session-manager.js +172 -0
  310. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  311. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  312. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  313. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  314. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  315. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  316. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  317. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  318. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  319. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  320. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  321. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  322. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  323. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  324. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  326. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  327. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  328. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  329. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  330. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  331. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  332. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  333. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  334. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  335. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  336. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  337. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  338. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  339. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  340. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  342. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  344. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  346. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  347. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  348. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  350. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  351. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  352. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  353. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  354. package/dist/infra/cipher/tools/index.d.ts +18 -0
  355. package/dist/infra/cipher/tools/index.js +19 -0
  356. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  357. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  358. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  359. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  360. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  361. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  362. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  363. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  364. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  365. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  366. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  367. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  368. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  369. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  370. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  371. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  372. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  373. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  374. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  375. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  376. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  377. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  378. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  379. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  380. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  381. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  382. package/dist/infra/config/file-config-store.js +9 -3
  383. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  384. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  385. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  386. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  387. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  388. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  389. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  390. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  391. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  392. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  393. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  394. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  395. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  396. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  397. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  398. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  399. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  400. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  401. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  402. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  403. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  404. package/dist/infra/parsers/clean/shared.js +273 -0
  405. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  406. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  407. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  408. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  409. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  410. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  411. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  412. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  413. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  414. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  415. package/dist/infra/space/http-space-service.js +2 -1
  416. package/dist/infra/team/http-team-service.js +2 -1
  417. package/dist/infra/user/http-user-service.js +2 -1
  418. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  419. package/dist/infra/watcher/file-watcher-service.js +81 -0
  420. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  421. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  422. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  423. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  424. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  425. package/dist/resources/prompts/reflection.yml +27 -0
  426. package/dist/resources/prompts/system-prompt.yml +82 -0
  427. package/dist/resources/prompts/tool-outputs.yml +30 -0
  428. package/dist/templates/README.md +6 -7
  429. package/dist/templates/sections/command-reference.md +40 -111
  430. package/dist/templates/sections/workflow.md +3 -30
  431. package/dist/utils/emoji-helpers.d.ts +38 -0
  432. package/dist/utils/emoji-helpers.js +42 -0
  433. package/dist/utils/error-handler.d.ts +51 -0
  434. package/dist/utils/error-handler.js +169 -0
  435. package/dist/utils/error-helpers.d.ts +30 -0
  436. package/dist/utils/error-helpers.js +47 -0
  437. package/dist/utils/file-helpers.d.ts +15 -0
  438. package/dist/utils/file-helpers.js +44 -0
  439. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  440. package/dist/utils/oclif-error-helpers.js +46 -0
  441. package/dist/utils/tool-display-formatter.d.ts +53 -0
  442. package/dist/utils/tool-display-formatter.js +257 -0
  443. package/oclif.manifest.json +381 -141
  444. package/package.json +27 -6
  445. package/dist/commands/add.d.ts +0 -49
  446. package/dist/commands/add.js +0 -192
  447. package/dist/commands/complete.d.ts +0 -108
  448. package/dist/commands/complete.js +0 -340
  449. package/dist/commands/retrieve.d.ts +0 -26
  450. package/dist/commands/retrieve.js +0 -101
  451. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  452. package/dist/core/domain/entities/curator-output.js +0 -23
  453. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  454. package/dist/core/domain/entities/delta-batch.js +0 -52
  455. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  456. package/dist/core/domain/entities/delta-operation.js +0 -50
  457. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  458. package/dist/core/domain/entities/executor-output.js +0 -33
  459. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  460. package/dist/core/domain/entities/reflector-output.js +0 -44
  461. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  462. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  463. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  464. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  465. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  466. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  467. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  468. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  469. package/dist/infra/ace/ace-file-utils.js +0 -83
  470. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  471. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  472. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  473. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  474. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  475. package/dist/infra/ace/file-delta-store.js +0 -26
  476. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  477. package/dist/infra/ace/file-executor-output-store.js +0 -26
  478. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  479. package/dist/infra/ace/file-playbook-store.js +0 -107
  480. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  481. package/dist/infra/ace/file-reflection-store.js +0 -55
  482. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  483. package/dist/infra/playbook/file-playbook-service.js +0 -132
  484. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  485. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  486. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  487. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  488. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  489. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  490. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Loop Detector for Agent Tool Calls
3
+ *
4
+ * Detects repetitive tool call patterns to prevent the agent from:
5
+ * - Making the same tool call with identical arguments multiple times
6
+ * - Oscillating between two tool calls (A→B→A→B pattern)
7
+ *
8
+ * When a loop is detected, the caller should skip tool execution
9
+ * and inject a warning message to guide the LLM to try a different approach.
10
+ *
11
+ * Thread-safe: Uses AsyncMutex to protect shared state during parallel tool execution.
12
+ */
13
+ import { AsyncMutex } from './async-mutex.js';
14
+ /**
15
+ * Default configuration values.
16
+ */
17
+ const DEFAULT_CONFIG = {
18
+ exactRepeatThreshold: 3,
19
+ oscillationThreshold: 2,
20
+ windowSize: 10,
21
+ };
22
+ /**
23
+ * Loop Detector.
24
+ *
25
+ * Tracks recent tool calls and detects repetitive patterns.
26
+ * This helps prevent the agent from wasting tokens and time
27
+ * on repeated unsuccessful attempts.
28
+ *
29
+ * Thread-safe: All mutating operations use AsyncMutex to ensure
30
+ * safe concurrent access during parallel tool execution.
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * const detector = new LoopDetector()
35
+ *
36
+ * // Before executing each tool call (async for thread safety)
37
+ * const result = await detector.recordAndCheck('read_file', { path: '/foo.ts' })
38
+ * if (result.isLoop) {
39
+ * // Skip execution, inject warning to LLM
40
+ * console.log(result.suggestion)
41
+ * } else {
42
+ * // Execute tool normally
43
+ * }
44
+ * ```
45
+ */
46
+ export class LoopDetector {
47
+ config;
48
+ mutex = new AsyncMutex();
49
+ recentCalls = [];
50
+ constructor(config = {}) {
51
+ this.config = { ...DEFAULT_CONFIG, ...config };
52
+ }
53
+ /**
54
+ * Get the current configuration.
55
+ */
56
+ getConfig() {
57
+ return { ...this.config };
58
+ }
59
+ /**
60
+ * Get the number of recorded calls in the window.
61
+ */
62
+ getRecentCallCount() {
63
+ return this.recentCalls.length;
64
+ }
65
+ /**
66
+ * Record a tool call and check for loop patterns.
67
+ * Thread-safe: Uses mutex to protect shared state during parallel execution.
68
+ *
69
+ * @param toolName - Name of the tool being called
70
+ * @param args - Arguments passed to the tool
71
+ * @returns Detection result indicating if a loop was found
72
+ */
73
+ async recordAndCheck(toolName, args) {
74
+ return this.mutex.withLock(async () => {
75
+ const signature = this.createSignature(toolName, args);
76
+ this.recentCalls.push(signature);
77
+ // Trim to window size
78
+ if (this.recentCalls.length > this.config.windowSize) {
79
+ this.recentCalls.shift();
80
+ }
81
+ return this.detectLoop();
82
+ });
83
+ }
84
+ /**
85
+ * Reset the detector state.
86
+ * Should be called when starting a new conversation or task.
87
+ * Thread-safe: Uses mutex to protect shared state.
88
+ */
89
+ async reset() {
90
+ return this.mutex.withLock(async () => {
91
+ this.recentCalls = [];
92
+ });
93
+ }
94
+ /**
95
+ * Create a signature for a tool call.
96
+ */
97
+ createSignature(toolName, args) {
98
+ return {
99
+ argsHash: this.hashArgs(args),
100
+ timestamp: Date.now(),
101
+ toolName,
102
+ };
103
+ }
104
+ /**
105
+ * Detect exact repeat pattern: same call N times consecutively.
106
+ */
107
+ detectExactRepeat() {
108
+ if (this.recentCalls.length < this.config.exactRepeatThreshold) {
109
+ return { isLoop: false };
110
+ }
111
+ const lastCall = this.recentCalls.at(-1);
112
+ if (!lastCall) {
113
+ return { isLoop: false };
114
+ }
115
+ let repeatCount = 1;
116
+ // Count consecutive identical calls from the end
117
+ for (let i = this.recentCalls.length - 2; i >= 0; i--) {
118
+ if (this.signaturesMatch(this.recentCalls[i], lastCall)) {
119
+ repeatCount++;
120
+ }
121
+ else {
122
+ break;
123
+ }
124
+ }
125
+ if (repeatCount >= this.config.exactRepeatThreshold) {
126
+ return {
127
+ isLoop: true,
128
+ loopType: 'exact_repeat',
129
+ repeatCount,
130
+ suggestion: `Tool "${lastCall.toolName}" has been called ${repeatCount} times with the same arguments. This indicates a loop. Please try a different approach to accomplish your goal.`,
131
+ };
132
+ }
133
+ return { isLoop: false };
134
+ }
135
+ /**
136
+ * Detect loop patterns in recent calls.
137
+ */
138
+ detectLoop() {
139
+ // Pattern 1: Exact repeat (same tool+args N times in a row)
140
+ const exactRepeat = this.detectExactRepeat();
141
+ if (exactRepeat.isLoop) {
142
+ return exactRepeat;
143
+ }
144
+ // Pattern 2: Oscillation (A→B→A→B)
145
+ const oscillation = this.detectOscillation();
146
+ if (oscillation.isLoop) {
147
+ return oscillation;
148
+ }
149
+ return { isLoop: false };
150
+ }
151
+ /**
152
+ * Detect oscillation pattern: A→B→A→B.
153
+ */
154
+ detectOscillation() {
155
+ // Need at least 4 calls for one oscillation cycle (A→B→A→B)
156
+ const minCalls = this.config.oscillationThreshold * 2;
157
+ if (this.recentCalls.length < minCalls) {
158
+ return { isLoop: false };
159
+ }
160
+ // Check for A→B→A→B pattern in the last 4 calls
161
+ const calls = this.recentCalls.slice(-4);
162
+ // A[0] == A[2] and B[1] == B[3] and A[0] != B[1]
163
+ if (this.signaturesMatch(calls[0], calls[2]) &&
164
+ this.signaturesMatch(calls[1], calls[3]) &&
165
+ !this.signaturesMatch(calls[0], calls[1])) {
166
+ return {
167
+ isLoop: true,
168
+ loopType: 'oscillation',
169
+ repeatCount: 2,
170
+ suggestion: `Detected oscillation pattern between "${calls[0].toolName}" and "${calls[1].toolName}". The agent is alternating between these two tools without making progress. Please try a different strategy.`,
171
+ };
172
+ }
173
+ return { isLoop: false };
174
+ }
175
+ /**
176
+ * Create a deterministic hash of tool arguments.
177
+ * Sorts keys to ensure consistent ordering.
178
+ */
179
+ hashArgs(args) {
180
+ // Sort keys for deterministic serialization
181
+ const sortedKeys = Object.keys(args).sort();
182
+ const sortedArgs = {};
183
+ for (const key of sortedKeys) {
184
+ sortedArgs[key] = args[key];
185
+ }
186
+ return JSON.stringify(sortedArgs);
187
+ }
188
+ /**
189
+ * Check if two signatures represent the same tool call.
190
+ */
191
+ signaturesMatch(a, b) {
192
+ return a.toolName === b.toolName && a.argsHash === b.argsHash;
193
+ }
194
+ }
@@ -0,0 +1,17 @@
1
+ import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
2
+ import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
3
+ /**
4
+ * Count total tokens in a message array.
5
+ * Adapted from dexto's token counting logic for cipher context.
6
+ *
7
+ * This provides a comprehensive token count including:
8
+ * - Role metadata tokens
9
+ * - Text content tokens
10
+ * - Multimodal content tokens (images, files)
11
+ * - Tool call tokens
12
+ *
13
+ * @param messages - Array of internal messages
14
+ * @param tokenizer - Tokenizer for counting
15
+ * @returns Total token count
16
+ */
17
+ export declare function countMessagesTokens(messages: InternalMessage[], tokenizer: ITokenizer): number;
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Count tokens for a single content part
3
+ *
4
+ * @param part - Content part
5
+ * @param part.text - Text content (for text type)
6
+ * @param part.type - Type of content part
7
+ * @param tokenizer - Tokenizer for counting
8
+ * @returns Token count for the part
9
+ */
10
+ function countPartTokens(part, tokenizer) {
11
+ switch (part.type) {
12
+ case 'file': {
13
+ // File content - rough estimate
14
+ // Similar to images, files can vary widely in token cost
15
+ return 100;
16
+ }
17
+ case 'image': {
18
+ // Image content - rough estimate
19
+ // Images are typically encoded and consume significant tokens
20
+ // Conservative estimate: ~100 tokens per image
21
+ return 100;
22
+ }
23
+ case 'text': {
24
+ // Text content - use tokenizer
25
+ return tokenizer.countTokens(part.text ?? '');
26
+ }
27
+ default: {
28
+ return 0;
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * Count tokens for message content
34
+ *
35
+ * @param content - Message content
36
+ * @param tokenizer - Tokenizer for counting
37
+ * @returns Token count for the content
38
+ */
39
+ function countContentTokens(content, tokenizer) {
40
+ if (!content) {
41
+ return 0;
42
+ }
43
+ if (typeof content === 'string') {
44
+ // String content - use tokenizer
45
+ return tokenizer.countTokens(content);
46
+ }
47
+ if (Array.isArray(content)) {
48
+ // Array of parts (text, images, files)
49
+ let tokens = 0;
50
+ for (const part of content) {
51
+ tokens += countPartTokens(part, tokenizer);
52
+ }
53
+ return tokens;
54
+ }
55
+ return 0;
56
+ }
57
+ /**
58
+ * Count total tokens in a message array.
59
+ * Adapted from dexto's token counting logic for cipher context.
60
+ *
61
+ * This provides a comprehensive token count including:
62
+ * - Role metadata tokens
63
+ * - Text content tokens
64
+ * - Multimodal content tokens (images, files)
65
+ * - Tool call tokens
66
+ *
67
+ * @param messages - Array of internal messages
68
+ * @param tokenizer - Tokenizer for counting
69
+ * @returns Total token count
70
+ */
71
+ export function countMessagesTokens(messages, tokenizer) {
72
+ let totalTokens = 0;
73
+ for (const message of messages) {
74
+ // Role token overhead (estimated)
75
+ // Each message has role metadata that consumes tokens
76
+ totalTokens += 4;
77
+ // Content tokens
78
+ totalTokens += countContentTokens(message.content, tokenizer);
79
+ // Tool call tokens
80
+ if (message.toolCalls) {
81
+ for (const call of message.toolCalls) {
82
+ // Tool calls are serialized as JSON
83
+ const callJson = JSON.stringify(call);
84
+ totalTokens += tokenizer.countTokens(callJson);
85
+ }
86
+ }
87
+ }
88
+ return totalTokens;
89
+ }
@@ -0,0 +1,54 @@
1
+ import type { MessageCreateParamsBase, MessageParam } from '@anthropic-ai/sdk/resources/messages';
2
+ import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
3
+ import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
4
+ export type { MessageParam as ClaudeMessage, Message as ClaudeResponse } from '@anthropic-ai/sdk/resources/messages';
5
+ export type ClaudeGenerationConfig = Pick<MessageCreateParamsBase, 'max_tokens' | 'system' | 'temperature' | 'tools'>;
6
+ /**
7
+ * Message formatter for Anthropic Claude API.
8
+ *
9
+ * Converts the internal message format to Claude's specific structure:
10
+ * - System prompts are NOT included in messages (handled separately in config)
11
+ * - Uses 'assistant' role (not 'model' like Gemini)
12
+ * - Tool calls use tool_use blocks with id and input
13
+ * - Tool results use tool_result blocks with tool_use_id
14
+ */
15
+ export declare class ClaudeMessageFormatter implements IMessageFormatter<MessageParam> {
16
+ /**
17
+ * Formats internal messages into Claude's API format.
18
+ *
19
+ * IMPORTANT: System prompts are NOT included in the returned array.
20
+ * They should be passed separately via the config.system parameter.
21
+ *
22
+ * @param history Array of internal messages to format
23
+ * @param _systemPrompt System prompt (ignored - handled separately in config)
24
+ * @returns Array of MessageParam objects formatted for Claude's API
25
+ */
26
+ format(history: Readonly<InternalMessage[]>, _systemPrompt?: null | string): MessageParam[];
27
+ /**
28
+ * Parses Claude API response into internal message objects.
29
+ *
30
+ * @param response The raw response from Claude API
31
+ * @returns Array of internal messages (typically one assistant message)
32
+ */
33
+ parseResponse(response: unknown): InternalMessage[];
34
+ /**
35
+ * Formats assistant message to Claude's format.
36
+ * Uses 'assistant' role and includes both text and tool_use blocks.
37
+ */
38
+ private formatAssistantMessage;
39
+ /**
40
+ * Formats tool result message to Claude's format.
41
+ * Tool results are sent as user messages with tool_result blocks.
42
+ */
43
+ private formatToolResult;
44
+ /**
45
+ * Formats a single user content part.
46
+ * Currently supports text parts, with placeholders for image/file support.
47
+ */
48
+ private formatUserContentPart;
49
+ /**
50
+ * Formats user message to Claude's format.
51
+ * Handles both simple string content and multimodal content blocks.
52
+ */
53
+ private formatUserMessage;
54
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Message formatter for Anthropic Claude API.
3
+ *
4
+ * Converts the internal message format to Claude's specific structure:
5
+ * - System prompts are NOT included in messages (handled separately in config)
6
+ * - Uses 'assistant' role (not 'model' like Gemini)
7
+ * - Tool calls use tool_use blocks with id and input
8
+ * - Tool results use tool_result blocks with tool_use_id
9
+ */
10
+ export class ClaudeMessageFormatter {
11
+ /**
12
+ * Formats internal messages into Claude's API format.
13
+ *
14
+ * IMPORTANT: System prompts are NOT included in the returned array.
15
+ * They should be passed separately via the config.system parameter.
16
+ *
17
+ * @param history Array of internal messages to format
18
+ * @param _systemPrompt System prompt (ignored - handled separately in config)
19
+ * @returns Array of MessageParam objects formatted for Claude's API
20
+ */
21
+ format(history, _systemPrompt) {
22
+ const messages = [];
23
+ // Note: System prompt is NOT added to messages for Claude
24
+ // It's passed separately via config.system parameter
25
+ for (const msg of history) {
26
+ switch (msg.role) {
27
+ case 'assistant': {
28
+ messages.push(this.formatAssistantMessage(msg));
29
+ break;
30
+ }
31
+ case 'system': {
32
+ // Skip system messages - they should be in config.system
33
+ // Additional system messages in history are ignored
34
+ break;
35
+ }
36
+ case 'tool': {
37
+ messages.push(this.formatToolResult(msg));
38
+ break;
39
+ }
40
+ case 'user': {
41
+ messages.push(this.formatUserMessage(msg));
42
+ break;
43
+ }
44
+ }
45
+ }
46
+ return messages;
47
+ }
48
+ /**
49
+ * Parses Claude API response into internal message objects.
50
+ *
51
+ * @param response The raw response from Claude API
52
+ * @returns Array of internal messages (typically one assistant message)
53
+ */
54
+ parseResponse(response) {
55
+ const typedResponse = response;
56
+ if (!typedResponse.content || typedResponse.content.length === 0) {
57
+ return [];
58
+ }
59
+ const textParts = [];
60
+ const toolUses = [];
61
+ // Extract text and tool uses from response content blocks
62
+ for (const block of typedResponse.content) {
63
+ if (block.type === 'text') {
64
+ textParts.push(block.text);
65
+ }
66
+ else if (block.type === 'tool_use') {
67
+ toolUses.push(block);
68
+ }
69
+ }
70
+ // Convert to internal message format
71
+ const toolCalls = toolUses.length > 0
72
+ ? toolUses.map((tu) => ({
73
+ function: {
74
+ arguments: JSON.stringify(tu.input),
75
+ name: tu.name,
76
+ },
77
+ id: tu.id,
78
+ type: 'function',
79
+ }))
80
+ : undefined;
81
+ return [
82
+ {
83
+ content: textParts.join('') || null,
84
+ role: 'assistant',
85
+ toolCalls,
86
+ },
87
+ ];
88
+ }
89
+ /**
90
+ * Formats assistant message to Claude's format.
91
+ * Uses 'assistant' role and includes both text and tool_use blocks.
92
+ */
93
+ formatAssistantMessage(msg) {
94
+ const contentBlocks = [];
95
+ // Add text content if present
96
+ if (msg.content) {
97
+ contentBlocks.push({
98
+ text: String(msg.content),
99
+ type: 'text',
100
+ });
101
+ }
102
+ // Add tool calls if present
103
+ if (msg.toolCalls) {
104
+ for (const tc of msg.toolCalls) {
105
+ contentBlocks.push({
106
+ id: tc.id,
107
+ input: JSON.parse(tc.function.arguments),
108
+ name: tc.function.name,
109
+ type: 'tool_use',
110
+ });
111
+ }
112
+ }
113
+ return {
114
+ content: contentBlocks,
115
+ role: 'assistant',
116
+ };
117
+ }
118
+ /**
119
+ * Formats tool result message to Claude's format.
120
+ * Tool results are sent as user messages with tool_result blocks.
121
+ */
122
+ formatToolResult(msg) {
123
+ return {
124
+ content: [
125
+ {
126
+ content: String(msg.content ?? ''),
127
+ tool_use_id: msg.toolCallId ?? '',
128
+ type: 'tool_result',
129
+ },
130
+ ],
131
+ role: 'user',
132
+ };
133
+ }
134
+ /**
135
+ * Formats a single user content part.
136
+ * Currently supports text parts, with placeholders for image/file support.
137
+ */
138
+ formatUserContentPart(part) {
139
+ if (part.type === 'text') {
140
+ return { text: part.text, type: 'text' };
141
+ }
142
+ if (part.type === 'image') {
143
+ // Image support not yet implemented for Claude
144
+ // Claude supports images via base64 encoded data
145
+ return { text: '[Image not yet supported]', type: 'text' };
146
+ }
147
+ if (part.type === 'file') {
148
+ // File support not yet implemented for Claude
149
+ return { text: '[File not yet supported]', type: 'text' };
150
+ }
151
+ return { text: '[Unknown content type]', type: 'text' };
152
+ }
153
+ /**
154
+ * Formats user message to Claude's format.
155
+ * Handles both simple string content and multimodal content blocks.
156
+ */
157
+ formatUserMessage(msg) {
158
+ if (typeof msg.content === 'string') {
159
+ // Simple text message
160
+ return {
161
+ content: msg.content,
162
+ role: 'user',
163
+ };
164
+ }
165
+ if (Array.isArray(msg.content)) {
166
+ // Multimodal content (text, images, files)
167
+ const contentBlocks = [];
168
+ for (const part of msg.content) {
169
+ contentBlocks.push(this.formatUserContentPart(part));
170
+ }
171
+ return {
172
+ content: contentBlocks,
173
+ role: 'user',
174
+ };
175
+ }
176
+ // Empty content
177
+ return {
178
+ content: '',
179
+ role: 'user',
180
+ };
181
+ }
182
+ }
@@ -0,0 +1,69 @@
1
+ import type { Content } from '@google/genai';
2
+ import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
3
+ import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
4
+ /**
5
+ * Message formatter for Google Gemini API.
6
+ *
7
+ * Converts the internal message format to Gemini's specific structure:
8
+ * - Maps 'assistant' role to 'model' (Gemini's terminology)
9
+ * - System prompts are injected as user messages (Gemini doesn't have system role)
10
+ * - Tool calls use functionCall parts
11
+ * - Tool results use functionResponse parts in user messages
12
+ */
13
+ export declare class GeminiMessageFormatter implements IMessageFormatter<Content> {
14
+ /**
15
+ * Formats internal messages into Gemini's API format.
16
+ *
17
+ * @param history Array of internal messages to format
18
+ * @param systemPrompt Optional system prompt to include at the beginning
19
+ * @returns Array of Content objects formatted for Gemini's API
20
+ */
21
+ format(history: Readonly<InternalMessage[]>, systemPrompt?: null | string): Content[];
22
+ /**
23
+ * Parses Gemini API response into internal message objects.
24
+ *
25
+ * @param response The raw response from Gemini API
26
+ * @returns Array of internal messages (typically one assistant message)
27
+ */
28
+ parseResponse(response: unknown): InternalMessage[];
29
+ /**
30
+ * Combines multiple tool results into a single Gemini user message.
31
+ * Required by Gemini API when assistant made multiple tool calls.
32
+ */
33
+ private combineToolResults;
34
+ /**
35
+ * Formats assistant message to Gemini's Content format.
36
+ * Maps 'assistant' role to 'model' and includes both text and tool calls.
37
+ */
38
+ private formatAssistantMessage;
39
+ /**
40
+ * Formats a single non-tool message to Gemini Content.
41
+ */
42
+ private formatNonToolMessage;
43
+ /**
44
+ * Formats a single tool result message to a Gemini functionResponse Part.
45
+ * Multiple tool results are combined into a single user message by format().
46
+ *
47
+ * Note: msg.content is a JSON string from ToolOutputProcessor.
48
+ * We need to parse it back to an object for Gemini's API.
49
+ */
50
+ private formatToolResultPart;
51
+ /**
52
+ * Formats a single user content part.
53
+ * Currently supports text parts, with placeholders for image/file support.
54
+ */
55
+ private formatUserContentPart;
56
+ /**
57
+ * Formats user message to Gemini's Content format.
58
+ * Handles both simple string content and multimodal content parts.
59
+ */
60
+ private formatUserMessage;
61
+ /**
62
+ * Generates a unique tool call ID.
63
+ * Gemini doesn't provide tool call IDs, so we generate them.
64
+ *
65
+ * @param toolName The name of the tool being called
66
+ * @returns A unique identifier for the tool call
67
+ */
68
+ private generateToolCallId;
69
+ }