byterover-cli 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +48 -3
  18. package/dist/commands/init.js +242 -70
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/pull.d.ts +33 -0
  21. package/dist/commands/pull.js +115 -0
  22. package/dist/commands/push.d.ts +13 -13
  23. package/dist/commands/push.js +81 -101
  24. package/dist/commands/query.d.ts +63 -0
  25. package/dist/commands/query.js +349 -0
  26. package/dist/commands/space/list.d.ts +5 -2
  27. package/dist/commands/space/list.js +60 -56
  28. package/dist/commands/space/switch.d.ts +16 -0
  29. package/dist/commands/space/switch.js +102 -53
  30. package/dist/commands/status.d.ts +5 -2
  31. package/dist/commands/status.js +43 -33
  32. package/dist/commands/watch.d.ts +23 -0
  33. package/dist/commands/watch.js +171 -0
  34. package/dist/config/auth.config.js +14 -2
  35. package/dist/config/context-tree-domains.d.ts +12 -0
  36. package/dist/config/context-tree-domains.js +29 -0
  37. package/dist/config/environment.d.ts +6 -0
  38. package/dist/config/environment.js +9 -2
  39. package/dist/constants.d.ts +5 -0
  40. package/dist/constants.js +6 -0
  41. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  42. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  43. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  44. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  45. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  46. package/dist/core/domain/cipher/agent/index.js +7 -0
  47. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  48. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  50. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  51. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  52. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  53. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  54. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  55. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  56. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  57. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  58. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  59. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  60. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  61. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  62. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  63. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  64. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  65. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  66. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  67. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  68. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  69. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  70. package/dist/core/domain/cipher/memory/types.js +4 -0
  71. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  72. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  73. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  74. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  75. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  76. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  77. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  78. package/dist/core/domain/cipher/todos/index.js +4 -0
  79. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  80. package/dist/core/domain/cipher/todos/types.js +5 -0
  81. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  82. package/dist/core/domain/cipher/tools/constants.js +24 -0
  83. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  84. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  85. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  86. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  87. package/dist/core/domain/entities/brv-config.js +115 -17
  88. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  89. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  90. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  91. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  92. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  93. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  94. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  95. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  96. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  97. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  98. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  99. package/dist/core/domain/entities/context-tree-index.js +27 -0
  100. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  101. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  102. package/dist/core/domain/entities/event.d.ts +1 -1
  103. package/dist/core/domain/entities/event.js +3 -1
  104. package/dist/core/domain/entities/parser.d.ts +567 -0
  105. package/dist/core/domain/entities/parser.js +10 -0
  106. package/dist/core/domain/entities/playbook.d.ts +2 -23
  107. package/dist/core/domain/entities/playbook.js +2 -70
  108. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  109. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  110. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  111. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  112. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  113. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  114. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  115. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  116. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  117. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  118. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  119. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  120. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  121. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  122. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  123. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  124. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  125. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  128. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  129. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  130. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  131. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  132. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  133. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  134. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  135. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  136. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  137. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  139. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  140. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  141. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  142. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  143. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  144. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  145. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  146. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  147. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  148. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  149. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  150. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  151. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  153. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  155. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  156. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  157. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  158. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  159. package/dist/core/interfaces/cipher/message-types.js +5 -0
  160. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  161. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  162. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  163. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  164. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  165. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  166. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  167. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  168. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  169. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  171. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  173. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  174. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  175. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  176. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  177. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  178. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  179. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  180. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  181. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  182. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  183. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  184. package/dist/hooks/error/clean-errors.d.ts +7 -0
  185. package/dist/hooks/error/clean-errors.js +50 -0
  186. package/dist/hooks/init/welcome.js +72 -1
  187. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  188. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  189. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  190. package/dist/infra/cipher/agent-service-factory.js +212 -0
  191. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  192. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  193. package/dist/infra/cipher/blob/index.d.ts +10 -0
  194. package/dist/infra/cipher/blob/index.js +12 -0
  195. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  196. package/dist/infra/cipher/blob/migrations.js +148 -0
  197. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  198. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  199. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  200. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  201. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  202. package/dist/infra/cipher/cipher-agent.js +317 -0
  203. package/dist/infra/cipher/command-parser.d.ts +23 -0
  204. package/dist/infra/cipher/command-parser.js +85 -0
  205. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  206. package/dist/infra/cipher/display/todo-display.js +129 -0
  207. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  208. package/dist/infra/cipher/events/event-emitter.js +158 -0
  209. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  210. package/dist/infra/cipher/exit-codes.js +58 -0
  211. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  212. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  213. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  214. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  215. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  216. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  217. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  218. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  219. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  220. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  221. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  222. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  223. package/dist/infra/cipher/interactive-commands.js +198 -0
  224. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  225. package/dist/infra/cipher/interactive-loop.js +352 -0
  226. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  227. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  228. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  229. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  230. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  231. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  232. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  233. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  234. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  235. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  236. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  237. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  238. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  239. package/dist/infra/cipher/llm/context/index.js +2 -0
  240. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  241. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  242. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  243. package/dist/infra/cipher/llm/context/utils.js +89 -0
  244. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  245. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  246. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  247. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  248. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  249. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  250. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  251. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  252. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  253. package/dist/infra/cipher/llm/generators/index.js +13 -0
  254. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  255. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  256. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  257. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  258. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  259. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  260. package/dist/infra/cipher/llm/index.d.ts +9 -0
  261. package/dist/infra/cipher/llm/index.js +13 -0
  262. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  263. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  264. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  265. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  266. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  267. package/dist/infra/cipher/llm/response-validator.js +157 -0
  268. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  269. package/dist/infra/cipher/llm/retry/index.js +10 -0
  270. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  271. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  272. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  273. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  274. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  275. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  276. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  277. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  278. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  279. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  280. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  281. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  282. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  283. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  284. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  285. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  286. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  287. package/dist/infra/cipher/logger/console-logger.js +63 -0
  288. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  289. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  290. package/dist/infra/cipher/memory/index.d.ts +6 -0
  291. package/dist/infra/cipher/memory/index.js +7 -0
  292. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  293. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  294. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  295. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  296. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  297. package/dist/infra/cipher/process/command-validator.js +266 -0
  298. package/dist/infra/cipher/process/index.d.ts +8 -0
  299. package/dist/infra/cipher/process/index.js +8 -0
  300. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  301. package/dist/infra/cipher/process/process-service.js +439 -0
  302. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  303. package/dist/infra/cipher/session/chat-session.js +165 -0
  304. package/dist/infra/cipher/session/index.d.ts +6 -0
  305. package/dist/infra/cipher/session/index.js +5 -0
  306. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  307. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  308. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  309. package/dist/infra/cipher/session/session-manager.js +172 -0
  310. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  311. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  312. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  313. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  314. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  315. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  316. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  317. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  318. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  319. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  320. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  321. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  322. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  323. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  324. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  326. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  327. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  328. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  329. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  330. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  331. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  332. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  333. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  334. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  335. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  336. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  337. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  338. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  339. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  340. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  342. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  344. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  346. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  347. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  348. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  350. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  351. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  352. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  353. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  354. package/dist/infra/cipher/tools/index.d.ts +18 -0
  355. package/dist/infra/cipher/tools/index.js +19 -0
  356. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  357. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  358. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  359. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  360. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  361. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  362. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  363. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  364. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  365. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  366. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  367. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  368. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  369. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  370. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  371. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  372. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  373. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  374. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  375. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  376. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  377. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  378. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  379. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  380. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  381. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  382. package/dist/infra/config/file-config-store.js +9 -3
  383. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  384. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  385. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  386. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  387. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  388. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  389. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  390. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  391. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  392. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  393. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  394. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  395. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  396. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  397. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  398. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  399. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  400. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  401. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  402. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  403. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  404. package/dist/infra/parsers/clean/shared.js +273 -0
  405. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  406. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  407. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  408. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  409. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  410. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  411. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  412. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  413. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  414. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  415. package/dist/infra/space/http-space-service.js +2 -1
  416. package/dist/infra/team/http-team-service.js +2 -1
  417. package/dist/infra/user/http-user-service.js +2 -1
  418. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  419. package/dist/infra/watcher/file-watcher-service.js +81 -0
  420. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  421. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  422. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  423. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  424. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  425. package/dist/resources/prompts/reflection.yml +27 -0
  426. package/dist/resources/prompts/system-prompt.yml +82 -0
  427. package/dist/resources/prompts/tool-outputs.yml +30 -0
  428. package/dist/templates/README.md +6 -7
  429. package/dist/templates/sections/command-reference.md +40 -111
  430. package/dist/templates/sections/workflow.md +3 -30
  431. package/dist/utils/emoji-helpers.d.ts +38 -0
  432. package/dist/utils/emoji-helpers.js +42 -0
  433. package/dist/utils/error-handler.d.ts +51 -0
  434. package/dist/utils/error-handler.js +169 -0
  435. package/dist/utils/error-helpers.d.ts +30 -0
  436. package/dist/utils/error-helpers.js +47 -0
  437. package/dist/utils/file-helpers.d.ts +15 -0
  438. package/dist/utils/file-helpers.js +44 -0
  439. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  440. package/dist/utils/oclif-error-helpers.js +46 -0
  441. package/dist/utils/tool-display-formatter.d.ts +53 -0
  442. package/dist/utils/tool-display-formatter.js +257 -0
  443. package/oclif.manifest.json +381 -141
  444. package/package.json +27 -6
  445. package/dist/commands/add.d.ts +0 -49
  446. package/dist/commands/add.js +0 -192
  447. package/dist/commands/complete.d.ts +0 -108
  448. package/dist/commands/complete.js +0 -340
  449. package/dist/commands/retrieve.d.ts +0 -26
  450. package/dist/commands/retrieve.js +0 -101
  451. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  452. package/dist/core/domain/entities/curator-output.js +0 -23
  453. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  454. package/dist/core/domain/entities/delta-batch.js +0 -52
  455. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  456. package/dist/core/domain/entities/delta-operation.js +0 -50
  457. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  458. package/dist/core/domain/entities/executor-output.js +0 -33
  459. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  460. package/dist/core/domain/entities/reflector-output.js +0 -44
  461. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  462. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  463. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  464. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  465. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  466. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  467. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  468. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  469. package/dist/infra/ace/ace-file-utils.js +0 -83
  470. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  471. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  472. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  473. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  474. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  475. package/dist/infra/ace/file-delta-store.js +0 -26
  476. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  477. package/dist/infra/ace/file-executor-output-store.js +0 -26
  478. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  479. package/dist/infra/ace/file-playbook-store.js +0 -107
  480. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  481. package/dist/infra/ace/file-reflection-store.js +0 -55
  482. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  483. package/dist/infra/playbook/file-playbook-service.js +0 -132
  484. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  485. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  486. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  487. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  488. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  489. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  490. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,729 @@
