byterover-cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +53 -2
  18. package/dist/commands/init.js +279 -66
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/logout.d.ts +16 -0
  21. package/dist/commands/logout.js +61 -0
  22. package/dist/commands/pull.d.ts +33 -0
  23. package/dist/commands/pull.js +115 -0
  24. package/dist/commands/push.d.ts +13 -13
  25. package/dist/commands/push.js +81 -101
  26. package/dist/commands/query.d.ts +63 -0
  27. package/dist/commands/query.js +349 -0
  28. package/dist/commands/space/list.d.ts +5 -2
  29. package/dist/commands/space/list.js +60 -56
  30. package/dist/commands/space/switch.d.ts +16 -0
  31. package/dist/commands/space/switch.js +102 -53
  32. package/dist/commands/status.d.ts +5 -2
  33. package/dist/commands/status.js +43 -33
  34. package/dist/commands/watch.d.ts +23 -0
  35. package/dist/commands/watch.js +171 -0
  36. package/dist/config/auth.config.js +14 -2
  37. package/dist/config/context-tree-domains.d.ts +12 -0
  38. package/dist/config/context-tree-domains.js +29 -0
  39. package/dist/config/environment.d.ts +6 -0
  40. package/dist/config/environment.js +9 -2
  41. package/dist/constants.d.ts +5 -0
  42. package/dist/constants.js +6 -0
  43. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  44. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  45. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  46. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  47. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  48. package/dist/core/domain/cipher/agent/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  50. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  51. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  52. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  53. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  54. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  55. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  56. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  57. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  58. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  59. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  60. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  61. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  62. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  63. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  64. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  65. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  66. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  67. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  68. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  69. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  70. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  71. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  72. package/dist/core/domain/cipher/memory/types.js +4 -0
  73. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  74. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  75. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  76. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  77. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  78. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  79. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  80. package/dist/core/domain/cipher/todos/index.js +4 -0
  81. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  82. package/dist/core/domain/cipher/todos/types.js +5 -0
  83. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  84. package/dist/core/domain/cipher/tools/constants.js +24 -0
  85. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  86. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  87. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  88. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  89. package/dist/core/domain/entities/brv-config.js +115 -17
  90. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  91. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  92. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  93. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  94. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  95. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  96. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  97. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  98. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  99. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  100. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  101. package/dist/core/domain/entities/context-tree-index.js +27 -0
  102. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  103. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  104. package/dist/core/domain/entities/event.d.ts +1 -1
  105. package/dist/core/domain/entities/event.js +4 -1
  106. package/dist/core/domain/entities/parser.d.ts +567 -0
  107. package/dist/core/domain/entities/parser.js +10 -0
  108. package/dist/core/domain/entities/playbook.d.ts +2 -23
  109. package/dist/core/domain/entities/playbook.js +2 -70
  110. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  111. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  112. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  113. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  114. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  115. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  116. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  117. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  118. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  119. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  120. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  121. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  122. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  123. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  124. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  125. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  128. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  129. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  130. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  131. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  132. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  133. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  134. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  135. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  136. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  137. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  139. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  140. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  141. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  142. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  143. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  144. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  145. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  146. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  147. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  148. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  149. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  150. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  151. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  153. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  155. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  156. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  157. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  158. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  159. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  160. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  161. package/dist/core/interfaces/cipher/message-types.js +5 -0
  162. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  163. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  164. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  165. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  166. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  167. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  168. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  169. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  171. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  173. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  174. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  175. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  176. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  177. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  178. package/dist/core/interfaces/i-rule-template-service.d.ts +0 -4
  179. package/dist/core/interfaces/i-rule-template-service.js +1 -4
  180. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  181. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  182. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  183. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  184. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  185. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  186. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  187. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  188. package/dist/hooks/error/clean-errors.d.ts +7 -0
  189. package/dist/hooks/error/clean-errors.js +50 -0
  190. package/dist/hooks/init/welcome.js +72 -1
  191. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  192. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  193. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  194. package/dist/infra/cipher/agent-service-factory.js +212 -0
  195. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  196. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  197. package/dist/infra/cipher/blob/index.d.ts +10 -0
  198. package/dist/infra/cipher/blob/index.js +12 -0
  199. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  200. package/dist/infra/cipher/blob/migrations.js +148 -0
  201. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  202. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  203. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  204. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  205. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  206. package/dist/infra/cipher/cipher-agent.js +317 -0
  207. package/dist/infra/cipher/command-parser.d.ts +23 -0
  208. package/dist/infra/cipher/command-parser.js +85 -0
  209. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  210. package/dist/infra/cipher/display/todo-display.js +129 -0
  211. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  212. package/dist/infra/cipher/events/event-emitter.js +158 -0
  213. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  214. package/dist/infra/cipher/exit-codes.js +58 -0
  215. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  216. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  217. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  218. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  219. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  220. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  221. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  222. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  223. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  224. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  225. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  226. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  227. package/dist/infra/cipher/interactive-commands.js +198 -0
  228. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  229. package/dist/infra/cipher/interactive-loop.js +352 -0
  230. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  231. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  232. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  233. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  234. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  235. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  236. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  237. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  238. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  239. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  240. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  241. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  242. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  243. package/dist/infra/cipher/llm/context/index.js +2 -0
  244. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  245. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  246. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  247. package/dist/infra/cipher/llm/context/utils.js +89 -0
  248. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  249. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  250. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  251. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  252. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  253. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  254. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  255. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  256. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  257. package/dist/infra/cipher/llm/generators/index.js +13 -0
  258. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  259. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  260. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  261. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  262. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  263. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  264. package/dist/infra/cipher/llm/index.d.ts +9 -0
  265. package/dist/infra/cipher/llm/index.js +13 -0
  266. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  267. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  268. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  269. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  270. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  271. package/dist/infra/cipher/llm/response-validator.js +157 -0
  272. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  273. package/dist/infra/cipher/llm/retry/index.js +10 -0
  274. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  275. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  276. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  277. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  278. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  279. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  280. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  281. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  282. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  283. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  284. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  285. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  286. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  287. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  288. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  289. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  290. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  291. package/dist/infra/cipher/logger/console-logger.js +63 -0
  292. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  293. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  294. package/dist/infra/cipher/memory/index.d.ts +6 -0
  295. package/dist/infra/cipher/memory/index.js +7 -0
  296. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  297. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  298. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  299. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  300. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  301. package/dist/infra/cipher/process/command-validator.js +266 -0
  302. package/dist/infra/cipher/process/index.d.ts +8 -0
  303. package/dist/infra/cipher/process/index.js +8 -0
  304. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  305. package/dist/infra/cipher/process/process-service.js +439 -0
  306. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  307. package/dist/infra/cipher/session/chat-session.js +165 -0
  308. package/dist/infra/cipher/session/index.d.ts +6 -0
  309. package/dist/infra/cipher/session/index.js +5 -0
  310. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  311. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  312. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  313. package/dist/infra/cipher/session/session-manager.js +172 -0
  314. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  315. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  316. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  317. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  318. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  319. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  320. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  321. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  322. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  323. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  324. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  326. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  327. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  328. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  329. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  330. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  331. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  332. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  333. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  334. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  335. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  336. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  337. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  338. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  339. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  340. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  342. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  344. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  346. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  347. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  348. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  350. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  351. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  352. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  353. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  354. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  355. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  356. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  357. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  358. package/dist/infra/cipher/tools/index.d.ts +18 -0
  359. package/dist/infra/cipher/tools/index.js +19 -0
  360. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  361. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  362. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  363. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  364. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  365. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  366. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  367. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  368. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  369. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  370. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  371. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  372. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  373. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  374. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  375. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  376. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  377. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  378. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  379. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  380. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  381. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  382. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  383. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  384. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  385. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  386. package/dist/infra/config/file-config-store.js +9 -3
  387. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  388. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  389. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  390. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  391. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  392. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  393. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  394. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  395. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  396. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  397. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  398. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  399. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  400. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  401. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  402. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  403. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  404. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  405. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  406. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  407. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  408. package/dist/infra/parsers/clean/shared.js +273 -0
  409. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  410. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  411. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  412. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  413. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  414. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  415. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  416. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  417. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  418. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  419. package/dist/infra/rule/constants.d.ts +4 -0
  420. package/dist/infra/rule/constants.js +4 -0
  421. package/dist/infra/rule/rule-template-service.js +1 -1
  422. package/dist/infra/rule/rule-writer-service.js +1 -5
  423. package/dist/infra/space/http-space-service.js +2 -1
  424. package/dist/infra/team/http-team-service.js +2 -1
  425. package/dist/infra/user/http-user-service.js +2 -1
  426. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  427. package/dist/infra/watcher/file-watcher-service.js +81 -0
  428. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  429. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  430. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  431. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  432. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  433. package/dist/resources/prompts/reflection.yml +27 -0
  434. package/dist/resources/prompts/system-prompt.yml +82 -0
  435. package/dist/resources/prompts/tool-outputs.yml +30 -0
  436. package/dist/templates/README.md +6 -7
  437. package/dist/templates/sections/command-reference.md +40 -93
  438. package/dist/templates/sections/workflow.md +3 -30
  439. package/dist/utils/emoji-helpers.d.ts +38 -0
  440. package/dist/utils/emoji-helpers.js +42 -0
  441. package/dist/utils/error-handler.d.ts +51 -0
  442. package/dist/utils/error-handler.js +169 -0
  443. package/dist/utils/error-helpers.d.ts +30 -0
  444. package/dist/utils/error-helpers.js +47 -0
  445. package/dist/utils/file-helpers.d.ts +15 -0
  446. package/dist/utils/file-helpers.js +44 -0
  447. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  448. package/dist/utils/oclif-error-helpers.js +46 -0
  449. package/dist/utils/tool-display-formatter.d.ts +53 -0
  450. package/dist/utils/tool-display-formatter.js +257 -0
  451. package/oclif.manifest.json +422 -142
  452. package/package.json +29 -10
  453. package/dist/commands/add.d.ts +0 -49
  454. package/dist/commands/add.js +0 -192
  455. package/dist/commands/complete.d.ts +0 -108
  456. package/dist/commands/complete.js +0 -340
  457. package/dist/commands/retrieve.d.ts +0 -26
  458. package/dist/commands/retrieve.js +0 -101
  459. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  460. package/dist/core/domain/entities/curator-output.js +0 -23
  461. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  462. package/dist/core/domain/entities/delta-batch.js +0 -52
  463. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  464. package/dist/core/domain/entities/delta-operation.js +0 -50
  465. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  466. package/dist/core/domain/entities/executor-output.js +0 -33
  467. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  468. package/dist/core/domain/entities/reflector-output.js +0 -44
  469. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  470. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  471. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  472. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  473. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  474. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  475. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  476. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  477. package/dist/infra/ace/ace-file-utils.js +0 -83
  478. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  479. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  480. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  481. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  482. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  483. package/dist/infra/ace/file-delta-store.js +0 -26
  484. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  485. package/dist/infra/ace/file-executor-output-store.js +0 -26
  486. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  487. package/dist/infra/ace/file-playbook-store.js +0 -107
  488. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  489. package/dist/infra/ace/file-reflection-store.js +0 -55
  490. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  491. package/dist/infra/playbook/file-playbook-service.js +0 -132
  492. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  493. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  494. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  495. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  496. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  497. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  498. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,548 @@
