byterover-cli 0.2.1 → 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 (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 +48 -3
  18. package/dist/commands/init.js +242 -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,724 @@
1
+ import { AgentStateMachine } from '../../../core/domain/cipher/agent/agent-state-machine.js';
2
+ import { AgentState, TerminationReason } from '../../../core/domain/cipher/agent/agent-state.js';
3
+ import { LlmGenerationError, LlmMaxIterationsError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
4
+ import { NoOpLogger } from '../../../core/interfaces/cipher/i-logger.js';
5
+ import { getErrorMessage } from '../../../utils/error-helpers.js';
6
+ import { ContextManager } from './context/context-manager.js';
7
+ import { LoopDetector } from './context/loop-detector.js';
8
+ import { ClaudeMessageFormatter } from './formatters/claude-formatter.js';
9
+ import { GeminiMessageFormatter } from './formatters/gemini-formatter.js';
10
+ import { ThoughtParser } from './thought-parser.js';
11
+ import { ClaudeTokenizer } from './tokenizers/claude-tokenizer.js';
12
+ import { GeminiTokenizer } from './tokenizers/gemini-tokenizer.js';
13
+ import { ToolOutputProcessor } from './tool-output-processor.js';
14
+ /**
15
+ * ByteRover LLM Service.
16
+ *
17
+ * Orchestrates the agentic loop using IContentGenerator for LLM calls.
18
+ * Responsibilities:
19
+ * - Manage conversation context via ContextManager
20
+ * - Execute agentic loop (call LLM → execute tools → repeat)
21
+ * - Delegate tool execution to ToolManager
22
+ * - Delegate LLM calls to IContentGenerator
23
+ * - Handle errors and iteration limits
24
+ *
25
+ * Does NOT:
26
+ * - Execute tools directly (uses ToolManager)
27
+ * - Store persistent history (uses in-memory ContextManager)
28
+ * - Format messages for specific providers (handled by generators)
29
+ * - Handle retry logic (handled by RetryableContentGenerator decorator)
30
+ */
31
+ export class ByteRoverLLMService {
32
+ config;
33
+ contextManager;
34
+ formatter;
35
+ generator;
36
+ logger;
37
+ loopDetector;
38
+ memoryManager;
39
+ outputProcessor;
40
+ promptFactory;
41
+ providerType;
42
+ sessionEventBus;
43
+ tokenizer;
44
+ toolManager;
45
+ /**
46
+ * Initialize a new ByteRover LLM service instance.
47
+ *
48
+ * Sets up the service with all required dependencies and initializes:
49
+ * - Context manager for conversation history
50
+ * - Message formatter (Gemini or Claude format based on model)
51
+ * - Token counter/tokenizer for the selected model
52
+ * - Configuration with sensible defaults
53
+ *
54
+ * Each service instance maintains isolated conversation context,
55
+ * allowing multiple concurrent sessions with separate histories.
56
+ *
57
+ * @param sessionId - Unique identifier for this session
58
+ * @param generator - Content generator for LLM calls (with decorators pre-applied)
59
+ * @param config - LLM service configuration (model, tokens, temperature)
60
+ * @param options - Service dependencies
61
+ * @param options.toolManager - Tool manager for executing agent tools
62
+ * @param options.promptFactory - Simple prompt factory for building system prompts
63
+ * @param options.memoryManager - Memory manager for agent memories
64
+ * @param options.sessionEventBus - Event bus for session lifecycle events
65
+ * @param options.historyStorage - Optional history storage for persistence
66
+ * @param options.logger - Optional logger for structured logging
67
+ */
68
+ constructor(sessionId, generator, config, options) {
69
+ this.generator = generator;
70
+ this.toolManager = options.toolManager;
71
+ this.promptFactory = options.promptFactory;
72
+ this.memoryManager = options.memoryManager;
73
+ this.sessionEventBus = options.sessionEventBus;
74
+ this.logger = options.logger ?? new NoOpLogger();
75
+ this.outputProcessor = new ToolOutputProcessor(config.truncationConfig);
76
+ this.loopDetector = new LoopDetector();
77
+ this.config = {
78
+ maxInputTokens: config.maxInputTokens ?? 1_000_000,
79
+ maxIterations: config.maxIterations ?? 50,
80
+ maxTokens: config.maxTokens ?? 8192,
81
+ model: config.model ?? 'claude-haiku-4-5@20251001',
82
+ temperature: config.temperature ?? 0.7,
83
+ thinkingConfig: config.thinkingConfig,
84
+ timeout: config.timeout,
85
+ verbose: config.verbose ?? false,
86
+ };
87
+ // Detect provider type from model name
88
+ this.providerType = this.detectProviderType(this.config.model);
89
+ // Initialize formatter and tokenizer based on provider type
90
+ if (this.providerType === 'claude') {
91
+ this.formatter = new ClaudeMessageFormatter();
92
+ this.tokenizer = new ClaudeTokenizer(this.config.model);
93
+ }
94
+ else {
95
+ this.formatter = new GeminiMessageFormatter();
96
+ this.tokenizer = new GeminiTokenizer(this.config.model);
97
+ }
98
+ // Initialize context manager with optional history storage
99
+ this.contextManager = new ContextManager({
100
+ formatter: this.formatter,
101
+ historyStorage: options.historyStorage,
102
+ maxInputTokens: this.config.maxInputTokens,
103
+ sessionId,
104
+ tokenizer: this.tokenizer,
105
+ });
106
+ }
107
+ /**
108
+ * Complete a task with tool calling support.
109
+ *
110
+ * This is the main entry point for the agentic loop.
111
+ * It handles:
112
+ * 1. Adding user message to context
113
+ * 2. Looping: call LLM → check for tool calls → execute tools
114
+ * 3. Returning final response when no more tool calls
115
+ *
116
+ * @param textInput - User input text
117
+ * @param sessionId - Session ID for tracking the llm request in a command session
118
+ * @param options - Execution options
119
+ * @param options.executionContext - Optional execution context
120
+ * @param options.signal - Optional abort signal for cancellation
121
+ * @param options.imageData - Optional image data
122
+ * @param options.fileData - Optional file data
123
+ * @param options.stream - Whether to stream response (not implemented yet)
124
+ * @param options.mode - Optional mode for system prompt ('autonomous' enables autonomous mode)
125
+ * @returns Final assistant response
126
+ */
127
+ async completeTask(textInput, sessionId, options) {
128
+ // Extract options with defaults
129
+ const { executionContext, fileData, imageData, mode, signal } = options ?? {};
130
+ // Add user message to context
131
+ await this.contextManager.addUserMessage(textInput, imageData, fileData);
132
+ // Get filtered tools based on command type (e.g., only read-only tools for 'query')
133
+ const toolSet = this.toolManager.getToolsForCommand(options?.executionContext?.commandType);
134
+ // Create state machine with configured limits
135
+ const maxTimeMs = this.config.timeout ?? 600_000; // 10 min default
136
+ const stateMachine = new AgentStateMachine(this.config.maxIterations, maxTimeMs);
137
+ stateMachine.transition(AgentState.EXECUTING);
138
+ // Agentic loop with state machine
139
+ while (!stateMachine.isTerminal()) {
140
+ // Check termination conditions (timeout, max turns)
141
+ const terminationReason = stateMachine.shouldTerminate();
142
+ if (terminationReason) {
143
+ return this.handleTermination(terminationReason, stateMachine);
144
+ }
145
+ // Check if aborted via signal
146
+ if (signal?.aborted) {
147
+ stateMachine.abort();
148
+ throw new Error('Operation aborted');
149
+ }
150
+ try {
151
+ // eslint-disable-next-line no-await-in-loop -- Sequential iterations required for agentic loop
152
+ const result = await this.executeAgenticIteration({
153
+ executionContext,
154
+ iterationCount: stateMachine.getContext().turnCount,
155
+ mode,
156
+ sessionId,
157
+ tools: toolSet,
158
+ });
159
+ if (result !== null) {
160
+ // Task complete - no tool calls
161
+ stateMachine.complete();
162
+ return result;
163
+ }
164
+ // Tool calls were executed, continue loop
165
+ stateMachine.incrementTurn();
166
+ }
167
+ catch (error) {
168
+ stateMachine.fail(error);
169
+ this.handleLLMError(error);
170
+ }
171
+ }
172
+ // Should not reach here - state machine should exit via terminal states
173
+ throw new Error('Agent loop terminated unexpectedly');
174
+ }
175
+ /**
176
+ * Get all available tools for the agent.
177
+ *
178
+ * Retrieves the current set of tools that can be used during task execution.
179
+ * These tools are passed to the LLM to enable function calling capabilities.
180
+ *
181
+ * @returns Promise resolving to a map of tool names to their schemas
182
+ */
183
+ async getAllTools() {
184
+ return this.toolManager.getAllTools();
185
+ }
186
+ /**
187
+ * Get the service's runtime configuration.
188
+ *
189
+ * Returns metadata about the service including:
190
+ * - Configured and model-specific token limits
191
+ * - Selected LLM model
192
+ * - Provider name (always 'byterover')
193
+ * - Router type (always 'in-built')
194
+ *
195
+ * This is useful for introspecting service capabilities and limits
196
+ * without needing access to the internal config object.
197
+ *
198
+ * @returns Service configuration object with model info and constraints
199
+ */
200
+ getConfig() {
201
+ return {
202
+ configuredMaxInputTokens: this.config.maxInputTokens,
203
+ model: this.config.model,
204
+ modelMaxInputTokens: this.config.maxInputTokens,
205
+ provider: 'byterover',
206
+ router: 'in-built',
207
+ };
208
+ }
209
+ /**
210
+ * Get access to the conversation context manager.
211
+ *
212
+ * Provides access to the ContextManager instance that maintains:
213
+ * - Conversation history (messages and responses)
214
+ * - Token counting and compression
215
+ * - Message formatting for the selected model
216
+ *
217
+ * Useful for:
218
+ * - Inspecting conversation state
219
+ * - Retrieving formatted messages
220
+ * - Managing context during multi-turn interactions
221
+ *
222
+ * @returns The ContextManager instance managing conversation state
223
+ */
224
+ getContextManager() {
225
+ return this.contextManager;
226
+ }
227
+ /**
228
+ * Initialize the LLM service by loading persisted history.
229
+ * Should be called after construction to restore previous conversation.
230
+ *
231
+ * @returns True if history was loaded, false otherwise
232
+ */
233
+ async initialize() {
234
+ return this.contextManager.initialize();
235
+ }
236
+ /**
237
+ * Add a parallel tool result to the context.
238
+ * Called sequentially after parallel execution to preserve message order.
239
+ *
240
+ * @param result - Parallel tool result to add
241
+ */
242
+ async addParallelToolResultToContext(result) {
243
+ const { toolCall, toolResult } = result;
244
+ if (!toolResult) {
245
+ // This shouldn't happen, but handle gracefully
246
+ await this.contextManager.addToolResult(toolCall.id, toolCall.function.name, 'Error: No tool result available', { errorType: 'NO_RESULT', success: false });
247
+ return;
248
+ }
249
+ await this.contextManager.addToolResult(toolCall.id, toolCall.function.name, toolResult.processedOutput.content, {
250
+ errorType: toolResult.errorType,
251
+ metadata: toolResult.metadata,
252
+ success: toolResult.success,
253
+ });
254
+ }
255
+ /**
256
+ * Build generation request for the IContentGenerator.
257
+ *
258
+ * Converts internal context to the standardized GenerateContentRequest format.
259
+ *
260
+ * @param sessionId - Session ID for tracking the llm request in a command session
261
+ * @param systemPrompt - System prompt text
262
+ * @param tools - Available tools for function calling
263
+ * @param mode - Optional mode for system prompt
264
+ * @param executionContext - Optional execution context
265
+ * @returns GenerateContentRequest for the generator
266
+ */
267
+ buildGenerateContentRequest(sessionId, systemPrompt, tools, mode, executionContext) {
268
+ // Get internal messages from context manager
269
+ const messages = this.contextManager.getMessages();
270
+ return {
271
+ config: {
272
+ maxTokens: this.config.maxTokens,
273
+ temperature: this.config.temperature,
274
+ },
275
+ contents: messages,
276
+ executionContext,
277
+ mode,
278
+ model: this.config.model,
279
+ sessionId,
280
+ systemPrompt,
281
+ tools,
282
+ };
283
+ }
284
+ /**
285
+ * Call LLM via generator and process the response.
286
+ *
287
+ * Uses the IContentGenerator interface which already has:
288
+ * - Retry logic (via RetryableContentGenerator decorator)
289
+ * - Logging (via LoggingContentGenerator decorator)
290
+ *
291
+ * @param request - Generation request
292
+ * @returns Parsed internal message from response
293
+ */
294
+ async callLLMAndParseResponse(request) {
295
+ try {
296
+ const response = await this.generator.generateContent(request);
297
+ // Convert response to InternalMessage format
298
+ const message = {
299
+ content: response.content,
300
+ role: 'assistant',
301
+ toolCalls: response.toolCalls,
302
+ };
303
+ // Validate the message has content or tool calls
304
+ if (!message.content && (!message.toolCalls || message.toolCalls.length === 0)) {
305
+ throw new LlmResponseParsingError('Response has neither content nor tool calls', 'byterover', this.config.model);
306
+ }
307
+ return message;
308
+ }
309
+ catch (error) {
310
+ // Re-throw LLM errors as-is
311
+ if (error instanceof LlmResponseParsingError || error instanceof LlmGenerationError) {
312
+ throw error;
313
+ }
314
+ // Wrap other errors
315
+ throw new LlmGenerationError(error instanceof Error ? error.message : String(error), 'byterover', this.config.model);
316
+ }
317
+ }
318
+ /**
319
+ * Detect provider type from model name.
320
+ *
321
+ * @param model - Model identifier
322
+ * @returns Provider type ('claude' or 'gemini')
323
+ */
324
+ detectProviderType(model) {
325
+ return model.toLowerCase().startsWith('claude') ? 'claude' : 'gemini';
326
+ }
327
+ /**
328
+ * Determine which reflection prompt to add based on hierarchical priority.
329
+ * Only the highest priority eligible reflection is returned.
330
+ *
331
+ * Priority (highest to lowest):
332
+ * 1. final_iteration - query only, at the last iteration
333
+ * 2. near_max_iterations - general, at 80% threshold
334
+ * 3. mid_point_check - query only, at 50% threshold
335
+ * 4. completion_check - general, periodic every 3 iterations
336
+ *
337
+ * @param iterationCount - Current iteration count (0-indexed)
338
+ * @param commandType - Command type ('query' or 'curate')
339
+ * @returns Reflection type to add, or undefined if none eligible
340
+ */
341
+ determineReflectionType(iterationCount, commandType) {
342
+ const isQuery = commandType === 'query';
343
+ const isLastIteration = iterationCount === this.config.maxIterations - 1;
344
+ const midPoint = Math.floor(this.config.maxIterations / 2);
345
+ const isAtMidPoint = iterationCount === midPoint;
346
+ const isNearMax = iterationCount >= Math.floor(this.config.maxIterations * 0.8);
347
+ const isPeriodicCheck = iterationCount > 0 && iterationCount % 3 === 0;
348
+ // Priority 1: final_iteration (query only, last iteration) - highest priority
349
+ if (isQuery && isLastIteration) {
350
+ return 'final_iteration';
351
+ }
352
+ // Priority 2: near_max_iterations (general, 80% threshold)
353
+ if (isNearMax) {
354
+ return 'near_max_iterations';
355
+ }
356
+ // Priority 3: mid_point_check (query only, 50% threshold)
357
+ if (isQuery && isAtMidPoint) {
358
+ return 'mid_point_check';
359
+ }
360
+ // Priority 4: completion_check (general, periodic every 3 iterations) - lowest priority
361
+ if (isPeriodicCheck) {
362
+ return 'completion_check';
363
+ }
364
+ return undefined;
365
+ }
366
+ /**
367
+ * Execute a single iteration of the agentic loop.
368
+ *
369
+ * @param options - Iteration options
370
+ * @param options.iterationCount - Current iteration number
371
+ * @param options.sessionId - Session ID for tracking the llm request in a command session
372
+ * @param options.tools - Available tools for this iteration
373
+ * @param options.mode - Optional mode for system prompt
374
+ * @param options.executionContext - Optional execution context
375
+ * @returns Final response string if complete, null if more iterations needed
376
+ */
377
+ async executeAgenticIteration(options) {
378
+ const { executionContext, iterationCount, mode, sessionId, tools } = options;
379
+ // Build system prompt using SimplePromptFactory (before compression for correct token accounting)
380
+ // Use filtered tool names based on command type (e.g., only read-only tools for 'query')
381
+ const availableTools = this.toolManager.getToolNamesForCommand(executionContext?.commandType);
382
+ const markersSet = this.toolManager.getAvailableMarkers();
383
+ // Convert Set to Record for prompt factory
384
+ const availableMarkers = {};
385
+ for (const marker of markersSet) {
386
+ availableMarkers[marker] = marker;
387
+ }
388
+ let systemPrompt = await this.promptFactory.buildSystemPrompt({
389
+ availableMarkers,
390
+ availableTools,
391
+ commandType: executionContext?.commandType,
392
+ conversationMetadata: executionContext?.conversationMetadata,
393
+ memoryManager: this.memoryManager,
394
+ mode,
395
+ });
396
+ // Determine which reflection prompt to add (only highest priority is chosen)
397
+ const reflectionType = this.determineReflectionType(iterationCount, executionContext?.commandType);
398
+ // Add reflection prompt if eligible (hierarchical: only one reflection per iteration)
399
+ if (reflectionType) {
400
+ const reflectionPrompt = this.promptFactory.buildReflectionPrompt({
401
+ currentIteration: iterationCount + 1,
402
+ maxIterations: this.config.maxIterations,
403
+ type: reflectionType,
404
+ });
405
+ systemPrompt = systemPrompt + '\n\n' + reflectionPrompt;
406
+ }
407
+ // Verbose debug: Show complete system prompt
408
+ if (this.config.verbose) {
409
+ this.logger.debug('System prompt details', {
410
+ first500Chars: systemPrompt.slice(0, 500),
411
+ iteration: iterationCount + 1,
412
+ last500Chars: systemPrompt.slice(-500),
413
+ length: systemPrompt.length,
414
+ lines: systemPrompt.split('\n').length,
415
+ reflectionType,
416
+ });
417
+ }
418
+ // Get token count for logging (using system prompt for token accounting)
419
+ const systemPromptTokens = this.generator.estimateTokensSync(systemPrompt);
420
+ const messagesTokens = this.contextManager
421
+ .getMessages()
422
+ .reduce((total, msg) => total +
423
+ this.generator.estimateTokensSync(typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)), 0);
424
+ const tokensUsed = systemPromptTokens + messagesTokens;
425
+ // Verbose: Log messages that will be sent to LLM
426
+ if (this.config.verbose) {
427
+ console.log('\n========== MESSAGES (Sent to LLM) ==========');
428
+ console.log(JSON.stringify(this.contextManager.getMessages(), null, 2));
429
+ console.log('========== END MESSAGES ==========\n');
430
+ // Log token usage for monitoring compression behavior
431
+ console.log(`[ByteRoverLLMService] [Iter ${iterationCount + 1}/${this.config.maxIterations}] Sending to LLM: ${tokensUsed} tokens (max: ${this.config.maxInputTokens})`);
432
+ }
433
+ // Final iteration optimization for query: strip tools (reflection already added above)
434
+ let toolsForThisIteration = tools;
435
+ if (executionContext?.commandType === 'query' && iterationCount === this.config.maxIterations - 1) {
436
+ toolsForThisIteration = {}; // Empty toolset forces text response
437
+ }
438
+ // Build generation request
439
+ const request = this.buildGenerateContentRequest(sessionId, systemPrompt, toolsForThisIteration, mode, executionContext);
440
+ // Call LLM via generator (retry + logging handled by decorators)
441
+ const lastMessage = await this.callLLMAndParseResponse(request);
442
+ // Check if there are tool calls
443
+ if (!lastMessage.toolCalls || lastMessage.toolCalls.length === 0) {
444
+ return this.handleFinalResponse(lastMessage);
445
+ }
446
+ // Has tool calls - handle them
447
+ await this.handleToolCalls(lastMessage);
448
+ return null;
449
+ }
450
+ /**
451
+ * Execute a single tool call in parallel (without adding to context).
452
+ * Returns all information needed to add the result to context later.
453
+ *
454
+ * @param toolCall - Tool call to execute
455
+ * @returns Parallel tool result with all execution data
456
+ */
457
+ async executeToolCallParallel(toolCall) {
458
+ const toolName = toolCall.function.name;
459
+ const toolArgs = JSON.parse(toolCall.function.arguments);
460
+ try {
461
+ // Check for loops before execution (mutex-protected)
462
+ const loopResult = await this.loopDetector.recordAndCheck(toolName, toolArgs);
463
+ if (loopResult.isLoop) {
464
+ // Emit warning event
465
+ this.sessionEventBus.emit('llmservice:warning', {
466
+ message: `Loop detected: ${loopResult.loopType} - tool "${toolName}" repeated ${loopResult.repeatCount} times`,
467
+ });
468
+ return {
469
+ toolCall,
470
+ toolResult: {
471
+ errorType: 'LOOP_DETECTED',
472
+ metadata: {},
473
+ processedOutput: {
474
+ content: `⚠️ LOOP DETECTED: ${loopResult.suggestion}\n\nPlease try a different approach to accomplish your goal.`,
475
+ },
476
+ success: false,
477
+ },
478
+ };
479
+ }
480
+ // Emit tool call event
481
+ this.sessionEventBus.emit('llmservice:toolCall', {
482
+ args: toolArgs,
483
+ callId: toolCall.id,
484
+ toolName,
485
+ });
486
+ // Execute tool via ToolManager (returns structured result)
487
+ const result = await this.toolManager.executeTool(toolName, toolArgs);
488
+ // Process output (truncation and file saving if needed)
489
+ const processedOutput = await this.outputProcessor.processOutput(toolName, result.content);
490
+ // Emit truncation event if output was truncated
491
+ if (processedOutput.metadata?.truncated) {
492
+ this.sessionEventBus.emit('llmservice:outputTruncated', {
493
+ originalLength: processedOutput.metadata.originalLength,
494
+ savedToFile: processedOutput.metadata.savedToFile,
495
+ toolName,
496
+ });
497
+ }
498
+ // Emit tool result event with success/error info
499
+ this.sessionEventBus.emit('llmservice:toolResult', {
500
+ callId: toolCall.id,
501
+ errorType: result.errorType,
502
+ metadata: {
503
+ ...result.metadata,
504
+ ...processedOutput.metadata,
505
+ },
506
+ result: processedOutput.content,
507
+ success: result.success,
508
+ toolName,
509
+ });
510
+ return {
511
+ toolCall,
512
+ toolResult: {
513
+ errorType: result.errorType,
514
+ metadata: {
515
+ ...result.metadata,
516
+ ...processedOutput.metadata,
517
+ },
518
+ processedOutput,
519
+ success: result.success,
520
+ },
521
+ };
522
+ }
523
+ catch (error) {
524
+ // Catch any unexpected errors during execution
525
+ const errorMessage = getErrorMessage(error);
526
+ this.logger.error('Error executing tool in parallel', { error, toolCallId: toolCall.id, toolName });
527
+ return {
528
+ error: errorMessage,
529
+ toolCall,
530
+ toolResult: {
531
+ errorType: 'EXECUTION_ERROR',
532
+ metadata: {},
533
+ processedOutput: { content: `Error executing tool: ${errorMessage}` },
534
+ success: false,
535
+ },
536
+ };
537
+ }
538
+ }
539
+ /**
540
+ * Extract text content from an internal message.
541
+ *
542
+ * @param message - Internal message
543
+ * @returns Text content as string
544
+ */
545
+ extractTextContent(message) {
546
+ if (typeof message.content === 'string') {
547
+ return message.content;
548
+ }
549
+ if (Array.isArray(message.content)) {
550
+ return message.content
551
+ .filter((part) => part.type === 'text')
552
+ .map((part) => (part.type === 'text' ? part.text : ''))
553
+ .join('');
554
+ }
555
+ return '';
556
+ }
557
+ /**
558
+ * Extract partial response from conversation history when max iterations reached.
559
+ * Returns the last assistant message or accumulated tool outputs.
560
+ *
561
+ * @returns Partial response string
562
+ */
563
+ async getPartialResponse() {
564
+ const history = this.contextManager.getMessages();
565
+ // Find last assistant message
566
+ for (let i = history.length - 1; i >= 0; i--) {
567
+ const msg = history[i];
568
+ if (msg && msg.role === 'assistant') {
569
+ return this.extractTextContent(msg);
570
+ }
571
+ }
572
+ return '';
573
+ }
574
+ /**
575
+ * Handle final response when there are no tool calls.
576
+ *
577
+ * @param lastMessage - Last message from LLM
578
+ * @returns Final response content
579
+ */
580
+ async handleFinalResponse(lastMessage) {
581
+ const content = this.extractTextContent(lastMessage);
582
+ // Emit response event
583
+ this.sessionEventBus.emit('llmservice:response', {
584
+ content,
585
+ model: this.config.model,
586
+ provider: 'byterover',
587
+ });
588
+ // Add assistant message to context
589
+ await this.contextManager.addAssistantMessage(content);
590
+ return content;
591
+ }
592
+ /**
593
+ * Handle LLM errors and re-throw or wrap appropriately.
594
+ *
595
+ * @param error - Error to handle
596
+ */
597
+ handleLLMError(error) {
598
+ // Emit error event
599
+ const errorMessage = error instanceof Error ? error.message : String(error);
600
+ this.sessionEventBus.emit('llmservice:error', {
601
+ error: errorMessage,
602
+ });
603
+ // Re-throw LLM errors as-is
604
+ if (error instanceof LlmResponseParsingError ||
605
+ error instanceof LlmGenerationError ||
606
+ error instanceof LlmMaxIterationsError) {
607
+ throw error;
608
+ }
609
+ // Wrap other errors
610
+ if (error && typeof error === 'object' && 'message' in error) {
611
+ throw new LlmGenerationError(getErrorMessage(error), 'byterover', this.config.model);
612
+ }
613
+ throw new LlmGenerationError(String(error), 'byterover', this.config.model);
614
+ }
615
+ /**
616
+ * Handle agent termination due to timeout or max turns.
617
+ *
618
+ * Emits appropriate events and returns a partial response.
619
+ *
620
+ * @param reason - Why the agent is terminating
621
+ * @param stateMachine - The state machine for context
622
+ * @returns Partial response or fallback message
623
+ */
624
+ async handleTermination(reason, stateMachine) {
625
+ const context = stateMachine.getContext();
626
+ const durationMs = Date.now() - context.startTime.getTime();
627
+ this.logger.warn('Agent execution terminated', {
628
+ durationMs,
629
+ reason,
630
+ toolCallsExecuted: context.toolCallsExecuted,
631
+ turnCount: context.turnCount,
632
+ });
633
+ // Emit termination event
634
+ this.sessionEventBus.emit('llmservice:warning', {
635
+ message: `Agent terminated: ${reason} after ${context.turnCount} turns`,
636
+ model: this.config.model,
637
+ provider: 'byterover',
638
+ });
639
+ // Get accumulated response from context
640
+ const partialResponse = await this.getPartialResponse();
641
+ this.sessionEventBus.emit('llmservice:response', {
642
+ content: partialResponse,
643
+ model: this.config.model,
644
+ partial: true,
645
+ provider: 'byterover',
646
+ });
647
+ if (reason === TerminationReason.MAX_TURNS) {
648
+ return (partialResponse ||
649
+ 'Maximum iterations reached without completing the task. Please try breaking down the task into smaller steps.');
650
+ }
651
+ if (reason === TerminationReason.TIMEOUT) {
652
+ return partialResponse || 'Execution timed out. Please try a simpler task or increase the timeout.';
653
+ }
654
+ return partialResponse || 'Agent execution terminated unexpectedly.';
655
+ }
656
+ /**
657
+ * Handle thoughts from LLM response (Gemini only).
658
+ *
659
+ * Extracts and emits thought events if present.
660
+ *
661
+ * @param message - Message potentially containing thoughts
662
+ */
663
+ handleThoughts(message) {
664
+ // Only process thoughts for Gemini models
665
+ if (this.providerType !== 'gemini') {
666
+ return;
667
+ }
668
+ // Check if message has thought content
669
+ if (message.thought) {
670
+ // Parse thought if not already parsed
671
+ if (!message.thoughtSummary) {
672
+ message.thoughtSummary = ThoughtParser.parse(message.thought);
673
+ }
674
+ // Emit thought event
675
+ this.sessionEventBus.emit('llmservice:thought', {
676
+ description: message.thoughtSummary.description,
677
+ subject: message.thoughtSummary.subject,
678
+ });
679
+ }
680
+ }
681
+ /**
682
+ * Handle tool calls from LLM response.
683
+ * Executes tools in parallel for performance, but adds results to context in order.
684
+ *
685
+ * @param lastMessage - Last message containing tool calls
686
+ */
687
+ async handleToolCalls(lastMessage) {
688
+ if (!lastMessage.toolCalls || lastMessage.toolCalls.length === 0) {
689
+ return;
690
+ }
691
+ // Emit thought events if present
692
+ this.handleThoughts(lastMessage);
693
+ // Has tool calls - add assistant message with tool calls
694
+ const assistantContent = this.extractTextContent(lastMessage);
695
+ await this.contextManager.addAssistantMessage(assistantContent, lastMessage.toolCalls);
696
+ // Execute all tool calls in parallel
697
+ const parallelResults = await Promise.allSettled(lastMessage.toolCalls.map((toolCall) => this.executeToolCallParallel(toolCall)));
698
+ // Add results to context IN ORDER (preserves conversation flow)
699
+ // eslint-disable-next-line unicorn/no-for-loop -- Need index to access both parallelResults and toolCalls in parallel
700
+ for (let i = 0; i < parallelResults.length; i++) {
701
+ const settledResult = parallelResults[i];
702
+ const toolCall = lastMessage.toolCalls[i];
703
+ if (settledResult.status === 'fulfilled') {
704
+ const result = settledResult.value;
705
+ // eslint-disable-next-line no-await-in-loop -- Must add results in order
706
+ await this.addParallelToolResultToContext(result);
707
+ }
708
+ else {
709
+ // Handle unexpected Promise rejection (should be rare since executeToolCallParallel catches errors)
710
+ const errorMessage = getErrorMessage(settledResult.reason);
711
+ this.logger.error('Unexpected error in parallel tool execution', {
712
+ error: settledResult.reason,
713
+ toolCallId: toolCall.id,
714
+ toolName: toolCall.function.name,
715
+ });
716
+ // eslint-disable-next-line no-await-in-loop -- Must add results in order
717
+ await this.contextManager.addToolResult(toolCall.id, toolCall.function.name, `Error: ${errorMessage}`, {
718
+ errorType: 'UNEXPECTED_ERROR',
719
+ success: false,
720
+ });
721
+ }
722
+ }
723
+ }
724
+ }