1
+ /**
2
+ * Copilot Clean Service
3
+ * Transforms GitHub Copilot raw parsed data to clean normalized format
4
+ */
5
+ import { promises as fs } from 'node:fs';
6
+ import { readdir, readFile } from 'node:fs/promises';
7
+ import { join as pathJoin } from 'node:path';
8
+ import { normalizeClaudeSession } from './shared.js';
9
+ /**
10
+ * Copilot Clean Service
11
+ * Transforms GitHub Copilot raw parsed sessions to clean normalized format
12
+ */
13
+ export class CopilotCleanService {
14
+ ide;
15
+ constructor(ide) {
16
+ this.ide = ide;
17
+ }
18
+ /**
19
+ * Parse and transform GitHub Copilot raw sessions to clean normalized format
20
+ *
21
+ * Reads Copilot raw session files organized by workspace, transforms them using
22
+ * Claude-compatible format, and normalizes the sessions.
23
+ * Returns sessions in-memory without file writing.
24
+ *
25
+ * @param rawDir - Absolute path to the directory containing raw Copilot session files organized by workspace
26
+ * @returns Promise resolving to array of clean normalized sessions
27
+ */
28
+ /* eslint-disable no-await-in-loop */
29
+ async parse(rawDir) {
30
+ console.log('🔍 Starting GitHub Copilot clean transformation...');
31
+ console.log(`📁 Raw directory: ${rawDir}`);
32
+ try {
33
+ const workspaceDirs = await readdir(rawDir);
34
+ const allCleanSessions = [];
35
+ for (const workspaceDir of workspaceDirs) {
36
+ const workspacePath = pathJoin(rawDir, workspaceDir);
37
+ const files = await readdir(workspacePath);
38
+ for (const file of files) {
39
+ if (!file.endsWith('.json') || file === 'summary.json')
40
+ continue;
41
+ try {
42
+ const content = await readFile(pathJoin(workspacePath, file), 'utf8');
43
+ const session = JSON.parse(content);
44
+ // Transform Copilot format to Claude format
45
+ const claudeFormatted = this.transformCopilotToClaudeFormat(session);
46
+ // Normalize the session using shared transformer
47
+ const normalized = normalizeClaudeSession(claudeFormatted, 'Copilot');
48
+ // Add to array instead of writing to disk
49
+ allCleanSessions.push(normalized);
50
+ console.log(` ✅ ${session.title}`);
51
+ }
52
+ catch (error) {
53
+ console.warn(`⚠️ Failed to transform ${file}:`, error instanceof Error ? error.message : String(error));
54
+ }
55
+ }
56
+ }
57
+ console.log(`\n🎉 Copilot clean transformation complete! ${allCleanSessions.length} sessions processed`);
58
+ return Object.freeze(allCleanSessions);
59
+ }
60
+ catch (error) {
61
+ console.error('❌ Error during transformation:', error instanceof Error ? error.message : 'Unknown error');
62
+ return Object.freeze([]);
63
+ }
64
+ }
65
+ /* eslint-enable no-await-in-loop */
66
+ /**
67
+ * Process Copilot data by analyzing and transforming valid workspaces
68
+ *
69
+ * Performs complete workspace analysis and transformation:
70
+ * 1. Analyzes all workspaces to identify valid Copilot sessions
71
+ * 2. Logs workspace validity analysis with session counts
72
+ * 3. Copies and transforms valid workspaces to Claude-compatible format
73
+ * Returns statistics about processed workspaces.
74
+ *
75
+ * @param rawResultsDir - Absolute path to raw Copilot results directory
76
+ * @param cleanResultsDir - Absolute path to clean results output directory
77
+ * @returns Promise with statistics: total workspaces, valid count, invalid count
78
+ */
79
+ /* eslint-disable no-await-in-loop */
80
+ async processCopilotData(rawResultsDir, cleanResultsDir) {
81
+ console.log('\n📊 Analyzing Copilot workspaces...');
82
+ const workspaces = await this.analyzeCopilotWorkspaces(rawResultsDir);
83
+ let validCount = 0;
84
+ let invalidCount = 0;
85
+ console.log('\n📋 Copilot Workspace Analysis:');
86
+ for (const [name, info] of workspaces.entries()) {
87
+ if (info.isValid) {
88
+ console.log(` ✅ ${name}`);
89
+ console.log(` ${info.reason}`);
90
+ validCount++;
91
+ }
92
+ else {
93
+ console.log(` ❌ ${name}`);
94
+ console.log(` ${info.reason}`);
95
+ invalidCount++;
96
+ }
97
+ }
98
+ // Copy valid workspaces
99
+ console.log(`\n💾 Copying and transforming ${validCount} valid workspace(s) to clean_results...`);
100
+ const cleanCopilotDir = pathJoin(cleanResultsDir, 'copilot');
101
+ await fs.mkdir(cleanCopilotDir, { recursive: true });
102
+ for (const [name, info] of workspaces.entries()) {
103
+ if (info.isValid) {
104
+ await this.copyValidCopilotWorkspace(name, rawResultsDir, cleanCopilotDir);
105
+ }
106
+ }
107
+ return {
108
+ invalid: invalidCount,
109
+ total: workspaces.size,
110
+ valid: validCount,
111
+ };
112
+ }
113
+ /* eslint-enable no-await-in-loop */
114
+ /**
115
+ * Analyze Copilot workspaces to identify valid vs invalid sessions
116
+ *
117
+ * Scans workspace directories and validates each by checking for valid Copilot session
118
+ * files. A workspace is considered valid if it contains at least one session file with
119
+ * non-empty requests array. Returns a map of workspace information including validity
120
+ * status, valid/empty session counts, and reason.
121
+ *
122
+ * @param copilotResultsDir - Absolute path to directory containing Copilot workspace subdirectories
123
+ * @returns Promise that resolves to a map of workspace names to WorkspaceInfo objects
124
+ */
125
+ /* eslint-disable no-await-in-loop */
126
+ async analyzeCopilotWorkspaces(copilotResultsDir) {
127
+ const workspaceMap = new Map();
128
+ try {
129
+ const entries = await fs.readdir(copilotResultsDir, { withFileTypes: true });
130
+ for (const entry of entries) {
131
+ if (!entry.isDirectory() || entry.name === 'summary.json') {
132
+ continue;
133
+ }
134
+ const workspacePath = pathJoin(copilotResultsDir, entry.name);
135
+ const files = await fs.readdir(workspacePath);
136
+ const jsonFiles = files.filter((f) => f.endsWith('.json') && f !== 'summary.json');
137
+ const validCount = await this.countValidCopilotSessions(workspacePath, jsonFiles);
138
+ const hasValidSessions = validCount > 0;
139
+ workspaceMap.set(entry.name, {
140
+ isValid: hasValidSessions,
141
+ name: entry.name,
142
+ path: workspacePath,
143
+ reason: hasValidSessions
144
+ ? `${validCount} valid session(s), ${jsonFiles.length - validCount} empty session(s)`
145
+ : `No valid sessions found (${jsonFiles.length} empty files)`,
146
+ type: 'copilot',
147
+ });
148
+ }
149
+ }
150
+ catch (error) {
151
+ console.error('Error analyzing Copilot workspaces:', error);
152
+ }
153
+ return workspaceMap;
154
+ }
155
+ /* eslint-enable no-await-in-loop */
156
+ /**
157
+ * Build session metadata from Copilot session data
158
+ *
159
+ * Extracts and formats metadata from Copilot session including message/request counts,
160
+ * usernames, session ID, and duration. Combines data from transformed messages and
161
+ * original session metadata.
162
+ *
163
+ * @param transformedMessages - Array of transformed message objects
164
+ * @param copilotSession - Original Copilot session object with metadata
165
+ * @returns Metadata object with counts, usernames, session ID, and duration
166
+ */
167
+ buildSessionMetadata(transformedMessages, copilotSession) {
168
+ const { metadata } = copilotSession;
169
+ return {
170
+ messageCount: transformedMessages.length,
171
+ requestCount: metadata?.requestCount,
172
+ requesterUsername: metadata?.requesterUsername,
173
+ responderUsername: metadata?.responderUsername,
174
+ sessionId: metadata?.sessionId,
175
+ totalDuration: metadata?.totalDuration,
176
+ };
177
+ }
178
+ /**
179
+ * Copy and transform valid Copilot workspace to clean results directory
180
+ *
181
+ * Processes all JSON files in a valid workspace, transforming valid Copilot sessions
182
+ * (those with non-empty requests) to Claude-compatible format. Applies full normalization
183
+ * pipeline and splits multi-content assistant messages. Creates target directory as needed.
184
+ *
185
+ * @param workspaceHash - Hash identifier of the workspace directory
186
+ * @param sourceDir - Absolute path to parent directory containing workspace directories
187
+ * @param targetDir - Absolute path to clean results output directory
188
+ * @returns Promise that resolves when all files are processed and copied
189
+ */
190
+ /* eslint-disable no-await-in-loop */
191
+ async copyValidCopilotWorkspace(workspaceHash, sourceDir, targetDir) {
192
+ const sourcePath = pathJoin(sourceDir, workspaceHash);
193
+ const targetPath = pathJoin(targetDir, workspaceHash);
194
+ // Create target directory
195
+ await fs.mkdir(targetPath, { recursive: true });
196
+ // Read all files
197
+ const files = await fs.readdir(sourcePath);
198
+ // Copy and transform valid JSON files
199
+ for (const file of files) {
200
+ if (file.endsWith('.json') && file !== 'summary.json') {
201
+ try {
202
+ const sourceFile = pathJoin(sourcePath, file);
203
+ const content = await fs.readFile(sourceFile, 'utf8');
204
+ const data = JSON.parse(content);
205
+ // Only copy if has valid requests (messages field from raw parser)
206
+ if (data.requests && data.requests.length > 0) {
207
+ // Transform to Claude format from requests structure
208
+ const transformed = this.transformCopilotToClaudeFormat(data);
209
+ // Apply full normalization pipeline (content standardization, turn_id assignment, etc.)
210
+ const normalized = normalizeClaudeSession(transformed, 'Copilot');
211
+ // Split assistant messages with multiple content blocks into separate messages
212
+ const split = this.splitAllCopilotContent(normalized);
213
+ const targetFile = pathJoin(targetPath, file);
214
+ await fs.writeFile(targetFile, JSON.stringify(split, null, 2));
215
+ }
216
+ }
217
+ catch {
218
+ // Skip files that can't be processed
219
+ }
220
+ }
221
+ }
222
+ console.log(`✅ Copied and transformed ${workspaceHash} to clean_results`);
223
+ }
224
+ /* eslint-enable no-await-in-loop */
225
+ /**
226
+ * Count valid Copilot session files in a workspace directory
227
+ *
228
+ * Iterates through provided JSON files and counts how many are valid Copilot sessions
229
+ * (have non-empty requests array). Used for workspace analysis and validation.
230
+ *
231
+ * @param workspacePath - Absolute path to the workspace directory
232
+ * @param jsonFiles - Array of JSON filename strings to validate
233
+ * @returns Promise that resolves to the count of valid Copilot session files
234
+ */
235
+ /* eslint-disable no-await-in-loop */
236
+ async countValidCopilotSessions(workspacePath, jsonFiles) {
237
+ let validCount = 0;
238
+ for (const file of jsonFiles) {
239
+ const isValid = await this.isValidCopilotSession(pathJoin(workspacePath, file));
240
+ if (isValid) {
241
+ validCount++;
242
+ }
243
+ }
244
+ return validCount;
245
+ }
246
+ /* eslint-enable no-await-in-loop */
247
+ /**
248
+ * Create assistant message from Copilot request response
249
+ *
250
+ * Extracts response data from Copilot request and builds an assistant message:
251
+ * 1. Converts response text to thinking block
252
+ * 2. Extracts tool invocations with arguments and results
253
+ * Returns null if no content could be extracted.
254
+ *
255
+ * @param req - Copilot request object with response and result data
256
+ * @returns Assistant message object with content array, or null if no valid content
257
+ */
258
+ createAssistantMessageFromRequest(req) {
259
+ if (!req.response || !Array.isArray(req.response)) {
260
+ return null;
261
+ }
262
+ const assistantContent = [];
263
+ // Extract main text response and convert to thinking block
264
+ const responseText = this.extractCopilotResponseText(req.response);
265
+ if (responseText) {
266
+ assistantContent.push({
267
+ thinking: responseText,
268
+ type: 'thinking',
269
+ });
270
+ }
271
+ // Extract tool invocations with their arguments and results
272
+ const { result } = req;
273
+ const resultMetadata = result?.metadata;
274
+ const toolCallRounds = resultMetadata?.toolCallRounds;
275
+ const toolCallResults = resultMetadata?.toolCallResults;
276
+ const toolInvocations = this.extractCopilotToolInvocations(req.response, toolCallRounds, toolCallResults);
277
+ assistantContent.push(...toolInvocations);
278
+ if (assistantContent.length === 0) {
279
+ return null;
280
+ }
281
+ return {
282
+ content: assistantContent,
283
+ timestamp: new Date().toISOString(),
284
+ type: 'assistant',
285
+ };
286
+ }
287
+ /**
288
+ * Create user message from Copilot request
289
+ *
290
+ * Extracts user message text from request and builds a user message object.
291
+ * Includes attachments from variableData if present (file references).
292
+ * Returns null if no message text found.
293
+ *
294
+ * @param req - Copilot request object with message and variableData
295
+ * @returns User message object with text content and optional attachments, or null
296
+ */
297
+ createUserMessageFromRequest(req) {
298
+ if (!req.message) {
299
+ return null;
300
+ }
301
+ const { message } = req;
302
+ const userMessage = {
303
+ content: [
304
+ {
305
+ text: typeof message.text === 'string' ? message.text : '',
306
+ type: 'text',
307
+ },
308
+ ],
309
+ timestamp: new Date().toISOString(),
310
+ type: 'user',
311
+ };
312
+ // Add attachments if present
313
+ const attachments = this.extractCopilotAttachments(req.variableData || { variables: [] });
314
+ if (attachments.length > 0) {
315
+ userMessage.attachments = attachments;
316
+ }
317
+ return userMessage;
318
+ }
319
+ /**
320
+ * Extract file attachments from Copilot variableData
321
+ *
322
+ * Scans the variableData object for file variables and extracts their names.
323
+ * File variables are identified by having kind='file'. Returns an array of filenames
324
+ * representing files attached to a Copilot request/message.
325
+ *
326
+ * @param variableData - Object containing variables array with file references
327
+ * @returns Array of file attachment names extracted from variables
328
+ */
329
+ extractCopilotAttachments(variableData) {
330
+ const attachments = [];
331
+ if (variableData?.variables && Array.isArray(variableData.variables)) {
332
+ for (const variable of variableData.variables) {
333
+ if (variable.kind === 'file' && typeof variable.name === 'string') {
334
+ attachments.push(variable.name);
335
+ }
336
+ }
337
+ }
338
+ return attachments;
339
+ }
340
+ /**
341
+ * Extract text content from Copilot response items
342
+ *
343
+ * Filters response items to find main text responses (items without kind or with kind='unknown')
344
+ * and concatenates their values into a single text string. Skips prepareToolInvocation items
345
+ * which are used for tool setup rather than content. Returns trimmed concatenated text.
346
+ *
347
+ * @param responseItems - Array of response item objects with kind and value properties
348
+ * @returns Concatenated text content from non-tool response items
349
+ */
350
+ extractCopilotResponseText(responseItems) {
351
+ const textParts = [];
352
+ for (const item of responseItems) {
353
+ // Skip prepareToolInvocation items
354
+ if (item.kind === 'prepareToolInvocation') {
355
+ continue;
356
+ }
357
+ // Extract text from unknown kind items (main responses)
358
+ if ((!item.kind || item.kind === 'unknown') && item.value && typeof item.value === 'string') {
359
+ textParts.push(item.value);
360
+ }
361
+ }
362
+ return textParts.join(' ').trim();
363
+ }
364
+ /**
365
+ * Extract tool invocations and their results from Copilot response
366
+ *
367
+ * Processes toolInvocationSerialized response items and matches them with detailed tool calls
368
+ * from toolCallRounds and results from toolCallResults. Constructs tool_use content blocks
369
+ * with parsed arguments (converting from string JSON when needed) and associated output/results.
370
+ * Matches sequentially: the nth toolInvocationSerialized corresponds to the nth toolCall
371
+ * in the collected toolCalls array.
372
+ *
373
+ * @param responseItems - Array of response item objects, filtering for toolInvocationSerialized kind
374
+ * @param toolCallRounds - Optional array of tool call rounds, each containing toolCalls array
375
+ * @param toolCallResults - Optional map of tool results keyed by tool call ID
376
+ * @returns Array of tool_use content blocks with input arguments and output results
377
+ */
378
+ extractCopilotToolInvocations(responseItems, toolCallRounds, toolCallResults) {
379
+ const toolInvocations = [];
380
+ // First, collect all toolCalls from all rounds in order
381
+ const allToolCalls = [];
382
+ if (toolCallRounds && Array.isArray(toolCallRounds)) {
383
+ for (const round of toolCallRounds) {
384
+ if (round.toolCalls && Array.isArray(round.toolCalls)) {
385
+ allToolCalls.push(...round.toolCalls);
386
+ }
387
+ }
388
+ }
389
+ // Track position in allToolCalls - match toolInvocationSerialized items sequentially to toolCalls
390
+ let toolCallIndex = 0;
391
+ for (const item of responseItems) {
392
+ if (item.kind !== 'toolInvocationSerialized' || !item.toolCallId || !item.toolId) {
393
+ continue;
394
+ }
395
+ const toolUse = {
396
+ id: item.toolCallId,
397
+ input: item.invocationMessage?.value || '',
398
+ name: item.toolId,
399
+ type: 'tool_use',
400
+ };
401
+ // Try to find detailed tool call arguments from toolCallRounds
402
+ // Match sequentially - the nth toolInvocationSerialized corresponds to the nth toolCall
403
+ if (toolCallIndex < allToolCalls.length) {
404
+ const toolCall = allToolCalls[toolCallIndex];
405
+ try {
406
+ const args = typeof toolCall.arguments === 'string'
407
+ ? JSON.parse(toolCall.arguments)
408
+ : toolCall.arguments;
409
+ toolUse.input = args;
410
+ // eslint-disable-next-line camelcase
411
+ toolUse.tool_use_id = toolCall.id;
412
+ // Try to find result in toolCallResults
413
+ if (toolCallResults && typeof toolCall.id === 'string' && toolCall.id in toolCallResults) {
414
+ const result = toolCallResults[toolCall.id];
415
+ const textContent = this.extractToolResultContent(result);
416
+ // Always create output property for consistency, even if content is empty
417
+ toolUse.output = {
418
+ content: textContent || '',
419
+ type: 'tool_result',
420
+ };
421
+ }
422
+ }
423
+ catch {
424
+ // Keep original input if parsing fails
425
+ }
426
+ }
427
+ toolCallIndex++;
428
+ toolInvocations.push(toolUse);
429
+ }
430
+ return toolInvocations;
431
+ }
432
+ /**
433
+ * Extract valid workspace path from object's baseUri property
434
+ *
435
+ * Checks if an object contains a baseUri with a valid path property. Path must be
436
+ * a string starting with '/' and must not have been seen before (checked against seenPaths set).
437
+ * Adds valid paths to seenPaths to prevent duplicates. Used for workspace path extraction
438
+ * from nested Copilot session data structures.
439
+ *
440
+ * @param obj - Object that may contain baseUri.path structure
441
+ * @param seenPaths - Set of previously seen paths to avoid duplicates
442
+ * @returns Valid path string if found and not previously seen, null otherwise
443
+ */
444
+ extractPathFromBaseUri(obj, seenPaths) {
445
+ if (!obj || typeof obj !== 'object') {
446
+ return null;
447
+ }
448
+ const objRecord = obj;
449
+ if (!objRecord.baseUri || typeof objRecord.baseUri !== 'object' || objRecord.baseUri === null) {
450
+ return null;
451
+ }
452
+ const baseUri = objRecord.baseUri;
453
+ if (!baseUri.path || typeof baseUri.path !== 'string') {
454
+ return null;
455
+ }
456
+ const { path } = baseUri;
457
+ if (path.startsWith('/') && !seenPaths.has(path)) {
458
+ seenPaths.add(path);
459
+ return path;
460
+ }
461
+ return null;
462
+ }
463
+ /**
464
+ * Extract readable text from deeply nested VS Code/Copilot object structures
465
+ *
466
+ * Recursively traverses nested object trees commonly found in Copilot tool results,
467
+ * extracting all text values from nodes. Handles multiple text source patterns:
468
+ * 1. Direct text property on nodes
469
+ * 2. String values in value property
470
+ * 3. Nested structures in children array
471
+ * 4. Nested structures in node property
472
+ * Returns concatenated text from all found sources, trimmed.
473
+ *
474
+ * @param obj - Nested object structure to traverse (may be object, array, or primitive)
475
+ * @returns Concatenated text content extracted from all nested text sources
476
+ */
477
+ extractTextFromNestedObject(obj) {
478
+ const textParts = [];
479
+ function traverse(node) {
480
+ if (!node)
481
+ return;
482
+ // If this is an array, traverse each element
483
+ if (Array.isArray(node)) {
484
+ for (const item of node) {
485
+ traverse(item);
486
+ }
487
+ return;
488
+ }
489
+ if (typeof node !== 'object')
490
+ return;
491
+ const nodeRecord = node;
492
+ // If node has a text property, add it
493
+ if (typeof nodeRecord.text === 'string' && nodeRecord.text) {
494
+ textParts.push(nodeRecord.text);
495
+ }
496
+ // If node has value, traverse it
497
+ if (nodeRecord.value) {
498
+ if (typeof nodeRecord.value === 'string') {
499
+ textParts.push(nodeRecord.value);
500
+ }
501
+ else if (typeof nodeRecord.value === 'object') {
502
+ traverse(nodeRecord.value);
503
+ }
504
+ }
505
+ // If node has children array, traverse each child
506
+ if (Array.isArray(nodeRecord.children)) {
507
+ for (const child of nodeRecord.children) {
508
+ traverse(child);
509
+ }
510
+ }
511
+ // If node has node property (nested structure)
512
+ if (nodeRecord.node && typeof nodeRecord.node === 'object') {
513
+ traverse(nodeRecord.node);
514
+ }
515
+ }
516
+ traverse(obj);
517
+ return textParts.join('').trim();
518
+ }
519
+ /**
520
+ * Extract human-readable text content from Copilot tool result objects
521
+ *
522
+ * Handles multiple result format patterns commonly returned by Copilot tools:
523
+ * 1. Array-based content: Simple string extraction from value properties (e.g., run_in_terminal)
524
+ * 2. Array-based content: Fallback to nested object extraction (e.g., copilot_readFile)
525
+ * 3. Object-based content: Traverses nested structures for text values
526
+ * Prefers simple extraction if content found, falls back to complex nested traversal.
527
+ * Used to extract readable output from tool invocation results.
528
+ *
529
+ * @param result - Tool result object with content property (array, object, or nested structure)
530
+ * @returns Extracted text content from the result, empty string if no content found
531
+ */
532
+ extractToolResultContent(result) {
533
+ let textContent = '';
534
+ // Try to extract from array-based content
535
+ if (result.content && Array.isArray(result.content)) {
536
+ // First try simple string value extraction (e.g., run_in_terminal results)
537
+ const simpleExtracted = result.content
538
+ .map((c) => {
539
+ const cRecord = c;
540
+ if (typeof cRecord.value === 'string') {
541
+ return cRecord.value;
542
+ }
543
+ if (typeof c === 'string') {
544
+ return c;
545
+ }
546
+ return null;
547
+ })
548
+ .filter((v) => v !== null)
549
+ .join('\n');
550
+ // If simple extraction found content, use it; otherwise try nested object extraction (e.g., copilot_readFile results)
551
+ textContent = simpleExtracted || this.extractTextFromNestedObject(result.content);
552
+ }
553
+ // Try to extract from plain nested object structure
554
+ else if (result.content && typeof result.content === 'object') {
555
+ textContent = this.extractTextFromNestedObject(result.content);
556
+ }
557
+ // If result itself is a nested object with content, extract from it
558
+ else if (typeof result === 'object' && !Array.isArray(result)) {
559
+ textContent = this.extractTextFromNestedObject(result);
560
+ }
561
+ return textContent;
562
+ }
563
+ /**
564
+ * Extract workspace path from Copilot session data structures
565
+ *
566
+ * Recursively searches through all properties and nested objects in a Copilot session
567
+ * to find workspace paths. Looks for baseUri.path patterns which contain absolute paths
568
+ * starting with '/'. Returns the first valid path found. Uses a seenPaths set internally
569
+ * to avoid returning duplicate paths if multiple workspace paths exist.
570
+ *
571
+ * @param copilotSession - Copilot session object containing nested data structures with baseUri patterns
572
+ * @returns First valid workspace path found (absolute path starting with '/'), or null if not found
573
+ */
574
+ extractWorkspacePathFromCopilot(copilotSession) {
575
+ const seenPaths = new Set();
576
+ const traverse = (obj) => {
577
+ if (!obj || typeof obj !== 'object') {
578
+ return null;
579
+ }
580
+ const objRecord = obj;
581
+ // Check current object's baseUri
582
+ const pathFromBaseUri = this.extractPathFromBaseUri(obj, seenPaths);
583
+ if (pathFromBaseUri) {
584
+ return pathFromBaseUri;
585
+ }
586
+ // Traverse all properties
587
+ for (const key of Object.keys(objRecord)) {
588
+ const value = objRecord[key];
589
+ if (typeof value === 'object' && value !== null) {
590
+ const result = traverse(value);
591
+ if (result) {
592
+ return result;
593
+ }
594
+ }
595
+ }
596
+ return null;
597
+ };
598
+ return traverse(copilotSession);
599
+ }
600
+ /**
601
+ * Validate if a Copilot session file contains valid session data
602
+ *
603
+ * Reads and parses a JSON file, checking if it contains a non-empty requests array.
604
+ * A session is considered valid if requests field exists and contains at least one request.
605
+ * Used during workspace analysis to identify which session files have meaningful data.
606
+ * Returns false silently if file cannot be read or parsed.
607
+ *
608
+ * @param filePath - Absolute path to JSON session file
609
+ * @returns Promise resolving to true if file contains valid requests, false otherwise
610
+ */
611
+ async isValidCopilotSession(filePath) {
612
+ try {
613
+ const content = await fs.readFile(filePath, 'utf8');
614
+ const data = JSON.parse(content);
615
+ return data.requests && Array.isArray(data.requests) && data.requests.length > 0;
616
+ }
617
+ catch {
618
+ return false;
619
+ }
620
+ }
621
+ /**
622
+ * Normalize workspace paths from Copilot session to standard array format
623
+ *
624
+ * Ensures workspace paths are always returned as a string array. Handles multiple input formats:
625
+ * 1. Already-array workspace paths (monorepo with multiple paths)
626
+ * 2. String workspace paths (single workspace)
627
+ * 3. Extracted workspace paths via deep extraction if not found in top-level workspacePath property
628
+ * Returns empty array if no workspace paths found. Provides fallback extraction mechanism for
629
+ * complex Copilot session structures where workspace info is nested.
630
+ *
631
+ * @param copilotSession - Copilot session object which may have workspacePath property or nested paths
632
+ * @returns Array of workspace paths (may be empty if no paths found)
633
+ */
634
+ normalizeWorkspacePaths(copilotSession) {
635
+ const workspacePath = copilotSession.workspacePath || this.extractWorkspacePathFromCopilot(copilotSession) || '';
636
+ // Handle array workspace paths (monorepo)
637
+ if (Array.isArray(workspacePath)) {
638
+ return workspacePath;
639
+ }
640
+ if (typeof workspacePath === 'string' && workspacePath) {
641
+ return [workspacePath];
642
+ }
643
+ return [];
644
+ }
645
+ /**
646
+ * Split all messages in a session that have multiple content blocks
647
+ *
648
+ * Copilot assistant messages often contain multiple content blocks (thinking + tool_use)
649
+ * in a single message. This function splits such messages into separate messages, one per
650
+ * content block, to create a cleaner, more normalized message sequence.
651
+ *
652
+ * Processing logic:
653
+ * - User messages: Preserved as-is (no splitting)
654
+ * - Assistant messages with single content block: Preserved as-is
655
+ * - Assistant messages with multiple content blocks: Split into separate messages,
656
+ * one per content block, each with the same timestamp
657
+ *
658
+ * After splitting, recalculates turn_id for all messages to maintain proper sequential
659
+ * numbering (1, 2, 3, ...). This ensures the message sequence remains valid after the
660
+ * splitting transformation.
661
+ *
662
+ * @param session - Copilot session object with messages array to be split
663
+ * @returns New session object with split messages and recalculated turn_ids
664
+ */
665
+ splitAllCopilotContent(session) {
666
+ const split = [];
667
+ if (!Array.isArray(session.messages)) {
668
+ return session;
669
+ }
670
+ for (const message of session.messages) {
671
+ const msg = message;
672
+ if (msg.type === 'assistant' && Array.isArray(msg.content) && msg.content.length > 1) {
673
+ // Split this message - each content block becomes its own message
674
+ const splitMessages = msg.content.map((block) => ({
675
+ content: [block],
676
+ timestamp: msg.timestamp,
677
+ type: 'assistant',
678
+ }));
679
+ split.push(...splitMessages);
680
+ }
681
+ else {
682
+ // Keep as-is (user messages or assistant messages with single content block)
683
+ split.push(msg);
684
+ }
685
+ }
686
+ // Recalculate turn_id for all messages to maintain proper sequence
687
+ const withTurnIds = split.map((msg, index) => ({
688
+ ...msg,
689
+ // eslint-disable-next-line camelcase
690
+ turn_id: index + 1,
691
+ }));
692
+ return {
693
+ ...session,
694
+ messages: withTurnIds,
695
+ };
696
+ }
697
+ /**
698
+ * Transform Copilot session to match Claude format
699
+ * Uses the requests array which contains detailed conversation structure
700
+ */
701
+ transformCopilotToClaudeFormat(copilotSession) {
702
+ const transformedMessages = [];
703
+ const requests = copilotSession.requests || [];
704
+ for (const request of requests) {
705
+ const req = request;
706
+ // Create user message from request
707
+ const userMessage = this.createUserMessageFromRequest(req);
708
+ if (userMessage) {
709
+ transformedMessages.push(userMessage);
710
+ }
711
+ // Create assistant message from response
712
+ const assistantMessage = this.createAssistantMessageFromRequest(req);
713
+ if (assistantMessage) {
714
+ transformedMessages.push(assistantMessage);
715
+ }
716
+ }
717
+ const workspacePaths = this.normalizeWorkspacePaths(copilotSession);
718
+ const sessionMetadata = this.buildSessionMetadata(transformedMessages, copilotSession);
719
+ return {
720
+ id: copilotSession.id,
721
+ messages: transformedMessages,
722
+ metadata: sessionMetadata,
723
+ timestamp: copilotSession.timestamp,
724
+ title: copilotSession.title,
725
+ type: 'Copilot',
726
+ workspacePaths,
727
+ };
728
+ }
729
+ }