byterover-cli 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +63 -3
  18. package/dist/commands/init.js +285 -70
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/pull.d.ts +33 -0
  21. package/dist/commands/pull.js +115 -0
  22. package/dist/commands/push.d.ts +13 -13
  23. package/dist/commands/push.js +81 -101
  24. package/dist/commands/query.d.ts +63 -0
  25. package/dist/commands/query.js +349 -0
  26. package/dist/commands/space/list.d.ts +5 -2
  27. package/dist/commands/space/list.js +60 -56
  28. package/dist/commands/space/switch.d.ts +16 -0
  29. package/dist/commands/space/switch.js +102 -53
  30. package/dist/commands/status.d.ts +5 -2
  31. package/dist/commands/status.js +43 -33
  32. package/dist/commands/watch.d.ts +23 -0
  33. package/dist/commands/watch.js +171 -0
  34. package/dist/config/auth.config.js +14 -2
  35. package/dist/config/context-tree-domains.d.ts +12 -0
  36. package/dist/config/context-tree-domains.js +29 -0
  37. package/dist/config/environment.d.ts +6 -0
  38. package/dist/config/environment.js +9 -2
  39. package/dist/constants.d.ts +5 -0
  40. package/dist/constants.js +6 -0
  41. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  42. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  43. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  44. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  45. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  46. package/dist/core/domain/cipher/agent/index.js +7 -0
  47. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  48. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  50. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  51. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  52. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  53. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  54. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  55. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  56. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  57. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  58. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  59. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  60. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  61. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  62. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  63. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  64. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  65. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  66. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  67. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  68. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  69. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  70. package/dist/core/domain/cipher/memory/types.js +4 -0
  71. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  72. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  73. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  74. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  75. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  76. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  77. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  78. package/dist/core/domain/cipher/todos/index.js +4 -0
  79. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  80. package/dist/core/domain/cipher/todos/types.js +5 -0
  81. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  82. package/dist/core/domain/cipher/tools/constants.js +24 -0
  83. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  84. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  85. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  86. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  87. package/dist/core/domain/entities/brv-config.js +115 -17
  88. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  89. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  90. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  91. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  92. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  93. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  94. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  95. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  96. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  97. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  98. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  99. package/dist/core/domain/entities/context-tree-index.js +27 -0
  100. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  101. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  102. package/dist/core/domain/entities/event.d.ts +1 -1
  103. package/dist/core/domain/entities/event.js +3 -1
  104. package/dist/core/domain/entities/parser.d.ts +567 -0
  105. package/dist/core/domain/entities/parser.js +10 -0
  106. package/dist/core/domain/entities/playbook.d.ts +2 -23
  107. package/dist/core/domain/entities/playbook.js +2 -70
  108. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  109. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  110. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  111. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  112. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  113. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  114. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  115. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  116. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  117. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  118. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  119. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  120. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  121. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  122. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  123. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  124. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  125. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  128. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  129. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  130. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  131. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  132. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  133. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  134. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  135. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  136. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  137. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  139. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  140. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  141. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  142. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  143. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  144. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  145. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  146. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  147. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  148. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  149. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  150. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  151. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  153. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  155. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  156. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  157. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  158. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  159. package/dist/core/interfaces/cipher/message-types.js +5 -0
  160. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  161. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  162. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  163. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  164. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  165. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  166. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  167. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  168. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  169. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  171. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  173. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  174. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  175. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  176. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  177. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  178. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  179. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  180. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  181. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  182. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  183. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  184. package/dist/hooks/error/clean-errors.d.ts +7 -0
  185. package/dist/hooks/error/clean-errors.js +50 -0
  186. package/dist/hooks/init/welcome.js +72 -1
  187. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  188. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  189. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  190. package/dist/infra/cipher/agent-service-factory.js +212 -0
  191. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  192. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  193. package/dist/infra/cipher/blob/index.d.ts +10 -0
  194. package/dist/infra/cipher/blob/index.js +12 -0
  195. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  196. package/dist/infra/cipher/blob/migrations.js +148 -0
  197. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  198. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  199. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  200. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  201. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  202. package/dist/infra/cipher/cipher-agent.js +317 -0
  203. package/dist/infra/cipher/command-parser.d.ts +23 -0
  204. package/dist/infra/cipher/command-parser.js +85 -0
  205. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  206. package/dist/infra/cipher/display/todo-display.js +129 -0
  207. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  208. package/dist/infra/cipher/events/event-emitter.js +158 -0
  209. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  210. package/dist/infra/cipher/exit-codes.js +58 -0
  211. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  212. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  213. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  214. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  215. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  216. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  217. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  218. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  219. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  220. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  221. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  222. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  223. package/dist/infra/cipher/interactive-commands.js +198 -0
  224. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  225. package/dist/infra/cipher/interactive-loop.js +352 -0
  226. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  227. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  228. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  229. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  230. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  231. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  232. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  233. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  234. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  235. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  236. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  237. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  238. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  239. package/dist/infra/cipher/llm/context/index.js +2 -0
  240. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  241. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  242. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  243. package/dist/infra/cipher/llm/context/utils.js +89 -0
  244. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  245. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  246. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  247. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  248. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  249. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  250. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  251. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  252. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  253. package/dist/infra/cipher/llm/generators/index.js +13 -0
  254. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  255. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  256. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  257. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  258. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  259. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  260. package/dist/infra/cipher/llm/index.d.ts +9 -0
  261. package/dist/infra/cipher/llm/index.js +13 -0
  262. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  263. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  264. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  265. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  266. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  267. package/dist/infra/cipher/llm/response-validator.js +157 -0
  268. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  269. package/dist/infra/cipher/llm/retry/index.js +10 -0
  270. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  271. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  272. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  273. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  274. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  275. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  276. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  277. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  278. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  279. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  280. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  281. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  282. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  283. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  284. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  285. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  286. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  287. package/dist/infra/cipher/logger/console-logger.js +63 -0
  288. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  289. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  290. package/dist/infra/cipher/memory/index.d.ts +6 -0
  291. package/dist/infra/cipher/memory/index.js +7 -0
  292. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  293. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  294. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  295. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  296. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  297. package/dist/infra/cipher/process/command-validator.js +266 -0
  298. package/dist/infra/cipher/process/index.d.ts +8 -0
  299. package/dist/infra/cipher/process/index.js +8 -0
  300. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  301. package/dist/infra/cipher/process/process-service.js +439 -0
  302. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  303. package/dist/infra/cipher/session/chat-session.js +165 -0
  304. package/dist/infra/cipher/session/index.d.ts +6 -0
  305. package/dist/infra/cipher/session/index.js +5 -0
  306. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  307. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  308. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  309. package/dist/infra/cipher/session/session-manager.js +172 -0
  310. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  311. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  312. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  313. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  314. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  315. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  316. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  317. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  318. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  319. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  320. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  321. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  322. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  323. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  324. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  326. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  327. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  328. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  329. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  330. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  331. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  332. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  333. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  334. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  335. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  336. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  337. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  338. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  339. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  340. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  342. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  344. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  346. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  347. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  348. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  350. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  351. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  352. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  353. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  354. package/dist/infra/cipher/tools/index.d.ts +18 -0
  355. package/dist/infra/cipher/tools/index.js +19 -0
  356. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  357. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  358. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  359. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  360. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  361. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  362. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  363. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  364. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  365. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  366. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  367. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  368. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  369. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  370. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  371. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  372. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  373. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  374. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  375. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  376. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  377. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  378. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  379. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  380. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  381. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  382. package/dist/infra/config/file-config-store.js +9 -3
  383. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  384. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  385. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  386. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  387. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  388. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  389. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  390. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  391. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  392. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  393. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  394. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  395. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  396. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  397. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  398. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  399. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  400. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  401. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  402. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  403. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  404. package/dist/infra/parsers/clean/shared.js +273 -0
  405. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  406. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  407. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  408. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  409. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  410. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  411. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  412. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  413. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  414. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  415. package/dist/infra/space/http-space-service.js +2 -1
  416. package/dist/infra/team/http-team-service.js +2 -1
  417. package/dist/infra/user/http-user-service.js +2 -1
  418. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  419. package/dist/infra/watcher/file-watcher-service.js +81 -0
  420. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  421. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  422. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  423. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  424. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  425. package/dist/resources/prompts/reflection.yml +27 -0
  426. package/dist/resources/prompts/system-prompt.yml +82 -0
  427. package/dist/resources/prompts/tool-outputs.yml +30 -0
  428. package/dist/templates/README.md +6 -7
  429. package/dist/templates/sections/command-reference.md +40 -111
  430. package/dist/templates/sections/workflow.md +3 -30
  431. package/dist/utils/emoji-helpers.d.ts +38 -0
  432. package/dist/utils/emoji-helpers.js +42 -0
  433. package/dist/utils/error-handler.d.ts +51 -0
  434. package/dist/utils/error-handler.js +169 -0
  435. package/dist/utils/error-helpers.d.ts +30 -0
  436. package/dist/utils/error-helpers.js +47 -0
  437. package/dist/utils/file-helpers.d.ts +15 -0
  438. package/dist/utils/file-helpers.js +44 -0
  439. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  440. package/dist/utils/oclif-error-helpers.js +46 -0
  441. package/dist/utils/tool-display-formatter.d.ts +53 -0
  442. package/dist/utils/tool-display-formatter.js +257 -0
  443. package/oclif.manifest.json +381 -141
  444. package/package.json +27 -6
  445. package/dist/commands/add.d.ts +0 -49
  446. package/dist/commands/add.js +0 -192
  447. package/dist/commands/complete.d.ts +0 -108
  448. package/dist/commands/complete.js +0 -340
  449. package/dist/commands/retrieve.d.ts +0 -26
  450. package/dist/commands/retrieve.js +0 -101
  451. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  452. package/dist/core/domain/entities/curator-output.js +0 -23
  453. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  454. package/dist/core/domain/entities/delta-batch.js +0 -52
  455. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  456. package/dist/core/domain/entities/delta-operation.js +0 -50
  457. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  458. package/dist/core/domain/entities/executor-output.js +0 -33
  459. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  460. package/dist/core/domain/entities/reflector-output.js +0 -44
  461. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  462. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  463. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  464. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  465. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  466. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  467. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  468. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  469. package/dist/infra/ace/ace-file-utils.js +0 -83
  470. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  471. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  472. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  473. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  474. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  475. package/dist/infra/ace/file-delta-store.js +0 -26
  476. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  477. package/dist/infra/ace/file-executor-output-store.js +0 -26
  478. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  479. package/dist/infra/ace/file-playbook-store.js +0 -107
  480. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  481. package/dist/infra/ace/file-reflection-store.js +0 -55
  482. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  483. package/dist/infra/playbook/file-playbook-service.js +0 -132
  484. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  485. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  486. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  487. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  488. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  489. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  490. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,558 @@
