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,253 @@
1
+ /**
2
+ * Message formatter for Google Gemini API.
3
+ *
4
+ * Converts the internal message format to Gemini's specific structure:
5
+ * - Maps 'assistant' role to 'model' (Gemini's terminology)
6
+ * - System prompts are injected as user messages (Gemini doesn't have system role)
7
+ * - Tool calls use functionCall parts
8
+ * - Tool results use functionResponse parts in user messages
9
+ */
10
+ export class GeminiMessageFormatter {
11
+ /**
12
+ * Formats internal messages into Gemini's API format.
13
+ *
14
+ * @param history Array of internal messages to format
15
+ * @param systemPrompt Optional system prompt to include at the beginning
16
+ * @returns Array of Content objects formatted for Gemini's API
17
+ */
18
+ format(history, systemPrompt) {
19
+ const contents = [];
20
+ // Add system prompt as a user message if provided
21
+ // Gemini doesn't have a separate system role
22
+ if (systemPrompt) {
23
+ contents.push({
24
+ parts: [{ text: `System: ${systemPrompt}` }],
25
+ role: 'user',
26
+ });
27
+ }
28
+ // Accumulator for consecutive tool results
29
+ let toolGroup = [];
30
+ for (const msg of history) {
31
+ if (msg.role === 'tool') {
32
+ // Accumulate tool results
33
+ toolGroup.push(msg);
34
+ }
35
+ else {
36
+ // Flush accumulated tool results before processing non-tool message
37
+ if (toolGroup.length > 0) {
38
+ contents.push(this.combineToolResults(toolGroup));
39
+ toolGroup = [];
40
+ }
41
+ // Format non-tool message
42
+ contents.push(this.formatNonToolMessage(msg));
43
+ }
44
+ }
45
+ // Flush any remaining tool results
46
+ if (toolGroup.length > 0) {
47
+ contents.push(this.combineToolResults(toolGroup));
48
+ }
49
+ return contents;
50
+ }
51
+ /**
52
+ * Parses Gemini API response into internal message objects.
53
+ *
54
+ * @param response The raw response from Gemini API
55
+ * @returns Array of internal messages (typically one assistant message)
56
+ */
57
+ parseResponse(response) {
58
+ const typedResponse = response;
59
+ if (!typedResponse.candidates || typedResponse.candidates.length === 0) {
60
+ return [];
61
+ }
62
+ const candidate = typedResponse.candidates[0];
63
+ if (!candidate?.content?.parts) {
64
+ return [];
65
+ }
66
+ const textParts = [];
67
+ const functionCalls = [];
68
+ // Extract text and function calls from response parts
69
+ for (const part of candidate.content.parts) {
70
+ if ('text' in part && part.text) {
71
+ textParts.push(part.text);
72
+ }
73
+ if ('functionCall' in part && part.functionCall) {
74
+ functionCalls.push(part.functionCall);
75
+ }
76
+ }
77
+ // Convert to internal message format
78
+ const toolCalls = functionCalls.length > 0
79
+ ? functionCalls.map((fc) => ({
80
+ function: {
81
+ arguments: JSON.stringify(fc.args ?? {}),
82
+ name: fc.name ?? '',
83
+ },
84
+ id: this.generateToolCallId(fc.name ?? ''),
85
+ type: 'function',
86
+ }))
87
+ : undefined;
88
+ return [
89
+ {
90
+ content: textParts.join('') || null,
91
+ role: 'assistant',
92
+ toolCalls,
93
+ },
94
+ ];
95
+ }
96
+ /**
97
+ * Combines multiple tool results into a single Gemini user message.
98
+ * Required by Gemini API when assistant made multiple tool calls.
99
+ */
100
+ combineToolResults(toolMessages) {
101
+ return {
102
+ parts: toolMessages.map((msg) => this.formatToolResultPart(msg)),
103
+ role: 'user',
104
+ };
105
+ }
106
+ /**
107
+ * Formats assistant message to Gemini's Content format.
108
+ * Maps 'assistant' role to 'model' and includes both text and tool calls.
109
+ */
110
+ formatAssistantMessage(msg) {
111
+ const parts = [];
112
+ // Add text content if present
113
+ if (msg.content) {
114
+ parts.push({ text: String(msg.content) });
115
+ }
116
+ // Add tool calls if present
117
+ if (msg.toolCalls) {
118
+ for (const tc of msg.toolCalls) {
119
+ parts.push({
120
+ functionCall: {
121
+ args: JSON.parse(tc.function.arguments),
122
+ name: tc.function.name,
123
+ },
124
+ });
125
+ }
126
+ }
127
+ return {
128
+ parts,
129
+ role: 'model', // Gemini uses 'model' instead of 'assistant'
130
+ };
131
+ }
132
+ /**
133
+ * Formats a single non-tool message to Gemini Content.
134
+ */
135
+ formatNonToolMessage(msg) {
136
+ switch (msg.role) {
137
+ case 'assistant': {
138
+ return this.formatAssistantMessage(msg);
139
+ }
140
+ case 'system': {
141
+ return {
142
+ parts: [{ text: `System: ${String(msg.content || '')}` }],
143
+ role: 'user',
144
+ };
145
+ }
146
+ case 'user': {
147
+ return this.formatUserMessage(msg);
148
+ }
149
+ default: {
150
+ return {
151
+ parts: [{ text: String(msg.content || '') }],
152
+ role: 'user',
153
+ };
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Formats a single tool result message to a Gemini functionResponse Part.
159
+ * Multiple tool results are combined into a single user message by format().
160
+ *
161
+ * Note: msg.content is a JSON string from ToolOutputProcessor.
162
+ * We need to parse it back to an object for Gemini's API.
163
+ */
164
+ formatToolResultPart(msg) {
165
+ // msg.content is a JSON string from ToolOutputProcessor
166
+ // Parse it back to object for Gemini's API
167
+ let responseObject;
168
+ try {
169
+ // Try to parse as JSON
170
+ if (typeof msg.content === 'string') {
171
+ responseObject = JSON.parse(msg.content);
172
+ }
173
+ else if (msg.content === null) {
174
+ responseObject = { result: null };
175
+ }
176
+ else if (Array.isArray(msg.content)) {
177
+ // Array content (e.g., MessagePart[]) - wrap in result
178
+ responseObject = { result: msg.content };
179
+ }
180
+ else if (typeof msg.content === 'object') {
181
+ // Already an object (shouldn't happen with current implementation, but handle it)
182
+ responseObject = msg.content;
183
+ }
184
+ else {
185
+ // Primitive types - wrap them
186
+ responseObject = { result: msg.content };
187
+ }
188
+ }
189
+ catch {
190
+ // If parsing fails, wrap the string as-is
191
+ responseObject = { result: msg.content };
192
+ }
193
+ return {
194
+ functionResponse: {
195
+ name: msg.name ?? '',
196
+ response: responseObject,
197
+ },
198
+ };
199
+ }
200
+ /**
201
+ * Formats a single user content part.
202
+ * Currently supports text parts, with placeholders for image/file support.
203
+ */
204
+ formatUserContentPart(part) {
205
+ if (part.type === 'text') {
206
+ return { text: part.text };
207
+ }
208
+ if (part.type === 'image') {
209
+ // Image support not yet implemented for Gemini
210
+ // Gemini supports inline images via inlineData or fileData
211
+ return { text: '[Image not yet supported]' };
212
+ }
213
+ if (part.type === 'file') {
214
+ // File support not yet implemented for Gemini
215
+ return { text: '[File not yet supported]' };
216
+ }
217
+ return { text: '[Unknown content type]' };
218
+ }
219
+ /**
220
+ * Formats user message to Gemini's Content format.
221
+ * Handles both simple string content and multimodal content parts.
222
+ */
223
+ formatUserMessage(msg) {
224
+ const parts = [];
225
+ if (typeof msg.content === 'string') {
226
+ // Simple text message
227
+ parts.push({ text: msg.content });
228
+ }
229
+ else if (Array.isArray(msg.content)) {
230
+ // Multimodal content (text, images, files)
231
+ for (const part of msg.content) {
232
+ parts.push(this.formatUserContentPart(part));
233
+ }
234
+ }
235
+ return {
236
+ parts,
237
+ role: 'user',
238
+ };
239
+ }
240
+ /**
241
+ * Generates a unique tool call ID.
242
+ * Gemini doesn't provide tool call IDs, so we generate them.
243
+ *
244
+ * @param toolName The name of the tool being called
245
+ * @returns A unique identifier for the tool call
246
+ */
247
+ generateToolCallId(toolName) {
248
+ // Simple ID generation: timestamp + random + tool name
249
+ const timestamp = Date.now();
250
+ const random = Math.random().toString(36).slice(2, 9);
251
+ return `call_${timestamp}_${random}_${toolName}`;
252
+ }
253
+ }
@@ -0,0 +1,47 @@
1
+ import type { ChatCompletionMessageParam } from 'openai/resources';
2
+ import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
3
+ import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
4
+ /**
5
+ * Message formatter for OpenRouter API.
6
+ *
7
+ * OpenRouter uses OpenAI-compatible API format:
8
+ * - System prompts are included in the messages array
9
+ * - Tool calls use the tool_calls property
10
+ * - Tool results use the 'tool' role with tool_call_id
11
+ * - Supports multimodal content (text, images, files)
12
+ */
13
+ export declare class OpenRouterMessageFormatter implements IMessageFormatter<ChatCompletionMessageParam> {
14
+ /**
15
+ * Formats internal messages into OpenRouter's API format (OpenAI-compatible).
16
+ *
17
+ * @param history Array of internal messages to format
18
+ * @param systemPrompt Optional system prompt to include at the beginning
19
+ * @returns Array of messages formatted for OpenRouter's API
20
+ */
21
+ format(history: Readonly<InternalMessage[]>, systemPrompt?: null | string): ChatCompletionMessageParam[];
22
+ /**
23
+ * Parses OpenRouter API response into internal message objects.
24
+ *
25
+ * @param response The raw response from OpenRouter API
26
+ * @returns Array of internal messages (typically one assistant message)
27
+ */
28
+ parseResponse(response: unknown): InternalMessage[];
29
+ /**
30
+ * Formats tool result content to text string.
31
+ * OpenRouter only supports text content for tool messages.
32
+ */
33
+ private formatToolContent;
34
+ /**
35
+ * Formats user message content into OpenRouter's format.
36
+ * Handles both simple string content and multimodal content parts (text, images, files).
37
+ */
38
+ private formatUserContent;
39
+ /**
40
+ * Formats a single user content part (text, image, or file).
41
+ */
42
+ private formatUserContentPart;
43
+ /**
44
+ * Extracts image data as base64 string or URL.
45
+ */
46
+ private getImageData;
47
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Message formatter for OpenRouter API.
3
+ *
4
+ * OpenRouter uses OpenAI-compatible API format:
5
+ * - System prompts are included in the messages array
6
+ * - Tool calls use the tool_calls property
7
+ * - Tool results use the 'tool' role with tool_call_id
8
+ * - Supports multimodal content (text, images, files)
9
+ */
10
+ export class OpenRouterMessageFormatter {
11
+ /**
12
+ * Formats internal messages into OpenRouter's API format (OpenAI-compatible).
13
+ *
14
+ * @param history Array of internal messages to format
15
+ * @param systemPrompt Optional system prompt to include at the beginning
16
+ * @returns Array of messages formatted for OpenRouter's API
17
+ */
18
+ format(history, systemPrompt) {
19
+ const formatted = [];
20
+ // Add system message if provided
21
+ if (systemPrompt) {
22
+ formatted.push({
23
+ content: systemPrompt,
24
+ role: 'system',
25
+ });
26
+ }
27
+ // Track pending tool calls to detect orphans (tool calls without results)
28
+ const pendingToolCallIds = new Set();
29
+ for (const msg of history) {
30
+ switch (msg.role) {
31
+ case 'assistant': {
32
+ // Assistant messages may or may not have tool calls
33
+ if (msg.toolCalls && msg.toolCalls.length > 0) {
34
+ formatted.push({
35
+ content: String(msg.content || ''),
36
+ role: 'assistant',
37
+ // eslint-disable-next-line camelcase
38
+ tool_calls: msg.toolCalls,
39
+ });
40
+ // Track these tool call IDs as pending
41
+ for (const toolCall of msg.toolCalls) {
42
+ pendingToolCallIds.add(toolCall.id);
43
+ }
44
+ }
45
+ else {
46
+ formatted.push({
47
+ content: String(msg.content || ''),
48
+ role: 'assistant',
49
+ });
50
+ }
51
+ break;
52
+ }
53
+ case 'system': {
54
+ // Additional system messages in history
55
+ formatted.push({
56
+ content: String(msg.content || ''),
57
+ role: 'system',
58
+ });
59
+ break;
60
+ }
61
+ case 'tool': {
62
+ // Tool results for OpenRouter — only text field is supported.
63
+ // Only add if we've seen the corresponding tool call
64
+ if (msg.toolCallId && pendingToolCallIds.has(msg.toolCallId)) {
65
+ formatted.push({
66
+ content: this.formatToolContent(msg.content),
67
+ role: 'tool',
68
+ // eslint-disable-next-line camelcase
69
+ tool_call_id: msg.toolCallId,
70
+ });
71
+ // Remove from pending since we found its result
72
+ pendingToolCallIds.delete(msg.toolCallId);
73
+ }
74
+ else {
75
+ // Orphaned tool result (result without matching call)
76
+ // Skip it to prevent API errors
77
+ console.warn(`Skipping orphaned tool result ${msg.toolCallId} (no matching tool call found)`);
78
+ }
79
+ break;
80
+ }
81
+ case 'user': {
82
+ formatted.push({
83
+ content: this.formatUserContent(msg.content),
84
+ role: 'user',
85
+ });
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ // Add synthetic error results for any orphaned tool calls
91
+ // This can happen when the agent crashes/interrupts before tool execution completes
92
+ if (pendingToolCallIds.size > 0) {
93
+ for (const toolCallId of pendingToolCallIds) {
94
+ formatted.push({
95
+ content: 'Error: Tool execution was interrupted (session crashed or cancelled before completion)',
96
+ role: 'tool',
97
+ // eslint-disable-next-line camelcase
98
+ tool_call_id: toolCallId,
99
+ });
100
+ console.warn(`Tool call ${toolCallId} had no matching tool result - added synthetic error result`);
101
+ }
102
+ }
103
+ return formatted;
104
+ }
105
+ /**
106
+ * Parses OpenRouter API response into internal message objects.
107
+ *
108
+ * @param response The raw response from OpenRouter API
109
+ * @returns Array of internal messages (typically one assistant message)
110
+ */
111
+ parseResponse(response) {
112
+ const internal = [];
113
+ const typedResponse = response;
114
+ if (!typedResponse.choices || !Array.isArray(typedResponse.choices)) {
115
+ return internal;
116
+ }
117
+ for (const choice of typedResponse.choices) {
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ const msg = choice.message;
120
+ if (!msg || !msg.role)
121
+ continue;
122
+ const role = msg.role;
123
+ switch (role) {
124
+ case 'assistant': {
125
+ const content = msg.content ?? null;
126
+ // Handle tool calls if present
127
+ if (msg.tool_calls && Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0) {
128
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
129
+ const calls = msg.tool_calls.map((call) => ({
130
+ function: {
131
+ arguments: call.function.arguments,
132
+ name: call.function.name,
133
+ },
134
+ id: call.id,
135
+ type: 'function',
136
+ }));
137
+ internal.push({ content, role: 'assistant', toolCalls: calls });
138
+ }
139
+ else {
140
+ internal.push({ content, role: 'assistant' });
141
+ }
142
+ break;
143
+ }
144
+ case 'system':
145
+ case 'user': {
146
+ if (msg.content) {
147
+ internal.push({ content: msg.content, role });
148
+ }
149
+ break;
150
+ }
151
+ case 'tool': {
152
+ internal.push({
153
+ content: msg.content,
154
+ name: msg.name,
155
+ role: 'tool',
156
+ toolCallId: msg.tool_call_id,
157
+ });
158
+ break;
159
+ }
160
+ }
161
+ }
162
+ return internal;
163
+ }
164
+ /**
165
+ * Formats tool result content to text string.
166
+ * OpenRouter only supports text content for tool messages.
167
+ */
168
+ formatToolContent(content) {
169
+ if (typeof content === 'string') {
170
+ return content;
171
+ }
172
+ if (Array.isArray(content)) {
173
+ // Extract text from multimodal content
174
+ return content
175
+ .filter((part) => part.type === 'text')
176
+ .map((part) => part.text)
177
+ .join('\n');
178
+ }
179
+ return String(content || '');
180
+ }
181
+ /**
182
+ * Formats user message content into OpenRouter's format.
183
+ * Handles both simple string content and multimodal content parts (text, images, files).
184
+ */
185
+ formatUserContent(content) {
186
+ if (!Array.isArray(content)) {
187
+ return String(content || '');
188
+ }
189
+ const parts = content
190
+ .map((part) => this.formatUserContentPart(part))
191
+ .filter((part) => part !== null);
192
+ return parts;
193
+ }
194
+ /**
195
+ * Formats a single user content part (text, image, or file).
196
+ */
197
+ formatUserContentPart(part) {
198
+ if (part.type === 'text') {
199
+ return { text: part.text, type: 'text' };
200
+ }
201
+ if (part.type === 'image') {
202
+ // Convert image to data URL or use existing URL
203
+ const imageData = this.getImageData(part.image);
204
+ const url = imageData.startsWith('http://') ||
205
+ imageData.startsWith('https://') ||
206
+ imageData.startsWith('data:')
207
+ ? imageData
208
+ : `data:${part.mimeType || 'application/octet-stream'};base64,${imageData}`;
209
+ // eslint-disable-next-line camelcase
210
+ return { image_url: { url }, type: 'image_url' };
211
+ }
212
+ if (part.type === 'file') {
213
+ // File support: convert to text representation
214
+ // OpenRouter may support files differently depending on the model
215
+ return { text: `[File: ${part.filename || 'unknown'}]`, type: 'text' };
216
+ }
217
+ return null;
218
+ }
219
+ /**
220
+ * Extracts image data as base64 string or URL.
221
+ */
222
+ getImageData(image) {
223
+ if (typeof image === 'string') {
224
+ return image;
225
+ }
226
+ if (image instanceof URL) {
227
+ return image.toString();
228
+ }
229
+ if (image instanceof Buffer) {
230
+ return image.toString('base64');
231
+ }
232
+ if (image instanceof Uint8Array || image instanceof ArrayBuffer) {
233
+ const buffer = image instanceof ArrayBuffer ? new Uint8Array(image) : image;
234
+ return Buffer.from(buffer).toString('base64');
235
+ }
236
+ return '';
237
+ }
238
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * ByteRover Content Generator.
3
+ *
4
+ * Implements IContentGenerator using ByteRover gRPC service.
5
+ * Supports both Claude and Gemini models through the unified gRPC interface.
6
+ */
7
+ import type { GenerateContentChunk, GenerateContentRequest, GenerateContentResponse, IContentGenerator } from '../../../../core/interfaces/cipher/i-content-generator.js';
8
+ import type { ByteRoverLlmGrpcService } from '../../grpc/internal-llm-grpc-service.js';
9
+ import { type ThinkingConfig } from '../thought-parser.js';
10
+ /**
11
+ * Configuration for ByteRover Content Generator.
12
+ */
13
+ export interface ByteRoverContentGeneratorConfig {
14
+ /** Maximum tokens in the response */
15
+ maxTokens?: number;
16
+ /** Model identifier */
17
+ model: string;
18
+ /** Temperature for randomness */
19
+ temperature?: number;
20
+ /** Thinking configuration for Gemini models */
21
+ thinkingConfig?: ThinkingConfig;
22
+ }
23
+ /**
24
+ * ByteRover Content Generator.
25
+ *
26
+ * Wraps ByteRoverLlmGrpcService and implements IContentGenerator.
27
+ * Handles:
28
+ * - Provider detection (Claude vs Gemini)
29
+ * - Message formatting via provider-specific formatters
30
+ * - Token estimation via provider-specific tokenizers
31
+ * - Response parsing to unified format
32
+ */
33
+ export declare class ByteRoverContentGenerator implements IContentGenerator {
34
+ private readonly config;
35
+ private readonly formatter;
36
+ private readonly grpcService;
37
+ private readonly providerType;
38
+ private readonly tokenizer;
39
+ /**
40
+ * Create a new ByteRover Content Generator.
41
+ *
42
+ * @param grpcService - Configured gRPC service for LLM API calls
43
+ * @param config - Generator configuration
44
+ */
45
+ constructor(grpcService: ByteRoverLlmGrpcService, config: ByteRoverContentGeneratorConfig);
46
+ /**
47
+ * Estimate tokens synchronously using character-based approximation.
48
+ *
49
+ * @param content - Text to estimate tokens for
50
+ * @returns Estimated token count
51
+ */
52
+ estimateTokensSync(content: string): number;
53
+ /**
54
+ * Generate content (non-streaming).
55
+ *
56
+ * @param request - Generation request
57
+ * @returns Generated content response
58
+ */
59
+ generateContent(request: GenerateContentRequest): Promise<GenerateContentResponse>;
60
+ /**
61
+ * Generate content with streaming.
62
+ *
63
+ * Note: The current gRPC service collects all chunks before returning.
64
+ * This implementation yields the complete response as a single chunk.
65
+ * True streaming can be implemented when the gRPC service exposes the stream.
66
+ *
67
+ * @param request - Generation request
68
+ * @yields Content chunks as they are generated
69
+ * @returns Async generator yielding content chunks
70
+ */
71
+ generateContentStream(request: GenerateContentRequest): AsyncGenerator<GenerateContentChunk>;
72
+ /**
73
+ * Build Claude-specific generation configuration.
74
+ */
75
+ private buildClaudeConfig;
76
+ /**
77
+ * Build Gemini-specific generation configuration.
78
+ */
79
+ private buildGeminiConfig;
80
+ /**
81
+ * Build generation config for the appropriate provider.
82
+ */
83
+ private buildGenerationConfig;
84
+ /**
85
+ * Detect provider type from model name.
86
+ */
87
+ private detectProviderType;
88
+ /**
89
+ * Extract text content from an internal message.
90
+ */
91
+ private extractTextContent;
92
+ }