byterover-cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) 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 +53 -2
  18. package/dist/commands/init.js +279 -66
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/logout.d.ts +16 -0
  21. package/dist/commands/logout.js +61 -0
  22. package/dist/commands/pull.d.ts +33 -0
  23. package/dist/commands/pull.js +115 -0
  24. package/dist/commands/push.d.ts +13 -13
  25. package/dist/commands/push.js +81 -101
  26. package/dist/commands/query.d.ts +63 -0
  27. package/dist/commands/query.js +349 -0
  28. package/dist/commands/space/list.d.ts +5 -2
  29. package/dist/commands/space/list.js +60 -56
  30. package/dist/commands/space/switch.d.ts +16 -0
  31. package/dist/commands/space/switch.js +102 -53
  32. package/dist/commands/status.d.ts +5 -2
  33. package/dist/commands/status.js +43 -33
  34. package/dist/commands/watch.d.ts +23 -0
  35. package/dist/commands/watch.js +171 -0
  36. package/dist/config/auth.config.js +14 -2
  37. package/dist/config/context-tree-domains.d.ts +12 -0
  38. package/dist/config/context-tree-domains.js +29 -0
  39. package/dist/config/environment.d.ts +6 -0
  40. package/dist/config/environment.js +9 -2
  41. package/dist/constants.d.ts +5 -0
  42. package/dist/constants.js +6 -0
  43. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  44. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  45. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  46. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  47. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  48. package/dist/core/domain/cipher/agent/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  50. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  51. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  52. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  53. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  54. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  55. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  56. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  57. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  58. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  59. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  60. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  61. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  62. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  63. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  64. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  65. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  66. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  67. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  68. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  69. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  70. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  71. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  72. package/dist/core/domain/cipher/memory/types.js +4 -0
  73. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  74. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  75. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  76. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  77. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  78. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  79. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  80. package/dist/core/domain/cipher/todos/index.js +4 -0
  81. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  82. package/dist/core/domain/cipher/todos/types.js +5 -0
  83. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  84. package/dist/core/domain/cipher/tools/constants.js +24 -0
  85. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  86. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  87. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  88. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  89. package/dist/core/domain/entities/brv-config.js +115 -17
  90. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  91. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  92. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  93. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  94. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  95. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  96. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  97. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  98. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  99. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  100. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  101. package/dist/core/domain/entities/context-tree-index.js +27 -0
  102. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  103. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  104. package/dist/core/domain/entities/event.d.ts +1 -1
  105. package/dist/core/domain/entities/event.js +4 -1
  106. package/dist/core/domain/entities/parser.d.ts +567 -0
  107. package/dist/core/domain/entities/parser.js +10 -0
  108. package/dist/core/domain/entities/playbook.d.ts +2 -23
  109. package/dist/core/domain/entities/playbook.js +2 -70
  110. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  111. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  112. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  113. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  114. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  115. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  116. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  117. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  118. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  119. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  120. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  121. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  122. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  123. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  124. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  125. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  128. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  129. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  130. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  131. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  132. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  133. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  134. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  135. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  136. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  137. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  139. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  140. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  141. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  142. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  143. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  144. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  145. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  146. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  147. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  148. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  149. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  150. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  151. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  153. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  155. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  156. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  157. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  158. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  159. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  160. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  161. package/dist/core/interfaces/cipher/message-types.js +5 -0
  162. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  163. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  164. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  165. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  166. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  167. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  168. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  169. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  171. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  173. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  174. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  175. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  176. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  177. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  178. package/dist/core/interfaces/i-rule-template-service.d.ts +0 -4
  179. package/dist/core/interfaces/i-rule-template-service.js +1 -4
  180. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  181. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  182. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  183. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  184. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  185. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  186. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  187. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  188. package/dist/hooks/error/clean-errors.d.ts +7 -0
  189. package/dist/hooks/error/clean-errors.js +50 -0
  190. package/dist/hooks/init/welcome.js +72 -1
  191. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  192. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  193. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  194. package/dist/infra/cipher/agent-service-factory.js +212 -0
  195. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  196. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  197. package/dist/infra/cipher/blob/index.d.ts +10 -0
  198. package/dist/infra/cipher/blob/index.js +12 -0
  199. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  200. package/dist/infra/cipher/blob/migrations.js +148 -0
  201. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  202. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  203. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  204. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  205. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  206. package/dist/infra/cipher/cipher-agent.js +317 -0
  207. package/dist/infra/cipher/command-parser.d.ts +23 -0
  208. package/dist/infra/cipher/command-parser.js +85 -0
  209. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  210. package/dist/infra/cipher/display/todo-display.js +129 -0
  211. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  212. package/dist/infra/cipher/events/event-emitter.js +158 -0
  213. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  214. package/dist/infra/cipher/exit-codes.js +58 -0
  215. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  216. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  217. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  218. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  219. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  220. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  221. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  222. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  223. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  224. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  225. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  226. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  227. package/dist/infra/cipher/interactive-commands.js +198 -0
  228. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  229. package/dist/infra/cipher/interactive-loop.js +352 -0
  230. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  231. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  232. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  233. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  234. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  235. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  236. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  237. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  238. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  239. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  240. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  241. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  242. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  243. package/dist/infra/cipher/llm/context/index.js +2 -0
  244. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  245. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  246. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  247. package/dist/infra/cipher/llm/context/utils.js +89 -0
  248. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  249. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  250. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  251. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  252. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  253. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  254. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  255. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  256. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  257. package/dist/infra/cipher/llm/generators/index.js +13 -0
  258. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  259. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  260. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  261. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  262. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  263. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  264. package/dist/infra/cipher/llm/index.d.ts +9 -0
  265. package/dist/infra/cipher/llm/index.js +13 -0
  266. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  267. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  268. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  269. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  270. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  271. package/dist/infra/cipher/llm/response-validator.js +157 -0
  272. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  273. package/dist/infra/cipher/llm/retry/index.js +10 -0
  274. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  275. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  276. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  277. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  278. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  279. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  280. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  281. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  282. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  283. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  284. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  285. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  286. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  287. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  288. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  289. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  290. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  291. package/dist/infra/cipher/logger/console-logger.js +63 -0
  292. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  293. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  294. package/dist/infra/cipher/memory/index.d.ts +6 -0
  295. package/dist/infra/cipher/memory/index.js +7 -0
  296. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  297. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  298. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  299. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  300. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  301. package/dist/infra/cipher/process/command-validator.js +266 -0
  302. package/dist/infra/cipher/process/index.d.ts +8 -0
  303. package/dist/infra/cipher/process/index.js +8 -0
  304. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  305. package/dist/infra/cipher/process/process-service.js +439 -0
  306. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  307. package/dist/infra/cipher/session/chat-session.js +165 -0
  308. package/dist/infra/cipher/session/index.d.ts +6 -0
  309. package/dist/infra/cipher/session/index.js +5 -0
  310. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  311. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  312. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  313. package/dist/infra/cipher/session/session-manager.js +172 -0
  314. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  315. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  316. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  317. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  318. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  319. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  320. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  321. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  322. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  323. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  324. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  326. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  327. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  328. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  329. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  330. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  331. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  332. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  333. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  334. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  335. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  336. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  337. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  338. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  339. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  340. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  342. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  344. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  346. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  347. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  348. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  350. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  351. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  352. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  353. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  354. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  355. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  356. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  357. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  358. package/dist/infra/cipher/tools/index.d.ts +18 -0
  359. package/dist/infra/cipher/tools/index.js +19 -0
  360. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  361. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  362. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  363. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  364. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  365. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  366. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  367. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  368. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  369. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  370. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  371. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  372. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  373. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  374. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  375. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  376. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  377. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  378. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  379. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  380. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  381. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  382. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  383. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  384. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  385. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  386. package/dist/infra/config/file-config-store.js +9 -3
  387. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  388. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  389. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  390. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  391. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  392. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  393. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  394. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  395. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  396. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  397. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  398. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  399. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  400. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  401. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  402. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  403. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  404. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  405. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  406. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  407. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  408. package/dist/infra/parsers/clean/shared.js +273 -0
  409. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  410. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  411. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  412. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  413. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  414. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  415. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  416. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  417. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  418. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  419. package/dist/infra/rule/constants.d.ts +4 -0
  420. package/dist/infra/rule/constants.js +4 -0
  421. package/dist/infra/rule/rule-template-service.js +1 -1
  422. package/dist/infra/rule/rule-writer-service.js +1 -5
  423. package/dist/infra/space/http-space-service.js +2 -1
  424. package/dist/infra/team/http-team-service.js +2 -1
  425. package/dist/infra/user/http-user-service.js +2 -1
  426. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  427. package/dist/infra/watcher/file-watcher-service.js +81 -0
  428. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  429. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  430. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  431. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  432. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  433. package/dist/resources/prompts/reflection.yml +27 -0
  434. package/dist/resources/prompts/system-prompt.yml +82 -0
  435. package/dist/resources/prompts/tool-outputs.yml +30 -0
  436. package/dist/templates/README.md +6 -7
  437. package/dist/templates/sections/command-reference.md +40 -93
  438. package/dist/templates/sections/workflow.md +3 -30
  439. package/dist/utils/emoji-helpers.d.ts +38 -0
  440. package/dist/utils/emoji-helpers.js +42 -0
  441. package/dist/utils/error-handler.d.ts +51 -0
  442. package/dist/utils/error-handler.js +169 -0
  443. package/dist/utils/error-helpers.d.ts +30 -0
  444. package/dist/utils/error-helpers.js +47 -0
  445. package/dist/utils/file-helpers.d.ts +15 -0
  446. package/dist/utils/file-helpers.js +44 -0
  447. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  448. package/dist/utils/oclif-error-helpers.js +46 -0
  449. package/dist/utils/tool-display-formatter.d.ts +53 -0
  450. package/dist/utils/tool-display-formatter.js +257 -0
  451. package/oclif.manifest.json +422 -142
  452. package/package.json +29 -10
  453. package/dist/commands/add.d.ts +0 -49
  454. package/dist/commands/add.js +0 -192
  455. package/dist/commands/complete.d.ts +0 -108
  456. package/dist/commands/complete.js +0 -340
  457. package/dist/commands/retrieve.d.ts +0 -26
  458. package/dist/commands/retrieve.js +0 -101
  459. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  460. package/dist/core/domain/entities/curator-output.js +0 -23
  461. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  462. package/dist/core/domain/entities/delta-batch.js +0 -52
  463. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  464. package/dist/core/domain/entities/delta-operation.js +0 -50
  465. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  466. package/dist/core/domain/entities/executor-output.js +0 -33
  467. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  468. package/dist/core/domain/entities/reflector-output.js +0 -44
  469. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  470. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  471. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  472. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  473. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  474. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  475. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  476. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  477. package/dist/infra/ace/ace-file-utils.js +0 -83
  478. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  479. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  480. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  481. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  482. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  483. package/dist/infra/ace/file-delta-store.js +0 -26
  484. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  485. package/dist/infra/ace/file-executor-output-store.js +0 -26
  486. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  487. package/dist/infra/ace/file-playbook-store.js +0 -107
  488. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  489. package/dist/infra/ace/file-reflection-store.js +0 -55
  490. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  491. package/dist/infra/playbook/file-playbook-service.js +0 -132
  492. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  493. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  494. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  495. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  496. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  497. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  498. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,254 @@