1
+ /**
2
+ * Claude Code Raw Service
3
+ * Consolidates ClaudeCodeParser + ClaudeRawParser
4
+ * Parses JSONL transcript files from ~/.claude/projects/
5
+ */
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
7
+ import { readdir, readFile } from 'node:fs/promises';
8
+ import path, { basename, join } from 'node:path';
9
+ /**
10
+ * Constants
11
+ */
12
+ const CLAUDE_PROJECTS_PATH = '/.claude/projects/';
13
+ const JSONL_FILE_EXTENSION = '.jsonl';
14
+ const COMBINED_FILE_SUFFIX = '-combined';
15
+ const FILE_SIZE_DECIMAL_PLACES = 1;
16
+ const TITLE_MAX_LENGTH = 100;
17
+ const MESSAGES = {
18
+ CLAUDE_FOLDER_NAME: '📁 Claude folder name:',
19
+ CUSTOM_DIRECTORY: '📁 Custom directory:',
20
+ DEFAULT_SESSION_TITLE: 'Claude Code Session',
21
+ ERROR_PARSING: '❌ Error during parsing:',
22
+ EXPORT_COMPLETE: '🎉 Claude Code export complete! Sessions exported to:',
23
+ EXPORTING: '💾 Exporting sessions...',
24
+ FAILED_PARSE_DIR: 'Failed to parse directory:',
25
+ FAILED_PARSE_LOG: 'Failed to parse Claude Code log:',
26
+ INVALID_LOG_PATH: 'Invalid Claude Code log path:',
27
+ NO_ENTRIES_FOUND: 'No valid entries found in',
28
+ NO_SESSIONS: 'ℹ️ No Claude Code sessions found',
29
+ PARSE_ERROR: 'Parse error',
30
+ PARSING_START: '🔍 Starting Claude Code conversation parsing...',
31
+ SESSION_EXPORTED: '✅',
32
+ SESSIONS_FAILED: 'Failed to parse some logs:',
33
+ SESSIONS_FOUND: 'Found',
34
+ SYSTEM_MESSAGE: 'System message',
35
+ UNKNOWN_ERROR: 'Unknown error',
36
+ UNKNOWN_REPO: 'unknown',
37
+ };
38
+ /**
39
+ * Claude Raw Service - Wraps parser and handles file I/O and output management
40
+ */
41
+ export class ClaudeRawService {
42
+ ide;
43
+ /**
44
+ * Initialize Claude Raw Service
45
+ *
46
+ * @param ide - The IDE type (Claude Code)
47
+ */
48
+ constructor(ide) {
49
+ this.ide = ide;
50
+ }
51
+ /**
52
+ * Main entry point - Parse Claude Code sessions from a custom directory
53
+ *
54
+ * Parses all JSONL transcript files from a custom Claude projects directory,
55
+ * extracts session information, and writes normalized JSON files to output directory.
56
+ * Organizes output by Claude project folder name. Returns success status.
57
+ *
58
+ * @param customDir - Path to directory containing Claude Code session files
59
+ * @param outputDir - Optional output directory (defaults to process.cwd()/.brv/logs/{ide}/raw)
60
+ * @returns Promise resolving to true if parsing succeeded, false otherwise
61
+ */
62
+ async parse(customDir, outputDir) {
63
+ const baseOutputDir = this.getOutputDir(this.ide, outputDir);
64
+ console.log(MESSAGES.PARSING_START);
65
+ console.log(`${MESSAGES.CUSTOM_DIRECTORY} ${customDir}`);
66
+ // Extract Claude folder name from customDir
67
+ // customDir is like: /Users/datpham/.claude/projects/-Users-datpham-dpmemories-byterover-cli
68
+ // We want to use: -Users-datpham-dpmemories-byterover-cli as the project folder name
69
+ const claudeFolderName = basename(customDir);
70
+ console.log(`${MESSAGES.CLAUDE_FOLDER_NAME} ${claudeFolderName}`);
71
+ // Create output directory
72
+ if (!existsSync(baseOutputDir)) {
73
+ mkdirSync(baseOutputDir, { recursive: true });
74
+ }
75
+ try {
76
+ // Parse sessions from custom directory
77
+ const sessions = await this.parseSessionDirectory(customDir);
78
+ if (sessions.length === 0) {
79
+ console.log(MESSAGES.NO_SESSIONS);
80
+ return true;
81
+ }
82
+ console.log(`\n${MESSAGES.SESSION_EXPORTED} ${MESSAGES.SESSIONS_FOUND} ${sessions.length} sessions`);
83
+ // Export sessions organized by Claude project folder name
84
+ console.log(`\n${MESSAGES.EXPORTING}`);
85
+ // Create project-specific directory using Claude folder name
86
+ const projectDir = this.createSubdirectory(baseOutputDir, claudeFolderName);
87
+ for (const session of sessions) {
88
+ const filename = `${session.id}.json`;
89
+ const filepath = path.join(projectDir, filename);
90
+ writeFileSync(filepath, JSON.stringify(session, null, 2));
91
+ const fileSize = readFileSync(filepath).length;
92
+ const fileSizeKb = (fileSize / 1024).toFixed(FILE_SIZE_DECIMAL_PLACES);
93
+ console.log(` ${MESSAGES.SESSION_EXPORTED} ${session.title} (${fileSizeKb} KB)`);
94
+ }
95
+ console.log(`\n${MESSAGES.EXPORT_COMPLETE} ${outputDir}`);
96
+ return true;
97
+ }
98
+ catch (error) {
99
+ console.error(`${MESSAGES.ERROR_PARSING}`, error);
100
+ throw error;
101
+ }
102
+ }
103
+ /**
104
+ * Calculate aggregate session metadata from transcript entries
105
+ *
106
+ * Aggregates token usage (input, output, cache), counts message types, extracts workspace,
107
+ * workspace path, and timestamps. Returns comprehensive metadata about the session including
108
+ * duration, token costs, and message counts for analysis and reporting.
109
+ *
110
+ * @param entries - Array of transcript entries from JSONL file
111
+ * @param messages - Parsed messages array (for count verification)
112
+ * @param logPath - Log file path (used to extract workspace information)
113
+ * @returns RawClaudeSessionMetadata object with aggregated statistics
114
+ */
115
+ calculateMetadata(entries, messages, logPath) {
116
+ let inputTokens = 0;
117
+ let outputTokens = 0;
118
+ let cacheTokens = 0;
119
+ let userCount = 0;
120
+ let assistantCount = 0;
121
+ let cwd;
122
+ for (const entry of entries) {
123
+ if (entry.message?.usage) {
124
+ inputTokens += entry.message.usage.input_tokens || 0;
125
+ outputTokens += entry.message.usage.output_tokens || 0;
126
+ cacheTokens += entry.message.usage.cache_creation_input_tokens || 0;
127
+ cacheTokens += entry.message.usage.cache_read_input_tokens || 0;
128
+ }
129
+ if (entry.type === 'user')
130
+ userCount++;
131
+ if (entry.type === 'assistant')
132
+ assistantCount++;
133
+ // Capture cwd from the first entry that has it
134
+ if (!cwd && entry.cwd) {
135
+ cwd = entry.cwd;
136
+ }
137
+ }
138
+ const { endedAt, startedAt } = this.extractTimestamps(entries);
139
+ const duration = new Date(endedAt || new Date()).getTime() - new Date(startedAt).getTime();
140
+ const metadata = {
141
+ assistantMessageCount: assistantCount,
142
+ duration,
143
+ endedAt,
144
+ messageCount: messages.length,
145
+ sessionId: this.extractSessionId(logPath),
146
+ startedAt,
147
+ tokenUsage: {
148
+ cacheTokens: cacheTokens > 0 ? cacheTokens : undefined,
149
+ inputTokens,
150
+ outputTokens,
151
+ totalTokens: inputTokens + outputTokens,
152
+ },
153
+ userMessageCount: userCount,
154
+ workspace: this.extractWorkspace(logPath),
155
+ };
156
+ // Only include cwd if it has a value
157
+ if (cwd) {
158
+ metadata.cwd = cwd;
159
+ }
160
+ return metadata;
161
+ }
162
+ /**
163
+ * Convert Claude Code transcript entries to normalized messages
164
+ *
165
+ * Transforms raw JSONL transcript entries (user, assistant, system) into standardized
166
+ * RawClaudeRawMessage objects with preserved content, timestamps, and token counts.
167
+ * Filters out invalid entries without content.
168
+ *
169
+ * @param entries - Array of RawClaudeTranscriptEntry objects from JSONL file
170
+ * @returns Array of normalized RawClaudeRawMessage objects
171
+ */
172
+ convertToMessages(entries) {
173
+ const messages = [];
174
+ for (const entry of entries) {
175
+ if (entry.type === 'user' && entry.message) {
176
+ messages.push(this.createMessageFromEntry(entry, 'user'));
177
+ }
178
+ else if (entry.type === 'assistant' && entry.message) {
179
+ messages.push(this.createMessageFromEntry(entry, 'assistant'));
180
+ }
181
+ else if (entry.type === 'system') {
182
+ messages.push(this.createSystemMessage(entry));
183
+ }
184
+ }
185
+ return messages;
186
+ }
187
+ /**
188
+ * Create normalized message from transcript entry
189
+ *
190
+ * Converts a single transcript entry (user or assistant) into a normalized message.
191
+ * Extracts content blocks, preserving array structure for multi-block content but
192
+ * converting single text blocks to plain strings for backward compatibility.
193
+ * Includes token counts if available and preserves cwd if present.
194
+ *
195
+ * @param entry - Transcript entry with message content
196
+ * @param type - Message type: 'user' or 'assistant'
197
+ * @returns Normalized RawClaudeRawMessage object
198
+ * @throws Error if message field is missing
199
+ */
200
+ createMessageFromEntry(entry, type) {
201
+ const { message } = entry;
202
+ if (!message) {
203
+ throw new Error(`Message required for ${type} entry`);
204
+ }
205
+ // Preserve content as array of blocks instead of converting to string
206
+ const contentBlocks = this.extractContentBlocks(message.content);
207
+ const isSingleTextBlock = contentBlocks.length === 1 && contentBlocks[0].type === 'text' && 'text' in contentBlocks[0];
208
+ const result = {
209
+ content: isSingleTextBlock
210
+ ? contentBlocks[0].text
211
+ : contentBlocks,
212
+ timestamp: entry.timestamp || new Date().toISOString(),
213
+ tokens: message.usage
214
+ ? {
215
+ input: message.usage.input_tokens || 0,
216
+ output: message.usage.output_tokens || 0,
217
+ }
218
+ : undefined,
219
+ type,
220
+ };
221
+ // Only include cwd if it has a value
222
+ if (entry.cwd) {
223
+ result.cwd = entry.cwd;
224
+ }
225
+ return result;
226
+ }
227
+ /**
228
+ * Create or get subdirectory within output directory
229
+ *
230
+ * Creates a subdirectory within the output directory if it doesn't exist.
231
+ * Uses recursive mode to create parent directories as needed.
232
+ *
233
+ * @param outputDir - Base output directory path
234
+ * @param subdirName - Name of subdirectory to create
235
+ * @returns Full path to the created or existing subdirectory
236
+ */
237
+ createSubdirectory(outputDir, subdirName) {
238
+ const subdir = path.join(outputDir, subdirName);
239
+ if (!existsSync(subdir)) {
240
+ mkdirSync(subdir, { recursive: true });
241
+ }
242
+ return subdir;
243
+ }
244
+ /**
245
+ * Create system message from transcript entry
246
+ *
247
+ * Converts a system-type transcript entry into a normalized message object.
248
+ * System messages typically contain metadata or initial instructions.
249
+ * Preserves cwd if present in the entry.
250
+ *
251
+ * @param entry - Transcript entry with type='system'
252
+ * @returns Normalized RawClaudeRawMessage with type='system'
253
+ */
254
+ createSystemMessage(entry) {
255
+ const result = {
256
+ content: entry.content || MESSAGES.SYSTEM_MESSAGE,
257
+ timestamp: entry.timestamp || new Date().toISOString(),
258
+ type: 'system',
259
+ };
260
+ // Only include cwd if it has a value
261
+ if (entry.cwd) {
262
+ result.cwd = entry.cwd;
263
+ }
264
+ return result;
265
+ }
266
+ /**
267
+ * Extract and normalize content blocks from message
268
+ *
269
+ * Handles multiple content formats: null/undefined (empty array), strings (wrapped as text block),
270
+ * arrays of blocks/strings (normalized to ContentBlock array), objects with type (treated as block),
271
+ * and other objects (stringified as text). Produces consistent ContentBlock array output.
272
+ *
273
+ * @param content - Raw message content in various formats
274
+ * @returns Array of normalized ContentBlock objects
275
+ */
276
+ extractContentBlocks(content) {
277
+ // If content is null or undefined, return empty array
278
+ if (content === null || content === undefined) {
279
+ return [];
280
+ }
281
+ // If content is a string, wrap it as a text block
282
+ if (typeof content === 'string') {
283
+ return [{ text: content, type: 'text' }];
284
+ }
285
+ // If content is already an array of blocks
286
+ if (Array.isArray(content)) {
287
+ const blocks = [];
288
+ for (const block of content) {
289
+ if (typeof block === 'string') {
290
+ blocks.push({ text: block, type: 'text' });
291
+ }
292
+ else if (block && typeof block === 'object' && 'type' in block) {
293
+ // It's a valid block with a type field
294
+ blocks.push(block);
295
+ }
296
+ else if (block && typeof block === 'object') {
297
+ // Fallback: wrap as text
298
+ blocks.push({ text: JSON.stringify(block), type: 'text' });
299
+ }
300
+ }
301
+ return blocks;
302
+ }
303
+ // If it's an object, try to handle it as a content block or stringify
304
+ if (typeof content === 'object') {
305
+ if ('type' in content) {
306
+ return [content];
307
+ }
308
+ return [{ text: JSON.stringify(content), type: 'text' }];
309
+ }
310
+ // Fallback for any other type
311
+ return [{ text: String(content), type: 'text' }];
312
+ }
313
+ /**
314
+ * Extract session ID from Claude Code log file path
315
+ *
316
+ * Parses the filename from the log path to extract the session ID.
317
+ * Claude Code session IDs are typically UUIDs in the JSONL filename.
318
+ * Removes the .jsonl extension to get the session ID.
319
+ *
320
+ * @param logPath - Path to Claude Code session log file
321
+ * @returns Session ID extracted from the filename
322
+ */
323
+ extractSessionId(logPath) {
324
+ // Claude Code session IDs are typically UUIDs in the filename
325
+ // Format: ~/.claude/projects/-path-to-project/{session-id}.jsonl
326
+ const parts = logPath.split('/');
327
+ const filename = parts.at(-1) || '';
328
+ return filename.replace(JSONL_FILE_EXTENSION, '');
329
+ }
330
+ /**
331
+ * Extract and sort session start and end timestamps
332
+ *
333
+ * Collects timestamps from transcript entries, filters out empty values,
334
+ * sorts them chronologically, and returns first (startedAt) and last (endedAt).
335
+ * Returns default current timestamp if no valid timestamps found.
336
+ *
337
+ * @param entries - Array of transcript entries with optional timestamp fields
338
+ * @returns RawClaudeTimestamps object with startedAt and optional endedAt ISO timestamp strings
339
+ */
340
+ extractTimestamps(entries) {
341
+ const validTimestamps = entries
342
+ .filter((e) => e.timestamp)
343
+ .map((e) => e.timestamp || '')
344
+ .filter((t) => t.trim().length > 0)
345
+ .sort();
346
+ return {
347
+ endedAt: validTimestamps.at(-1),
348
+ startedAt: validTimestamps[0] || new Date().toISOString(),
349
+ };
350
+ }
351
+ /**
352
+ * Extract session title from first user message
353
+ *
354
+ * Uses the first line of the first user message as the session title.
355
+ * Truncates to TITLE_MAX_LENGTH (100 chars) and appends "..." if truncated.
356
+ * Returns default title if no user messages found or first message is not text.
357
+ *
358
+ * @param messages - Array of parsed session messages
359
+ * @returns Session title string (max 100 characters)
360
+ */
361
+ extractTitle(messages) {
362
+ // Use first user message as title
363
+ const firstUserMessage = messages.find((m) => m.type === 'user');
364
+ if (firstUserMessage && typeof firstUserMessage.content === 'string') {
365
+ const text = firstUserMessage.content;
366
+ const lines = text.split('\n').filter((l) => l.trim());
367
+ if (lines.length > 0) {
368
+ const title = lines[0].slice(0, Math.max(0, TITLE_MAX_LENGTH));
369
+ return title.length === TITLE_MAX_LENGTH ? title + '...' : title;
370
+ }
371
+ }
372
+ return MESSAGES.DEFAULT_SESSION_TITLE;
373
+ }
374
+ /**
375
+ * Extract workspace information from Claude Code log file path
376
+ *
377
+ * Parses the log path to extract workspace information. Claude Code stores projects
378
+ * in ~/.claude/projects/-path-to-workspace format where slashes are replaced with dashes.
379
+ * Extracts and reconstructs the original workspace path and repository name.
380
+ * Returns default path object if extraction fails.
381
+ *
382
+ * @param logPath - Claude Code session log file path
383
+ * @returns RawClaudeWorkspaceMetadata with workspace path and optional repository name/url
384
+ */
385
+ extractWorkspace(logPath) {
386
+ // Claude Code stores projects in ~/.claude/projects/-path-to-workspace
387
+ // Extract the workspace path from the CLAUDE_PROJECTS_PATH directory name
388
+ try {
389
+ const match = logPath.match(/\.claude\/projects\/(.*?)\//);
390
+ if (match && match[1]) {
391
+ // Convert -path-to-workspace back to /path/to/workspace
392
+ const projectName = match[1];
393
+ const workspacePath = projectName.startsWith('-')
394
+ ? projectName.slice(1).replaceAll('-', '/')
395
+ : projectName;
396
+ return {
397
+ path: `/${workspacePath}`,
398
+ repository: {
399
+ name: workspacePath.split('/').pop() || MESSAGES.UNKNOWN_REPO,
400
+ },
401
+ };
402
+ }
403
+ }
404
+ catch {
405
+ // Fall through to default
406
+ }
407
+ return {
408
+ path: logPath,
409
+ };
410
+ }
411
+ /**
412
+ * Get the output directory path for raw parser results
413
+ *
414
+ * Returns the standardized output directory path for storing raw parsed sessions.
415
+ * Directory is relative to current working directory under .brv/logs/{ide}/raw
416
+ *
417
+ * @param ide - IDE agent type (used as directory component)
418
+ * @param override - Optional custom output directory (overrides default)
419
+ * @returns Full path to raw output directory
420
+ */
421
+ getOutputDir(ide, override) {
422
+ return override || path.join(process.cwd(), `.brv/logs/${ide}/raw`);
423
+ }
424
+ // ============================================================================
425
+ // Private Metadata Helpers
426
+ // ============================================================================
427
+ /**
428
+ * Parse all Claude Code session logs in a directory
429
+ *
430
+ * Finds all JSONL files in the directory (excluding combined files), parses them in parallel,
431
+ * and returns array of successfully parsed sessions sorted by start time.
432
+ * Collects and reports any parse errors without failing completely.
433
+ *
434
+ * @param dirPath - Path to directory containing JSONL session files
435
+ * @returns Promise resolving to array of parsed RawClaudeRawSession objects
436
+ * @throws Error if directory cannot be read
437
+ */
438
+ async parseSessionDirectory(dirPath) {
439
+ try {
440
+ const files = await readdir(dirPath, { recursive: false });
441
+ const jsonlFiles = files.filter((f) => typeof f === 'string' && f.endsWith(JSONL_FILE_EXTENSION) && !f.includes(COMBINED_FILE_SUFFIX));
442
+ const errors = [];
443
+ // Parse all files in parallel
444
+ const parsePromises = jsonlFiles.map(async (file) => {
445
+ try {
446
+ const fullPath = join(dirPath, file);
447
+ return await this.parseSessionLog(fullPath);
448
+ }
449
+ catch (error) {
450
+ errors.push(`${file}: ${error instanceof Error ? error.message : MESSAGES.UNKNOWN_ERROR}`);
451
+ return null;
452
+ }
453
+ });
454
+ const results = await Promise.all(parsePromises);
455
+ const sessions = results.filter((session) => session !== null);
456
+ if (sessions.length === 0 && errors.length > 0) {
457
+ console.warn(`${MESSAGES.SESSIONS_FAILED} ${errors.join(', ')}`);
458
+ }
459
+ // Sort by start time
460
+ sessions.sort((a, b) => a.metadata.startedAt.localeCompare(b.metadata.startedAt));
461
+ return sessions;
462
+ }
463
+ catch (error) {
464
+ throw new Error(`${MESSAGES.FAILED_PARSE_DIR} ${error instanceof Error ? error.message : MESSAGES.UNKNOWN_ERROR}`);
465
+ }
466
+ }
467
+ /**
468
+ * Parse a single Claude Code session log file
469
+ *
470
+ * Validates log file format, reads JSONL content, parses each line as a transcript entry,
471
+ * converts entries to messages, calculates session metadata, and extracts session title.
472
+ * Throws detailed error if log file is invalid or unparseable.
473
+ *
474
+ * @param logPath - Absolute path to Claude Code session JSONL file
475
+ * @returns Promise resolving to parsed RawClaudeRawSession object
476
+ * @throws Error if file is invalid or cannot be parsed
477
+ */
478
+ async parseSessionLog(logPath) {
479
+ try {
480
+ // Validate first
481
+ const valid = await this.validateLogFile(logPath);
482
+ if (!valid) {
483
+ throw new Error(`${MESSAGES.INVALID_LOG_PATH} ${logPath}`);
484
+ }
485
+ // Read and parse JSONL file
486
+ const content = await readFile(logPath, 'utf8');
487
+ const lines = content.trim().split('\n').filter((l) => l.trim());
488
+ const entries = [];
489
+ const parseErrors = [];
490
+ for (const [i, line] of lines.entries()) {
491
+ try {
492
+ const entry = JSON.parse(line);
493
+ entries.push(entry);
494
+ }
495
+ catch (error) {
496
+ parseErrors.push(`Line ${i + 1}: ${error instanceof Error ? error.message : MESSAGES.PARSE_ERROR}`);
497
+ }
498
+ }
499
+ if (entries.length === 0) {
500
+ throw new Error(`${MESSAGES.NO_ENTRIES_FOUND} ${logPath}`);
501
+ }
502
+ // Extract session info
503
+ const sessionId = this.extractSessionId(logPath);
504
+ const messages = this.convertToMessages(entries);
505
+ const metadata = this.calculateMetadata(entries, messages, logPath);
506
+ const title = this.extractTitle(messages);
507
+ return {
508
+ id: sessionId,
509
+ messages,
510
+ metadata,
511
+ timestamp: new Date(metadata.startedAt).getTime(),
512
+ title,
513
+ };
514
+ }
515
+ catch (error) {
516
+ throw new Error(`${MESSAGES.FAILED_PARSE_LOG} ${error instanceof Error ? error.message : MESSAGES.UNKNOWN_ERROR}`);
517
+ }
518
+ }
519
+ /**
520
+ * Validate Claude Code log file format and existence
521
+ *
522
+ * Checks three validation criteria:
523
+ * 1. Path contains /.claude/projects/ directory marker
524
+ * 2. File has .jsonl extension
525
+ * 3. File exists on filesystem
526
+ * Returns false silently if any check fails.
527
+ *
528
+ * @param logPath - Path to file to validate
529
+ * @returns Promise resolving to true if file is valid Claude Code log file, false otherwise
530
+ */
531
+ async validateLogFile(logPath) {
532
+ try {
533
+ // Check path contains CLAUDE_PROJECTS_PATH
534
+ if (!logPath.includes(CLAUDE_PROJECTS_PATH)) {
535
+ return false;
536
+ }
537
+ // Check file extension is JSONL
538
+ if (!logPath.endsWith(JSONL_FILE_EXTENSION)) {
539
+ return false;
540
+ }
541
+ // Check file exists
542
+ return existsSync(logPath);
543
+ }
544
+ catch {
545
+ return false;
546
+ }
547
+ }
548
+ }