1
+ /**
2
+ * GitHub Copilot Raw Service
3
+ * Consolidates CopilotParser + CopilotRawParser
4
+ * Extracts and exports GitHub Copilot chat sessions
5
+ */
6
+ import Database from 'better-sqlite3';
7
+ import { readFileSync, writeFileSync } from 'node:fs';
8
+ import * as fs from 'node:fs';
9
+ import { basename, join } from 'node:path';
10
+ // ============================================================================
11
+ // Constants
12
+ // ============================================================================
13
+ const VS_CODE_STORAGE_PATH = 'Library/Application Support/Code/User/workspaceStorage';
14
+ const DEFAULT_HOME_DIR = '~';
15
+ const SCM_REPOSITORIES_KEY = 'scm:view:visibleRepositories';
16
+ const FILE_URI_PATTERN = /file:\/\/(.+)$/;
17
+ const TITLE_MAX_LENGTH = 150;
18
+ const TITLE_TRUNCATE_LENGTH = 100;
19
+ const TITLE_ELLIPSIS = '...';
20
+ const UNKNOWN_USERNAME = 'Unknown';
21
+ const GITHUB_COPILOT = 'GitHub Copilot';
22
+ const UNKNOWN_LOCATION = 'unknown';
23
+ const DEFAULT_SESSION_TITLE = 'Copilot Chat Session';
24
+ const UNKNOWN_WORKSPACE = 'unknown-workspace';
25
+ const UNKNOWN_KIND = 'unknown';
26
+ // ============================================================================
27
+ // Copilot Raw Parser Service
28
+ // ============================================================================
29
+ /**
30
+ * Copilot Raw Parser Service class
31
+ * Handles extraction of GitHub Copilot sessions from VS Code workspace storage
32
+ */
33
+ export class CopilotRawService {
34
+ ide;
35
+ workspaceStoragePath;
36
+ // ========================================================================
37
+ // Constructor
38
+ // ========================================================================
39
+ /**
40
+ * Initialize Copilot Raw Service
41
+ *
42
+ * Detects and initializes the VS Code workspace storage path where
43
+ * GitHub Copilot chat session databases are stored.
44
+ *
45
+ * @param ide - The IDE type (Github Copilot)
46
+ */
47
+ constructor(ide) {
48
+ this.ide = ide;
49
+ this.workspaceStoragePath = this.detectWorkspacePath();
50
+ }
51
+ // ========================================================================
52
+ // Public Methods
53
+ // ========================================================================
54
+ /**
55
+ * Main entry point - Parse and export GitHub Copilot sessions
56
+ *
57
+ * Parses GitHub Copilot sessions from custom directory, extracts session data,
58
+ * and exports to JSON files organized by workspace. Creates summary file with
59
+ * aggregate statistics across all sessions. Returns success status.
60
+ *
61
+ * @param customDir - Path to directory containing GitHub Copilot session data
62
+ * @param outputDir - Optional output directory (defaults to process.cwd()/.brv/logs/{ide}/raw)
63
+ * @returns Promise resolving to true if parsing succeeded, false otherwise
64
+ */
65
+ async parse(customDir, outputDir) {
66
+ const baseOutputDir = outputDir || join(process.cwd(), `.brv/logs/${this.ide}/raw`);
67
+ console.log('🔍 Starting GitHub Copilot conversation parsing...');
68
+ try {
69
+ // Parse all sessions from custom directory
70
+ const sessions = await this.parseFromDirectory(customDir);
71
+ if (sessions.length === 0) {
72
+ console.log('ℹ️ No GitHub Copilot sessions found');
73
+ return true;
74
+ }
75
+ console.log(`\n✅ Found ${sessions.length} Copilot sessions`);
76
+ // Organize sessions by workspace hash
77
+ const sessionsByWorkspace = {};
78
+ for (const session of sessions) {
79
+ const workspaceHash = session.metadata.workspace?.path || UNKNOWN_WORKSPACE;
80
+ if (!sessionsByWorkspace[workspaceHash]) {
81
+ sessionsByWorkspace[workspaceHash] = [];
82
+ }
83
+ sessionsByWorkspace[workspaceHash].push({
84
+ ...session,
85
+ workspaceHash,
86
+ });
87
+ }
88
+ console.log(`\n📁 Organized into ${Object.keys(sessionsByWorkspace).length} workspace(s)`);
89
+ // Export sessions organized by workspace
90
+ console.log('\n💾 Exporting sessions by workspace...');
91
+ for (const [workspaceHash, workspaceSessions] of Object.entries(sessionsByWorkspace)) {
92
+ const workspaceDir = join(baseOutputDir, workspaceHash);
93
+ if (!fs.existsSync(workspaceDir)) {
94
+ fs.mkdirSync(workspaceDir, { recursive: true });
95
+ }
96
+ console.log(`\n 📂 Workspace (${workspaceHash})`);
97
+ // Extract workspace path from first session (should be consistent)
98
+ const workspacePath = workspaceSessions[0]?.workspacePath || 'Unknown Workspace';
99
+ // Export session files for this workspace
100
+ for (const session of workspaceSessions) {
101
+ const filename = `${session.id}.json`;
102
+ const filepath = join(workspaceDir, filename);
103
+ const sessionData = {
104
+ ...session,
105
+ workspacePath: session.workspacePath || workspacePath
106
+ };
107
+ writeFileSync(filepath, JSON.stringify(sessionData, null, 2));
108
+ const fileSize = readFileSync(filepath).length;
109
+ const fileSizeKb = (fileSize / 1024).toFixed(1);
110
+ console.log(` ✅ ${session.title} (${fileSizeKb} KB)`);
111
+ }
112
+ }
113
+ console.log(`\n🎉 Copilot export complete! Sessions exported to: ${baseOutputDir}`);
114
+ return true;
115
+ }
116
+ catch (error) {
117
+ console.error('❌ Error during parsing:', error);
118
+ throw error;
119
+ }
120
+ }
121
+ /**
122
+ * Calculate total session duration from request timings
123
+ *
124
+ * Aggregates the totalElapsed time from all requests' result.timings field.
125
+ * Returns total duration in milliseconds across all request/response cycles.
126
+ *
127
+ * @param requests - Array of Copilot request data with timing information
128
+ * @returns Total elapsed time in milliseconds
129
+ */
130
+ calculateTotalDuration(requests) {
131
+ let totalTime = 0;
132
+ for (const request of requests) {
133
+ if (request.result?.timings?.totalElapsed) {
134
+ totalTime += request.result.timings.totalElapsed;
135
+ }
136
+ }
137
+ return totalTime;
138
+ }
139
+ // ========================================================================
140
+ // Private Methods - Initialization
141
+ // ========================================================================
142
+ /**
143
+ * Convert Copilot requests to normalized messages
144
+ *
145
+ * Transforms request/response pairs into alternating user and assistant messages.
146
+ * Each request becomes a user message (with attachments), and the response becomes
147
+ * an assistant message. Handles multiple response blocks and normalizes content format.
148
+ *
149
+ * @param requests - Array of Copilot request data to convert
150
+ * @returns Array of normalized RawCopilotRawMessage objects
151
+ */
152
+ convertRequestsToMessages(requests) {
153
+ const messages = [];
154
+ for (const request of requests) {
155
+ // Add user message
156
+ if (request.message?.text) {
157
+ messages.push({
158
+ attachments: this.extractAttachments(request.variableData),
159
+ content: request.message.text,
160
+ type: 'user',
161
+ });
162
+ }
163
+ // Add assistant response(s)
164
+ if (request.response && Array.isArray(request.response)) {
165
+ const responseContent = request.response.map((block) => this.normalizeContentBlock(block));
166
+ if (responseContent.length > 0) {
167
+ // If single string, use it directly; if single block, use it; otherwise filter blocks only
168
+ let content;
169
+ if (responseContent.length === 1 && typeof responseContent[0] === 'string') {
170
+ content = responseContent[0];
171
+ }
172
+ else {
173
+ const blockContent = responseContent.filter((item) => typeof item !== 'string');
174
+ content = blockContent.length === 1 ? blockContent[0] : blockContent;
175
+ }
176
+ messages.push({
177
+ content,
178
+ type: 'assistant',
179
+ });
180
+ }
181
+ }
182
+ }
183
+ return messages;
184
+ }
185
+ // ========================================================================
186
+ // Private Methods - Parsing
187
+ // ========================================================================
188
+ /**
189
+ * Detect VS Code Copilot workspace storage path
190
+ *
191
+ * Locates the VS Code workspace storage directory where GitHub Copilot chat sessions
192
+ * are stored. Defaults to ~/Library/Application Support/Code/User/workspaceStorage
193
+ * on macOS or constructs path from HOME environment variable.
194
+ *
195
+ * @returns Absolute path to VS Code workspace storage directory
196
+ * @throws Error if VS Code workspace storage directory not found
197
+ */
198
+ detectWorkspacePath() {
199
+ const homedir = process.env.HOME || DEFAULT_HOME_DIR;
200
+ const defaultPath = join(homedir, VS_CODE_STORAGE_PATH);
201
+ if (fs.existsSync(defaultPath)) {
202
+ return defaultPath;
203
+ }
204
+ throw new Error(`VS Code workspace storage not found at ${defaultPath}`);
205
+ }
206
+ /**
207
+ * Extract attachment file names from variable data
208
+ *
209
+ * Extracts names of attached files/references from Copilot variable data.
210
+ * Returns empty array if variable data is missing or contains no variables.
211
+ *
212
+ * @param variableData - Optional Copilot variable data containing attachments
213
+ * @returns Array of attachment file names
214
+ */
215
+ extractAttachments(variableData) {
216
+ const attachments = [];
217
+ if (!variableData?.variables || !Array.isArray(variableData.variables)) {
218
+ return attachments;
219
+ }
220
+ for (const variable of variableData.variables) {
221
+ if (variable.name) {
222
+ attachments.push(variable.name);
223
+ }
224
+ }
225
+ return attachments;
226
+ }
227
+ // ========================================================================
228
+ // Private Methods - Data Transformation
229
+ // ========================================================================
230
+ /**
231
+ * Extract metadata from session data
232
+ *
233
+ * Aggregates session metadata including message counts, participant information,
234
+ * total duration, and workspace identification. Calculates message count as requests * 2
235
+ * (user + assistant message per request).
236
+ *
237
+ * @param data - Copilot session file data
238
+ * @param sessionId - Unique session identifier
239
+ * @param workspaceHash - Workspace hash identifying the workspace
240
+ * @returns Extracted RawCopilotSessionMetadata object
241
+ */
242
+ extractMetadata(data, sessionId, workspaceHash) {
243
+ const requests = data.requests || [];
244
+ return {
245
+ initialLocation: data.initialLocation || UNKNOWN_LOCATION,
246
+ messageCount: Math.max(0, requests.length * 2), // Each request has user + assistant
247
+ requestCount: requests.length,
248
+ requesterUsername: data.requesterUsername || UNKNOWN_USERNAME,
249
+ responderUsername: data.responderUsername || GITHUB_COPILOT,
250
+ sessionId,
251
+ totalDuration: this.calculateTotalDuration(requests),
252
+ workspace: {
253
+ path: workspaceHash
254
+ }
255
+ };
256
+ }
257
+ /**
258
+ * Extract session title from first message or request
259
+ *
260
+ * Uses the first message content as session title (preferred), falls back to first request text.
261
+ * Truncates to TITLE_TRUNCATE_LENGTH (100) if content exceeds TITLE_MAX_LENGTH (150) characters.
262
+ * Appends ellipsis ("...") if truncated. Returns default title if no messages or requests.
263
+ *
264
+ * @param requests - Array of Copilot requests (fallback source)
265
+ * @param messages - Array of normalized messages (preferred source)
266
+ * @returns Session title string (max 103 characters with ellipsis)
267
+ */
268
+ extractTitle(requests, messages) {
269
+ // Try to use first message text
270
+ if (messages.length > 0 && typeof messages[0].content === 'string') {
271
+ const text = messages[0].content;
272
+ return text.length > TITLE_MAX_LENGTH ? text.slice(0, Math.max(0, TITLE_TRUNCATE_LENGTH)) + TITLE_ELLIPSIS : text;
273
+ }
274
+ // Fallback to first request message
275
+ if (requests.length > 0 && requests[0].message?.text) {
276
+ const { text } = requests[0].message;
277
+ return text.length > TITLE_MAX_LENGTH ? text.slice(0, Math.max(0, TITLE_TRUNCATE_LENGTH)) + TITLE_ELLIPSIS : text;
278
+ }
279
+ return DEFAULT_SESSION_TITLE;
280
+ }
281
+ /**
282
+ * Extract workspace path using hybrid approach
283
+ *
284
+ * Attempts extraction using two tiers in order of reliability:
285
+ * - Tier 1A: SQLite scm:view:visibleRepositories (most reliable, handles monorepos)
286
+ * - Tier 1B: baseUri.path from session data (fallback approach)
287
+ * Returns single string for single repo, array for monorepo, or null if not found.
288
+ *
289
+ * @param data - Copilot session file data (used for Tier 1B fallback)
290
+ * @param workspaceHash - Workspace hash for SQLite database lookup
291
+ * @returns Workspace path(s) as string, string array, or null if not found
292
+ */
293
+ extractWorkspacePath(data, workspaceHash) {
294
+ // Tier 1A: Try SQLite first
295
+ const tier1aResult = this.extractWorkspacePathTier1A(workspaceHash);
296
+ if (tier1aResult) {
297
+ return tier1aResult;
298
+ }
299
+ // Tier 1B: Fall back to baseUri extraction
300
+ const tier1bResult = this.extractWorkspacePathTier1B(data);
301
+ if (tier1bResult) {
302
+ return tier1bResult;
303
+ }
304
+ return null;
305
+ }
306
+ /**
307
+ * Tier 1A: Extract repository paths from VS Code SQLite state.vscdb
308
+ * This is the most reliable source as it contains actual repositories visible in the workspace
309
+ * and can handle multi-repo/monorepo setups
310
+ *
311
+ * Returns:
312
+ * - Array of strings for monorepo/multi-repo workspaces
313
+ * - Single string for single-repo workspaces
314
+ * - null if not found
315
+ */
316
+ extractWorkspacePathTier1A(workspaceHash) {
317
+ try {
318
+ const dbPath = join(this.workspaceStoragePath, workspaceHash, 'state.vscdb');
319
+ if (!fs.existsSync(dbPath)) {
320
+ return null;
321
+ }
322
+ const db = new Database(dbPath, { readonly: true });
323
+ try {
324
+ // Query for scm:view:visibleRepositories
325
+ const stmt = db.prepare(`SELECT value FROM ItemTable WHERE key = '${SCM_REPOSITORIES_KEY}'`);
326
+ const row = stmt.get();
327
+ if (!row?.value) {
328
+ return null;
329
+ }
330
+ // Parse the JSON value
331
+ const scmData = JSON.parse(row.value);
332
+ const repositories = scmData.all;
333
+ if (!repositories || repositories.length === 0) {
334
+ return null;
335
+ }
336
+ // Extract all repository paths
337
+ // Format is: git:Git:file:///path/to/repo
338
+ const extractedPaths = [];
339
+ for (const repoUri of repositories) {
340
+ const pathMatch = repoUri.match(FILE_URI_PATTERN);
341
+ if (pathMatch && pathMatch[1]) {
342
+ extractedPaths.push(pathMatch[1]);
343
+ }
344
+ }
345
+ if (extractedPaths.length === 0) {
346
+ return null;
347
+ }
348
+ // Return array for multiple repos, string for single repo
349
+ return extractedPaths.length > 1 ? extractedPaths : extractedPaths[0];
350
+ }
351
+ finally {
352
+ db.close();
353
+ }
354
+ }
355
+ catch {
356
+ return null;
357
+ }
358
+ }
359
+ /**
360
+ * Extract workspace path from baseUri in session data (Tier 1B fallback)
361
+ *
362
+ * Recursively searches session data for objects with baseUri.path property containing
363
+ * an absolute file path. Used as fallback when SQLite extraction fails. Returns first
364
+ * valid path found, or null if no baseUri path found.
365
+ *
366
+ * @param data - Copilot session file data to search
367
+ * @returns Extracted workspace path string, or null if not found
368
+ */
369
+ extractWorkspacePathTier1B(data) {
370
+ const traverse = (obj) => {
371
+ if (!obj || typeof obj !== 'object')
372
+ return null;
373
+ const objRecord = obj;
374
+ // If this object has baseUri with path, return it
375
+ const baseUri = objRecord.baseUri;
376
+ if (baseUri?.path && typeof baseUri.path === 'string') {
377
+ const filePath = baseUri.path;
378
+ if (filePath.startsWith('/')) {
379
+ return filePath;
380
+ }
381
+ }
382
+ // Traverse all properties
383
+ for (const key in objRecord) {
384
+ if (typeof objRecord[key] === 'object' && objRecord[key] !== null) {
385
+ const result = traverse(objRecord[key]);
386
+ if (result)
387
+ return result;
388
+ }
389
+ }
390
+ return null;
391
+ };
392
+ return traverse(data);
393
+ }
394
+ /**
395
+ * Normalize Copilot content blocks
396
+ *
397
+ * Converts various content block formats to normalized RawCopilotContentBlock format.
398
+ * Preserves string content as-is, ensures all blocks have a kind field (defaults to 'unknown'),
399
+ * and stringifies non-object content as fallback.
400
+ *
401
+ * @param block - Content block to normalize (string or object)
402
+ * @returns Normalized content block or string
403
+ */
404
+ normalizeContentBlock(block) {
405
+ if (typeof block === 'string') {
406
+ return block;
407
+ }
408
+ if (!block || typeof block !== 'object') {
409
+ return JSON.stringify(block);
410
+ }
411
+ // Return block as-is with kind field
412
+ return {
413
+ kind: block.kind || UNKNOWN_KIND,
414
+ ...block
415
+ };
416
+ }
417
+ /**
418
+ * Normalize a Copilot request to RawCopilotParsedRequest type
419
+ *
420
+ * Standardizes request data structure, ensuring all required fields have values
421
+ * (using empty defaults where needed). Preserves response, result, and variable data.
422
+ *
423
+ * @param req - Raw Copilot request data to normalize
424
+ * @returns Normalized RawCopilotParsedRequest object
425
+ */
426
+ normalizeParsedRequest(req) {
427
+ // Normalize response array if present
428
+ let response;
429
+ if (Array.isArray(req.response)) {
430
+ response = req.response;
431
+ }
432
+ return {
433
+ message: req.message || {},
434
+ requestId: req.requestId || '',
435
+ response: response,
436
+ responseId: req.responseId || '',
437
+ result: req.result,
438
+ variableData: req.variableData,
439
+ };
440
+ }
441
+ /**
442
+ * Parse GitHub Copilot sessions from a custom directory
443
+ *
444
+ * Handles two directory structures:
445
+ * 1. Direct workspace directory (containing chatSessions/ subdirectory)
446
+ * 2. Parent directory (containing multiple workspace hash subdirectories)
447
+ * Parses all workspace directories in parallel and returns combined sessions array.
448
+ *
449
+ * @param customDir - Path to custom directory containing Copilot session data
450
+ * @returns Promise resolving to array of parsed RawCopilotRawSession objects
451
+ */
452
+ async parseFromDirectory(customDir) {
453
+ const sessions = [];
454
+ try {
455
+ // Check if the provided directory itself contains chatSessions
456
+ const chatSessionsPath = join(customDir, 'chatSessions');
457
+ if (fs.existsSync(chatSessionsPath)) {
458
+ // This is a workspace directory, parse it directly
459
+ const workspaceSessions = await this.parseWorkspaceDirectory(customDir, basename(customDir));
460
+ sessions.push(...workspaceSessions);
461
+ return sessions;
462
+ }
463
+ // Otherwise, iterate through subdirectories looking for workspace directories
464
+ const workspaceDirs = fs.readdirSync(customDir);
465
+ const parsePromises = workspaceDirs
466
+ .filter((workspaceDir) => {
467
+ const workspacePath = join(customDir, workspaceDir);
468
+ const stat = fs.statSync(workspacePath);
469
+ return stat.isDirectory();
470
+ })
471
+ .map((workspaceDir) => this.parseWorkspaceDirectory(join(customDir, workspaceDir), workspaceDir));
472
+ const allSessions = await Promise.all(parsePromises);
473
+ for (const workspaceSessions of allSessions) {
474
+ sessions.push(...workspaceSessions);
475
+ }
476
+ }
477
+ catch (error) {
478
+ console.error('Error parsing custom directory:', error);
479
+ }
480
+ return sessions;
481
+ }
482
+ /**
483
+ * Parse a single Copilot session file
484
+ *
485
+ * Reads and parses a GitHub Copilot session JSON file, extracting all session data
486
+ * including messages, metadata, requests, title, and workspace information.
487
+ * Returns null if file cannot be read or parsed.
488
+ *
489
+ * @param filePath - Absolute path to Copilot session JSON file
490
+ * @param workspaceHash - Workspace hash for the session (used for lookups)
491
+ * @returns Parsed RawCopilotRawSession object, or null if parsing fails
492
+ */
493
+ parseSessionFile(filePath, workspaceHash) {
494
+ try {
495
+ const content = fs.readFileSync(filePath, 'utf8');
496
+ const data = JSON.parse(content);
497
+ const sessionId = basename(filePath, '.json');
498
+ const requests = data.requests || [];
499
+ // Convert requests to messages
500
+ const messages = this.convertRequestsToMessages(requests);
501
+ // Generate title from first message or request
502
+ const title = this.extractTitle(requests, messages);
503
+ // Extract metadata
504
+ const metadata = this.extractMetadata(data, sessionId, workspaceHash);
505
+ // Extract workspace path using hybrid approach (Tier 1A SQLite, fallback to Tier 1B baseUri)
506
+ const workspacePath = this.extractWorkspacePath(data, workspaceHash);
507
+ return {
508
+ id: sessionId,
509
+ messages,
510
+ metadata,
511
+ requests: requests.map((req) => this.normalizeParsedRequest(req)),
512
+ timestamp: Date.now(),
513
+ title,
514
+ workspaceHash,
515
+ workspacePath: workspacePath || undefined,
516
+ };
517
+ }
518
+ catch (error) {
519
+ console.error(`Error parsing session ${filePath}:`, error);
520
+ return null;
521
+ }
522
+ }
523
+ /**
524
+ * Parse sessions from a specific workspace directory
525
+ *
526
+ * Reads all .json files from the chatSessions subdirectory within a workspace,
527
+ * parses each session file, and returns array of successfully parsed sessions.
528
+ * Returns empty array if chatSessions directory doesn't exist. Logs errors for
529
+ * failed parses but continues processing remaining files.
530
+ *
531
+ * @param workspacePath - Path to workspace directory containing chatSessions
532
+ * @param workspaceHash - Workspace hash for the workspace
533
+ * @returns Promise resolving to array of parsed RawCopilotRawSession objects
534
+ */
535
+ async parseWorkspaceDirectory(workspacePath, workspaceHash) {
536
+ const sessions = [];
537
+ const chatSessionsDir = join(workspacePath, 'chatSessions');
538
+ if (!fs.existsSync(chatSessionsDir)) {
539
+ return sessions;
540
+ }
541
+ try {
542
+ const files = fs.readdirSync(chatSessionsDir);
543
+ for (const file of files) {
544
+ if (file.endsWith('.json')) {
545
+ const filePath = join(chatSessionsDir, file);
546
+ const session = this.parseSessionFile(filePath, workspaceHash);
547
+ if (session) {
548
+ sessions.push(session);
549
+ }
550
+ }
551
+ }
552
+ }
553
+ catch (error) {
554
+ console.error(`Error parsing workspace ${workspaceHash}:`, error);
555
+ }
556
+ return sessions;
557
+ }
558
+ }