1
+ /**
2
+ * OpenRouter Content Generator.
3
+ *
4
+ * Implements IContentGenerator using OpenRouter API (OpenAI-compatible).
5
+ * Supports various models available through OpenRouter.
6
+ */
7
+ import { OpenAI } from 'openai';
8
+ import { OpenRouterMessageFormatter } from '../formatters/openrouter-formatter.js';
9
+ import { OpenRouterTokenizer } from '../tokenizers/openrouter-tokenizer.js';
10
+ /**
11
+ * OpenRouter Content Generator.
12
+ *
13
+ * Wraps OpenAI client configured for OpenRouter and implements IContentGenerator.
14
+ * Provides:
15
+ * - Non-streaming content generation
16
+ * - Streaming content generation (true streaming via OpenAI SDK)
17
+ * - Token estimation
18
+ */
19
+ export class OpenRouterContentGenerator {
20
+ client;
21
+ config;
22
+ formatter;
23
+ tokenizer;
24
+ /**
25
+ * Create a new OpenRouter Content Generator.
26
+ *
27
+ * @param config - Generator configuration
28
+ */
29
+ constructor(config) {
30
+ this.config = {
31
+ maxTokens: config.maxTokens ?? 8192,
32
+ model: config.model ?? 'anthropic/claude-haiku-4.5',
33
+ temperature: config.temperature ?? 0.7,
34
+ };
35
+ // Initialize OpenAI client with OpenRouter base URL
36
+ this.client = new OpenAI({
37
+ apiKey: config.apiKey,
38
+ baseURL: config.baseUrl ?? 'https://openrouter.ai/api/v1',
39
+ defaultHeaders: {
40
+ ...(config.httpReferer && { 'HTTP-Referer': config.httpReferer }),
41
+ ...(config.siteName && { 'X-Title': config.siteName }),
42
+ },
43
+ timeout: config.timeout,
44
+ });
45
+ // Initialize formatter and tokenizer
46
+ this.formatter = new OpenRouterMessageFormatter();
47
+ this.tokenizer = new OpenRouterTokenizer();
48
+ }
49
+ /**
50
+ * Estimate tokens synchronously using character-based approximation.
51
+ *
52
+ * @param content - Text to estimate tokens for
53
+ * @returns Estimated token count
54
+ */
55
+ estimateTokensSync(content) {
56
+ return this.tokenizer.countTokens(content);
57
+ }
58
+ /**
59
+ * Generate content (non-streaming).
60
+ *
61
+ * @param request - Generation request
62
+ * @returns Generated content response
63
+ */
64
+ async generateContent(request) {
65
+ // Format messages for OpenAI/OpenRouter
66
+ const formattedMessages = this.formatter.format(request.contents);
67
+ // Build tools array
68
+ const tools = this.buildTools(request.tools ?? {});
69
+ // Build messages with system prompt
70
+ const messages = request.systemPrompt
71
+ ? [{ content: request.systemPrompt, role: 'system' }, ...formattedMessages]
72
+ : formattedMessages;
73
+ // Call OpenRouter API
74
+ const rawResponse = await this.client.chat.completions.create({
75
+ // eslint-disable-next-line camelcase
76
+ max_tokens: request.config.maxTokens ?? this.config.maxTokens,
77
+ messages,
78
+ model: request.model ?? this.config.model,
79
+ temperature: request.config.temperature ?? this.config.temperature,
80
+ ...(tools.length > 0 && { tools: tools }),
81
+ });
82
+ // Parse response to internal format
83
+ const parsedMessages = this.formatter.parseResponse(rawResponse);
84
+ const lastMessage = parsedMessages.at(-1);
85
+ if (!lastMessage) {
86
+ return {
87
+ content: '',
88
+ finishReason: 'error',
89
+ rawResponse,
90
+ toolCalls: [],
91
+ };
92
+ }
93
+ // Extract content and tool calls
94
+ const content = this.extractTextContent(lastMessage);
95
+ const toolCalls = lastMessage.toolCalls ?? [];
96
+ // Determine finish reason
97
+ let finishReason = 'stop';
98
+ if (toolCalls.length > 0) {
99
+ finishReason = 'tool_calls';
100
+ }
101
+ else if (rawResponse.choices[0]?.finish_reason === 'length') {
102
+ finishReason = 'max_tokens';
103
+ }
104
+ // Extract usage if available
105
+ const usage = rawResponse.usage
106
+ ? {
107
+ completionTokens: rawResponse.usage.completion_tokens,
108
+ promptTokens: rawResponse.usage.prompt_tokens,
109
+ totalTokens: rawResponse.usage.total_tokens,
110
+ }
111
+ : undefined;
112
+ return {
113
+ content,
114
+ finishReason,
115
+ rawResponse,
116
+ toolCalls,
117
+ usage,
118
+ };
119
+ }
120
+ /**
121
+ * Generate content with streaming.
122
+ *
123
+ * Uses OpenAI SDK's native streaming support for real-time content generation.
124
+ *
125
+ * @param request - Generation request
126
+ * @yields Content chunks as they are generated
127
+ * @returns Async generator yielding content chunks
128
+ */
129
+ async *generateContentStream(request) {
130
+ // Format messages for OpenAI/OpenRouter
131
+ const formattedMessages = this.formatter.format(request.contents);
132
+ // Build tools array
133
+ const tools = this.buildTools(request.tools ?? {});
134
+ // Build messages with system prompt
135
+ const messages = request.systemPrompt
136
+ ? [{ content: request.systemPrompt, role: 'system' }, ...formattedMessages]
137
+ : formattedMessages;
138
+ // Call OpenRouter API with streaming
139
+ const stream = await this.client.chat.completions.create({
140
+ // eslint-disable-next-line camelcase
141
+ max_tokens: request.config.maxTokens ?? this.config.maxTokens,
142
+ messages,
143
+ model: request.model ?? this.config.model,
144
+ stream: true,
145
+ temperature: request.config.temperature ?? this.config.temperature,
146
+ ...(tools.length > 0 && { tools: tools }),
147
+ });
148
+ // Accumulate tool calls across chunks
149
+ const accumulatedToolCalls = new Map();
150
+ // Stream chunks
151
+ for await (const chunk of stream) {
152
+ const choice = chunk.choices[0];
153
+ if (!choice)
154
+ continue;
155
+ const { delta } = choice;
156
+ // Handle tool call deltas
157
+ if (delta.tool_calls) {
158
+ this.processToolCallDeltas(delta.tool_calls, accumulatedToolCalls);
159
+ }
160
+ // Yield content chunk
161
+ const isComplete = choice.finish_reason !== null;
162
+ const finishReason = this.determineFinishReason(choice.finish_reason, isComplete);
163
+ const toolCalls = this.buildToolCallsArray(accumulatedToolCalls, isComplete);
164
+ yield {
165
+ content: delta.content ?? undefined,
166
+ finishReason,
167
+ isComplete,
168
+ toolCalls,
169
+ };
170
+ }
171
+ }
172
+ /**
173
+ * Build tool calls array from accumulated tool calls.
174
+ */
175
+ buildToolCallsArray(accumulatedToolCalls, isComplete) {
176
+ if (!isComplete || accumulatedToolCalls.size === 0) {
177
+ return undefined;
178
+ }
179
+ return [...accumulatedToolCalls.values()].map((tc) => ({
180
+ function: {
181
+ arguments: tc.arguments,
182
+ name: tc.name,
183
+ },
184
+ id: tc.id,
185
+ type: 'function',
186
+ }));
187
+ }
188
+ /**
189
+ * Build tools array from ToolSet.
190
+ */
191
+ buildTools(tools) {
192
+ return Object.entries(tools).map(([name, schema]) => ({
193
+ function: {
194
+ description: schema.description ?? '',
195
+ name,
196
+ parameters: schema.parameters,
197
+ },
198
+ type: 'function',
199
+ }));
200
+ }
201
+ /**
202
+ * Determine finish reason from OpenAI finish reason.
203
+ */
204
+ determineFinishReason(finishReason, isComplete) {
205
+ if (!isComplete) {
206
+ return undefined;
207
+ }
208
+ if (finishReason === 'tool_calls') {
209
+ return 'tool_calls';
210
+ }
211
+ if (finishReason === 'length') {
212
+ return 'max_tokens';
213
+ }
214
+ return 'stop';
215
+ }
216
+ /**
217
+ * Extract text content from an internal message.
218
+ */
219
+ extractTextContent(message) {
220
+ if (typeof message.content === 'string') {
221
+ return message.content;
222
+ }
223
+ if (Array.isArray(message.content)) {
224
+ return message.content
225
+ .filter((part) => part.type === 'text')
226
+ .map((part) => (part.type === 'text' ? part.text : ''))
227
+ .join('');
228
+ }
229
+ return '';
230
+ }
231
+ /**
232
+ * Process tool call deltas and accumulate them.
233
+ */
234
+ processToolCallDeltas(toolCallDeltas, accumulatedToolCalls) {
235
+ for (const toolCallDelta of toolCallDeltas) {
236
+ const { function: func, id, index } = toolCallDelta;
237
+ const existing = accumulatedToolCalls.get(index);
238
+ if (existing) {
239
+ // Append to existing tool call
240
+ if (func?.arguments) {
241
+ existing.arguments += func.arguments;
242
+ }
243
+ }
244
+ else {
245
+ // Start new tool call
246
+ accumulatedToolCalls.set(index, {
247
+ arguments: func?.arguments ?? '',
248
+ id: id ?? `tool_${index}`,
249
+ name: func?.name ?? '',
250
+ });
251
+ }
252
+ }
253
+ }
254
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Retryable Content Generator Decorator.
3
+ *
4
+ * Wraps any IContentGenerator to add retry capabilities with exponential backoff.
5
+ * Handles transient errors like rate limits, timeouts, and server errors.
6
+ */
7
+ import type { GenerateContentChunk, GenerateContentRequest, GenerateContentResponse, IContentGenerator } from '../../../../core/interfaces/cipher/i-content-generator.js';
8
+ import type { SessionEventBus } from '../../events/event-emitter.js';
9
+ import { type RetryPolicy } from '../retry/retry-policy.js';
10
+ /**
11
+ * Options for the RetryableContentGenerator.
12
+ */
13
+ export interface RetryableOptions {
14
+ /** Event bus for emitting retry events */
15
+ eventBus?: SessionEventBus;
16
+ /** Retry policy configuration */
17
+ policy?: RetryPolicy;
18
+ }
19
+ /**
20
+ * Retryable Content Generator.
21
+ *
22
+ * Decorator that wraps any IContentGenerator to add retry capabilities.
23
+ * Uses exponential backoff with jitter to handle transient failures gracefully.
24
+ *
25
+ * Features:
26
+ * - Configurable retry policy
27
+ * - Exponential backoff with jitter
28
+ * - Retries on rate limits, timeouts, and server errors
29
+ * - Event emission for retry attempts
30
+ * - Streaming support with full request retry
31
+ */
32
+ export declare class RetryableContentGenerator implements IContentGenerator {
33
+ private readonly eventBus?;
34
+ private readonly inner;
35
+ private readonly policy;
36
+ /**
37
+ * Create a new Retryable Content Generator.
38
+ *
39
+ * @param inner - The wrapped content generator
40
+ * @param options - Retry options
41
+ */
42
+ constructor(inner: IContentGenerator, options?: RetryableOptions);
43
+ /**
44
+ * Estimate tokens (delegates to inner generator).
45
+ *
46
+ * @param content - Text to estimate tokens for
47
+ * @returns Estimated token count
48
+ */
49
+ estimateTokensSync(content: string): number;
50
+ /**
51
+ * Generate content with retry.
52
+ *
53
+ * @param request - Generation request
54
+ * @returns Generated content response
55
+ */
56
+ generateContent(request: GenerateContentRequest): Promise<GenerateContentResponse>;
57
+ /**
58
+ * Generate content with streaming and retry.
59
+ *
60
+ * Note: For streaming, we retry the entire request if an error occurs.
61
+ * This is because partial streams cannot be resumed mid-way.
62
+ *
63
+ * @param request - Generation request
64
+ * @yields Content chunks as they are generated
65
+ * @returns Async generator yielding content chunks
66
+ */
67
+ generateContentStream(request: GenerateContentRequest): AsyncGenerator<GenerateContentChunk>;
68
+ /**
69
+ * Attempt to generate content with retry logic.
70
+ */
71
+ private attemptGenerateContent;
72
+ /**
73
+ * Attempt to generate content stream with retry logic.
74
+ *
75
+ * @yields Content chunks as they are generated
76
+ */
77
+ private attemptGenerateContentStream;
78
+ /**
79
+ * Emit an exhausted event when all retries are used.
80
+ */
81
+ private emitExhausted;
82
+ /**
83
+ * Emit a retry event via warning.
84
+ */
85
+ private emitRetry;
86
+ /**
87
+ * Sleep for a specified duration.
88
+ */
89
+ private sleep;
90
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Retryable Content Generator Decorator.
3
+ *
4
+ * Wraps any IContentGenerator to add retry capabilities with exponential backoff.
5
+ * Handles transient errors like rate limits, timeouts, and server errors.
6
+ */
7
+ import { calculateRetryDelay, DEFAULT_RETRY_POLICY, isRetryableError, } from '../retry/retry-policy.js';
8
+ /**
9
+ * Retryable Content Generator.
10
+ *
11
+ * Decorator that wraps any IContentGenerator to add retry capabilities.
12
+ * Uses exponential backoff with jitter to handle transient failures gracefully.
13
+ *
14
+ * Features:
15
+ * - Configurable retry policy
16
+ * - Exponential backoff with jitter
17
+ * - Retries on rate limits, timeouts, and server errors
18
+ * - Event emission for retry attempts
19
+ * - Streaming support with full request retry
20
+ */
21
+ export class RetryableContentGenerator {
22
+ eventBus;
23
+ inner;
24
+ policy;
25
+ /**
26
+ * Create a new Retryable Content Generator.
27
+ *
28
+ * @param inner - The wrapped content generator
29
+ * @param options - Retry options
30
+ */
31
+ constructor(inner, options = {}) {
32
+ this.inner = inner;
33
+ this.policy = options.policy ?? DEFAULT_RETRY_POLICY;
34
+ this.eventBus = options.eventBus;
35
+ }
36
+ /**
37
+ * Estimate tokens (delegates to inner generator).
38
+ *
39
+ * @param content - Text to estimate tokens for
40
+ * @returns Estimated token count
41
+ */
42
+ estimateTokensSync(content) {
43
+ return this.inner.estimateTokensSync(content);
44
+ }
45
+ /**
46
+ * Generate content with retry.
47
+ *
48
+ * @param request - Generation request
49
+ * @returns Generated content response
50
+ */
51
+ async generateContent(request) {
52
+ const maxAttempts = this.policy.maxRetries + 1;
53
+ return this.attemptGenerateContent(request, 1, maxAttempts);
54
+ }
55
+ /**
56
+ * Generate content with streaming and retry.
57
+ *
58
+ * Note: For streaming, we retry the entire request if an error occurs.
59
+ * This is because partial streams cannot be resumed mid-way.
60
+ *
61
+ * @param request - Generation request
62
+ * @yields Content chunks as they are generated
63
+ * @returns Async generator yielding content chunks
64
+ */
65
+ async *generateContentStream(request) {
66
+ const maxAttempts = this.policy.maxRetries + 1;
67
+ yield* this.attemptGenerateContentStream(request, 1, maxAttempts);
68
+ }
69
+ /**
70
+ * Attempt to generate content with retry logic.
71
+ */
72
+ async attemptGenerateContent(request, attempt, maxAttempts) {
73
+ try {
74
+ return await this.inner.generateContent(request);
75
+ }
76
+ catch (error) {
77
+ // Check if this is the last attempt
78
+ if (attempt >= maxAttempts) {
79
+ this.emitExhausted(attempt, error);
80
+ throw error;
81
+ }
82
+ // Check if error is retryable
83
+ if (!isRetryableError(error, this.policy)) {
84
+ throw error;
85
+ }
86
+ // Calculate delay and emit retry event
87
+ const delayMs = calculateRetryDelay(attempt, this.policy);
88
+ this.emitRetry(attempt, maxAttempts, error, delayMs);
89
+ // Wait before retrying
90
+ await this.sleep(delayMs);
91
+ // Recursively attempt again
92
+ return this.attemptGenerateContent(request, attempt + 1, maxAttempts);
93
+ }
94
+ }
95
+ /**
96
+ * Attempt to generate content stream with retry logic.
97
+ *
98
+ * @yields Content chunks as they are generated
99
+ */
100
+ async *attemptGenerateContentStream(request, attempt, maxAttempts) {
101
+ try {
102
+ // Yield all chunks from the inner generator
103
+ for await (const chunk of this.inner.generateContentStream(request)) {
104
+ yield chunk;
105
+ }
106
+ }
107
+ catch (error) {
108
+ // Check if this is the last attempt
109
+ if (attempt >= maxAttempts) {
110
+ this.emitExhausted(attempt, error);
111
+ throw error;
112
+ }
113
+ // Check if error is retryable
114
+ if (!isRetryableError(error, this.policy)) {
115
+ throw error;
116
+ }
117
+ // Calculate delay and emit retry event
118
+ const delayMs = calculateRetryDelay(attempt, this.policy);
119
+ this.emitRetry(attempt, maxAttempts, error, delayMs);
120
+ // Wait before retrying
121
+ await this.sleep(delayMs);
122
+ // Recursively attempt again
123
+ yield* this.attemptGenerateContentStream(request, attempt + 1, maxAttempts);
124
+ }
125
+ }
126
+ /**
127
+ * Emit an exhausted event when all retries are used.
128
+ */
129
+ emitExhausted(attempts, error) {
130
+ const errorMessage = error instanceof Error ? error.message : String(error);
131
+ console.error(`[Retry] All ${attempts} attempts exhausted. Final error: ${errorMessage}`);
132
+ this.eventBus?.emit('llmservice:error', {
133
+ error: `All ${attempts} retry attempts exhausted: ${errorMessage}`,
134
+ });
135
+ }
136
+ /**
137
+ * Emit a retry event via warning.
138
+ */
139
+ emitRetry(attempt, maxAttempts, error, delayMs) {
140
+ const errorMessage = error instanceof Error ? error.message : String(error);
141
+ console.warn(`[Retry] Attempt ${attempt}/${maxAttempts} failed: ${errorMessage}. ` +
142
+ `Retrying in ${delayMs}ms...`);
143
+ this.eventBus?.emit('llmservice:warning', {
144
+ message: `Retry attempt ${attempt}/${maxAttempts} after ${delayMs}ms: ${errorMessage}`,
145
+ });
146
+ }
147
+ /**
148
+ * Sleep for a specified duration.
149
+ */
150
+ sleep(ms) {
151
+ return new Promise((resolve) => {
152
+ setTimeout(() => {
153
+ resolve();
154
+ }, ms);
155
+ });
156
+ }
157
+ }
@@ -0,0 +1,9 @@
1
+ export { LlmError, LlmGenerationError, LlmMaxIterationsError, LlmMissingToolExecutorError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
2
+ export type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
3
+ export { ContextManager, type FileData, type ImageData } from './context/context-manager.js';
4
+ export { GeminiMessageFormatter } from './formatters/gemini-formatter.js';
5
+ export { OpenRouterMessageFormatter } from './formatters/openrouter-formatter.js';
6
+ export { ByteRoverLLMService, type ByteRoverLLMServiceConfig, type LLMServiceConfig } from './internal-llm-service.js';
7
+ export { OpenRouterLLMService, type OpenRouterServiceConfig } from './openrouter-llm-service.js';
8
+ export { GeminiTokenizer } from './tokenizers/gemini-tokenizer.js';
9
+ export { OpenRouterTokenizer } from './tokenizers/openrouter-tokenizer.js';
@@ -0,0 +1,13 @@
1
+ // LLM errors
2
+ export { LlmError, LlmGenerationError, LlmMaxIterationsError, LlmMissingToolExecutorError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
3
+ // Context manager
4
+ export { ContextManager } from './context/context-manager.js';
5
+ // Message formatters
6
+ export { GeminiMessageFormatter } from './formatters/gemini-formatter.js';
7
+ export { OpenRouterMessageFormatter } from './formatters/openrouter-formatter.js';
8
+ // LLM services
9
+ export { ByteRoverLLMService } from './internal-llm-service.js';
10
+ export { OpenRouterLLMService } from './openrouter-llm-service.js';
11
+ // Tokenizers
12
+ export { GeminiTokenizer } from './tokenizers/gemini-tokenizer.js';
13
+ export { OpenRouterTokenizer } from './tokenizers/openrouter-tokenizer.js';