byterover-cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +53 -2
  18. package/dist/commands/init.js +279 -66
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/logout.d.ts +16 -0
  21. package/dist/commands/logout.js +61 -0
  22. package/dist/commands/pull.d.ts +33 -0
  23. package/dist/commands/pull.js +115 -0
  24. package/dist/commands/push.d.ts +13 -13
  25. package/dist/commands/push.js +81 -101
  26. package/dist/commands/query.d.ts +63 -0
  27. package/dist/commands/query.js +349 -0
  28. package/dist/commands/space/list.d.ts +5 -2
  29. package/dist/commands/space/list.js +60 -56
  30. package/dist/commands/space/switch.d.ts +16 -0
  31. package/dist/commands/space/switch.js +102 -53
  32. package/dist/commands/status.d.ts +5 -2
  33. package/dist/commands/status.js +43 -33
  34. package/dist/commands/watch.d.ts +23 -0
  35. package/dist/commands/watch.js +171 -0
  36. package/dist/config/auth.config.js +14 -2
  37. package/dist/config/context-tree-domains.d.ts +12 -0
  38. package/dist/config/context-tree-domains.js +29 -0
  39. package/dist/config/environment.d.ts +6 -0
  40. package/dist/config/environment.js +9 -2
  41. package/dist/constants.d.ts +5 -0
  42. package/dist/constants.js +6 -0
  43. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  44. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  45. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  46. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  47. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  48. package/dist/core/domain/cipher/agent/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  50. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  51. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  52. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  53. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  54. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  55. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  56. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  57. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  58. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  59. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  60. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  61. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  62. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  63. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  64. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  65. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  66. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  67. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  68. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  69. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  70. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  71. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  72. package/dist/core/domain/cipher/memory/types.js +4 -0
  73. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  74. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  75. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  76. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  77. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  78. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  79. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  80. package/dist/core/domain/cipher/todos/index.js +4 -0
  81. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  82. package/dist/core/domain/cipher/todos/types.js +5 -0
  83. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  84. package/dist/core/domain/cipher/tools/constants.js +24 -0
  85. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  86. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  87. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  88. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  89. package/dist/core/domain/entities/brv-config.js +115 -17
  90. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  91. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  92. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  93. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  94. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  95. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  96. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  97. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  98. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  99. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  100. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  101. package/dist/core/domain/entities/context-tree-index.js +27 -0
  102. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  103. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  104. package/dist/core/domain/entities/event.d.ts +1 -1
  105. package/dist/core/domain/entities/event.js +4 -1
  106. package/dist/core/domain/entities/parser.d.ts +567 -0
  107. package/dist/core/domain/entities/parser.js +10 -0
  108. package/dist/core/domain/entities/playbook.d.ts +2 -23
  109. package/dist/core/domain/entities/playbook.js +2 -70
  110. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  111. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  112. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  113. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  114. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  115. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  116. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  117. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  118. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  119. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  120. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  121. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  122. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  123. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  124. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  125. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  128. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  129. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  130. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  131. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  132. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  133. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  134. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  135. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  136. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  137. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  139. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  140. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  141. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  142. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  143. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  144. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  145. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  146. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  147. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  148. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  149. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  150. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  151. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  153. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  155. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  156. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  157. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  158. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  159. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  160. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  161. package/dist/core/interfaces/cipher/message-types.js +5 -0
  162. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  163. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  164. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  165. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  166. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  167. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  168. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  169. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  171. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  173. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  174. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  175. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  176. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  177. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  178. package/dist/core/interfaces/i-rule-template-service.d.ts +0 -4
  179. package/dist/core/interfaces/i-rule-template-service.js +1 -4
  180. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  181. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  182. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  183. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  184. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  185. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  186. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  187. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  188. package/dist/hooks/error/clean-errors.d.ts +7 -0
  189. package/dist/hooks/error/clean-errors.js +50 -0
  190. package/dist/hooks/init/welcome.js +72 -1
  191. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  192. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  193. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  194. package/dist/infra/cipher/agent-service-factory.js +212 -0
  195. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  196. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  197. package/dist/infra/cipher/blob/index.d.ts +10 -0
  198. package/dist/infra/cipher/blob/index.js +12 -0
  199. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  200. package/dist/infra/cipher/blob/migrations.js +148 -0
  201. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  202. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  203. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  204. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  205. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  206. package/dist/infra/cipher/cipher-agent.js +317 -0
  207. package/dist/infra/cipher/command-parser.d.ts +23 -0
  208. package/dist/infra/cipher/command-parser.js +85 -0
  209. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  210. package/dist/infra/cipher/display/todo-display.js +129 -0
  211. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  212. package/dist/infra/cipher/events/event-emitter.js +158 -0
  213. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  214. package/dist/infra/cipher/exit-codes.js +58 -0
  215. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  216. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  217. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  218. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  219. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  220. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  221. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  222. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  223. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  224. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  225. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  226. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  227. package/dist/infra/cipher/interactive-commands.js +198 -0
  228. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  229. package/dist/infra/cipher/interactive-loop.js +352 -0
  230. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  231. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  232. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  233. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  234. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  235. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  236. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  237. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  238. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  239. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  240. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  241. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  242. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  243. package/dist/infra/cipher/llm/context/index.js +2 -0
  244. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  245. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  246. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  247. package/dist/infra/cipher/llm/context/utils.js +89 -0
  248. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  249. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  250. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  251. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  252. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  253. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  254. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  255. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  256. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  257. package/dist/infra/cipher/llm/generators/index.js +13 -0
  258. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  259. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  260. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  261. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  262. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  263. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  264. package/dist/infra/cipher/llm/index.d.ts +9 -0
  265. package/dist/infra/cipher/llm/index.js +13 -0
  266. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  267. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  268. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  269. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  270. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  271. package/dist/infra/cipher/llm/response-validator.js +157 -0
  272. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  273. package/dist/infra/cipher/llm/retry/index.js +10 -0
  274. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  275. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  276. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  277. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  278. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  279. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  280. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  281. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  282. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  283. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  284. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  285. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  286. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  287. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  288. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  289. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  290. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  291. package/dist/infra/cipher/logger/console-logger.js +63 -0
  292. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  293. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  294. package/dist/infra/cipher/memory/index.d.ts +6 -0
  295. package/dist/infra/cipher/memory/index.js +7 -0
  296. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  297. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  298. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  299. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  300. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  301. package/dist/infra/cipher/process/command-validator.js +266 -0
  302. package/dist/infra/cipher/process/index.d.ts +8 -0
  303. package/dist/infra/cipher/process/index.js +8 -0
  304. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  305. package/dist/infra/cipher/process/process-service.js +439 -0
  306. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  307. package/dist/infra/cipher/session/chat-session.js +165 -0
  308. package/dist/infra/cipher/session/index.d.ts +6 -0
  309. package/dist/infra/cipher/session/index.js +5 -0
  310. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  311. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  312. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  313. package/dist/infra/cipher/session/session-manager.js +172 -0
  314. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  315. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  316. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  317. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  318. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  319. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  320. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  321. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  322. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  323. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  324. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  326. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  327. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  328. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  329. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  330. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  331. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  332. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  333. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  334. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  335. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  336. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  337. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  338. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  339. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  340. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  342. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  344. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  346. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  347. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  348. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  350. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  351. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  352. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  353. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  354. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  355. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  356. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  357. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  358. package/dist/infra/cipher/tools/index.d.ts +18 -0
  359. package/dist/infra/cipher/tools/index.js +19 -0
  360. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  361. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  362. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  363. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  364. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  365. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  366. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  367. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  368. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  369. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  370. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  371. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  372. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  373. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  374. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  375. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  376. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  377. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  378. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  379. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  380. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  381. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  382. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  383. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  384. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  385. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  386. package/dist/infra/config/file-config-store.js +9 -3
  387. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  388. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  389. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  390. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  391. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  392. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  393. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  394. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  395. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  396. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  397. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  398. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  399. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  400. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  401. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  402. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  403. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  404. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  405. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  406. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  407. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  408. package/dist/infra/parsers/clean/shared.js +273 -0
  409. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  410. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  411. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  412. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  413. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  414. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  415. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  416. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  417. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  418. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  419. package/dist/infra/rule/constants.d.ts +4 -0
  420. package/dist/infra/rule/constants.js +4 -0
  421. package/dist/infra/rule/rule-template-service.js +1 -1
  422. package/dist/infra/rule/rule-writer-service.js +1 -5
  423. package/dist/infra/space/http-space-service.js +2 -1
  424. package/dist/infra/team/http-team-service.js +2 -1
  425. package/dist/infra/user/http-user-service.js +2 -1
  426. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  427. package/dist/infra/watcher/file-watcher-service.js +81 -0
  428. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  429. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  430. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  431. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  432. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  433. package/dist/resources/prompts/reflection.yml +27 -0
  434. package/dist/resources/prompts/system-prompt.yml +82 -0
  435. package/dist/resources/prompts/tool-outputs.yml +30 -0
  436. package/dist/templates/README.md +6 -7
  437. package/dist/templates/sections/command-reference.md +40 -93
  438. package/dist/templates/sections/workflow.md +3 -30
  439. package/dist/utils/emoji-helpers.d.ts +38 -0
  440. package/dist/utils/emoji-helpers.js +42 -0
  441. package/dist/utils/error-handler.d.ts +51 -0
  442. package/dist/utils/error-handler.js +169 -0
  443. package/dist/utils/error-helpers.d.ts +30 -0
  444. package/dist/utils/error-helpers.js +47 -0
  445. package/dist/utils/file-helpers.d.ts +15 -0
  446. package/dist/utils/file-helpers.js +44 -0
  447. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  448. package/dist/utils/oclif-error-helpers.js +46 -0
  449. package/dist/utils/tool-display-formatter.d.ts +53 -0
  450. package/dist/utils/tool-display-formatter.js +257 -0
  451. package/oclif.manifest.json +422 -142
  452. package/package.json +29 -10
  453. package/dist/commands/add.d.ts +0 -49
  454. package/dist/commands/add.js +0 -192
  455. package/dist/commands/complete.d.ts +0 -108
  456. package/dist/commands/complete.js +0 -340
  457. package/dist/commands/retrieve.d.ts +0 -26
  458. package/dist/commands/retrieve.js +0 -101
  459. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  460. package/dist/core/domain/entities/curator-output.js +0 -23
  461. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  462. package/dist/core/domain/entities/delta-batch.js +0 -52
  463. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  464. package/dist/core/domain/entities/delta-operation.js +0 -50
  465. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  466. package/dist/core/domain/entities/executor-output.js +0 -33
  467. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  468. package/dist/core/domain/entities/reflector-output.js +0 -44
  469. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  470. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  471. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  472. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  473. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  474. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  475. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  476. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  477. package/dist/infra/ace/ace-file-utils.js +0 -83
  478. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  479. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  480. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  481. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  482. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  483. package/dist/infra/ace/file-delta-store.js +0 -26
  484. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  485. package/dist/infra/ace/file-executor-output-store.js +0 -26
  486. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  487. package/dist/infra/ace/file-playbook-store.js +0 -107
  488. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  489. package/dist/infra/ace/file-reflection-store.js +0 -55
  490. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  491. package/dist/infra/playbook/file-playbook-service.js +0 -132
  492. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  493. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  494. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  495. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  496. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  497. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  498. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,349 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { getCurrentConfig, isDevelopment } from '../config/environment.js';
4
+ import { PROJECT } from '../constants.js';
5
+ import { CipherAgent } from '../infra/cipher/cipher-agent.js';
6
+ import { ExitCode, ExitError, exitWithCode } from '../infra/cipher/exit-codes.js';
7
+ import { WorkspaceNotInitializedError } from '../infra/cipher/validation/workspace-validator.js';
8
+ import { ProjectConfigStore } from '../infra/config/file-config-store.js';
9
+ import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
10
+ import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
11
+ import { formatError } from '../utils/error-handler.js';
12
+ import { formatToolCall, formatToolResult } from '../utils/tool-display-formatter.js';
13
+ export default class Query extends Command {
14
+ static args = {
15
+ query: Args.string({
16
+ description: 'Natural language question about your codebase or project knowledge',
17
+ required: true,
18
+ }),
19
+ };
20
+ static description = `Query and retrieve information from the context tree
21
+ Good:
22
+ - "How is user authentication implemented?"
23
+ - "What are the API rate limits and where are they enforced?"
24
+ Bad:
25
+ - "auth" or "authentication" (too vague, not a question)
26
+ - "show me code" (not specific about what information is needed)`;
27
+ static examples = [
28
+ '# Ask questions about patterns, decisions, or implementation details',
29
+ '<%= config.bin %> <%= command.id %> What are the coding standards?',
30
+ '<%= config.bin %> <%= command.id %> How is authentication implemented?',
31
+ '',
32
+ ...(isDevelopment()
33
+ ? [
34
+ '# Query with OpenRouter (development only)',
35
+ '<%= config.bin %> <%= command.id %> -k YOUR_API_KEY Show me all API endpoints',
36
+ '',
37
+ '# Query with custom model (development only)',
38
+ '<%= config.bin %> <%= command.id %> -k YOUR_API_KEY -m anthropic/claude-sonnet-4 Explain the database schema',
39
+ '',
40
+ '# Query with verbose output (development only)',
41
+ '<%= config.bin %> <%= command.id %> -v What testing strategies are used?',
42
+ ]
43
+ : []),
44
+ ];
45
+ static flags = {
46
+ ...(isDevelopment()
47
+ ? {
48
+ apiKey: Flags.string({
49
+ char: 'k',
50
+ description: 'OpenRouter API key (use OpenRouter instead of internal gRPC backend) [Development only]',
51
+ env: 'OPENROUTER_API_KEY',
52
+ }),
53
+ model: Flags.string({
54
+ char: 'm',
55
+ description: 'Model to use (default: google/gemini-2.5-pro for OpenRouter, gemini-2.5-pro for gRPC) [Development only]',
56
+ }),
57
+ verbose: Flags.boolean({
58
+ char: 'v',
59
+ default: false,
60
+ description: 'Enable verbose debug output [Development only]',
61
+ }),
62
+ }
63
+ : {}),
64
+ };
65
+ static strict = false;
66
+ // Override catch to prevent oclif from logging errors that were already displayed
67
+ async catch(error) {
68
+ // Check if error is ExitError (message already displayed by exitWithCode)
69
+ if (error instanceof ExitError) {
70
+ return;
71
+ }
72
+ // Backwards compatibility: also check oclif.exit property
73
+ if (error.oclif?.exit !== undefined) {
74
+ // Error already displayed by exitWithCode, silently exit
75
+ return;
76
+ }
77
+ // For other errors, re-throw to let oclif handle them
78
+ throw error;
79
+ }
80
+ createServices() {
81
+ return {
82
+ projectConfigStore: new ProjectConfigStore(),
83
+ trackingService: new MixpanelTrackingService(new KeychainTokenStore()),
84
+ };
85
+ }
86
+ /**
87
+ * Generate a unique session ID for the query agent.
88
+ * Uses crypto.randomUUID() for guaranteed uniqueness (122 bits of entropy).
89
+ */
90
+ generateSessionId() {
91
+ return randomUUID();
92
+ }
93
+ async run() {
94
+ const { argv, flags } = await this.parse(Query);
95
+ const { projectConfigStore, trackingService } = this.createServices();
96
+ try {
97
+ // Get authentication token
98
+ const tokenStore = new KeychainTokenStore();
99
+ const token = await tokenStore.load();
100
+ if (!token) {
101
+ exitWithCode(ExitCode.CONFIG_ERROR, 'Authentication required. Please run "brv login" first.');
102
+ }
103
+ // Load project config
104
+ const brvConfig = await projectConfigStore.read();
105
+ // Validate workspace is initialized
106
+ if (!brvConfig) {
107
+ throw new WorkspaceNotInitializedError('Project not initialized. Please run "brv init" to select your team and workspace.', '.brv');
108
+ }
109
+ // Create LLM config
110
+ const model = flags.model ?? (flags.apiKey ? 'google/gemini-2.5-pro' : 'gemini-2.5-pro');
111
+ const envConfig = getCurrentConfig();
112
+ const llmConfig = {
113
+ accessToken: token.accessToken,
114
+ fileSystemConfig: { workingDirectory: process.cwd() },
115
+ grpcEndpoint: envConfig.llmGrpcEndpoint,
116
+ maxIterations: 5,
117
+ maxTokens: 2048,
118
+ model,
119
+ openRouterApiKey: flags.apiKey,
120
+ projectId: PROJECT,
121
+ sessionKey: token.sessionKey,
122
+ temperature: 0.7,
123
+ topK: 10,
124
+ topP: 0.95,
125
+ verbose: flags.verbose ?? false,
126
+ };
127
+ // Create and start CipherAgent
128
+ const agent = new CipherAgent(llmConfig, brvConfig);
129
+ this.log('Querying context tree...');
130
+ await agent.start();
131
+ try {
132
+ const sessionId = this.generateSessionId();
133
+ // Setup event listeners
134
+ this.setupEventListeners(agent, flags.verbose ?? false);
135
+ // Combine all query terms from argv (everything after flags)
136
+ const queryTerms = argv.join(' ');
137
+ // Execute with autonomous mode and query commandType
138
+ const prompt = `Search the context tree for: ${queryTerms}`;
139
+ const response = await agent.execute(prompt, sessionId, {
140
+ executionContext: { commandType: 'query' },
141
+ mode: 'autonomous',
142
+ });
143
+ this.log('\nQuery Results:');
144
+ this.log(response);
145
+ await trackingService.track('ace:query');
146
+ }
147
+ finally {
148
+ // console.log('Logic for agent stopping and resource cleanup may go here!')
149
+ }
150
+ }
151
+ catch (error) {
152
+ if (error instanceof WorkspaceNotInitializedError) {
153
+ this.handleWorkspaceError(error);
154
+ return;
155
+ }
156
+ // Display context on one line, error on separate line
157
+ process.stderr.write('Failed to query context tree:\n');
158
+ exitWithCode(ExitCode.RUNTIME_ERROR, formatError(error));
159
+ }
160
+ }
161
+ /**
162
+ * Format items count from list_directory result
163
+ */
164
+ formatItemsCount(result) {
165
+ if (typeof result === 'string') {
166
+ const lines = result.split('\n').filter((line) => line.trim());
167
+ return `${lines.length} items`;
168
+ }
169
+ if (Array.isArray(result)) {
170
+ return `${result.length} items`;
171
+ }
172
+ return '';
173
+ }
174
+ /**
175
+ * Format matches count from grep_content result
176
+ */
177
+ formatMatchesCount(result) {
178
+ if (typeof result === 'string') {
179
+ const lines = result.split('\n').filter((line) => line.trim());
180
+ return `${lines.length} matches found`;
181
+ }
182
+ if (Array.isArray(result)) {
183
+ return `${result.length} matches found`;
184
+ }
185
+ return '';
186
+ }
187
+ /**
188
+ * Format tool result summary for display
189
+ */
190
+ formatToolResultSummary(toolName, result) {
191
+ try {
192
+ switch (toolName) {
193
+ case 'bash_exec':
194
+ case 'create_knowledge_topic':
195
+ case 'delete_knowledge_topic':
196
+ case 'detect_domains':
197
+ case 'read_file':
198
+ case 'update_knowledge_topic':
199
+ case 'write_file': {
200
+ return '';
201
+ }
202
+ case 'find_knowledge_topics': {
203
+ return this.formatTopicsCount(result);
204
+ }
205
+ case 'grep_content': {
206
+ return this.formatMatchesCount(result);
207
+ }
208
+ case 'list_directory': {
209
+ return this.formatItemsCount(result);
210
+ }
211
+ default: {
212
+ return '';
213
+ }
214
+ }
215
+ }
216
+ catch {
217
+ return '';
218
+ }
219
+ }
220
+ /**
221
+ * Format topics count from find_knowledge_topics result
222
+ */
223
+ formatTopicsCount(result) {
224
+ if (typeof result === 'string') {
225
+ try {
226
+ const parsed = JSON.parse(result);
227
+ const count = Array.isArray(parsed) ? parsed.length : Object.keys(parsed).length;
228
+ return `${count} topics retrieved`;
229
+ }
230
+ catch {
231
+ return '';
232
+ }
233
+ }
234
+ if (typeof result === 'object' && result !== null) {
235
+ const resultObj = result;
236
+ if (Array.isArray(resultObj.results)) {
237
+ return `${resultObj.results.length} topics retrieved`;
238
+ }
239
+ if (typeof resultObj.total === 'number') {
240
+ return `${resultObj.total} topics retrieved`;
241
+ }
242
+ if (Array.isArray(result)) {
243
+ return `${result.length} topics retrieved`;
244
+ }
245
+ }
246
+ return '';
247
+ }
248
+ /**
249
+ * Get user-friendly description for a tool
250
+ *
251
+ * @param toolName - Name of the tool
252
+ * @param args - Tool arguments
253
+ * @returns User-friendly description
254
+ */
255
+ getToolDescription(toolName, args) {
256
+ switch (toolName) {
257
+ case 'bash_exec': {
258
+ const cmd = String(args.command ?? '');
259
+ return cmd.length > 60 ? `Running command...` : `Running: ${cmd}`;
260
+ }
261
+ case 'create_knowledge_topic': {
262
+ return 'Creating knowledge topic...';
263
+ }
264
+ case 'find_knowledge_topics': {
265
+ return 'Querying knowledge base...';
266
+ }
267
+ case 'grep_content': {
268
+ return 'Searching context tree...';
269
+ }
270
+ case 'list_directory': {
271
+ return 'Listing directory...';
272
+ }
273
+ case 'read_file': {
274
+ return `Reading file...`;
275
+ }
276
+ case 'update_knowledge_topic': {
277
+ return 'Updating knowledge topic...';
278
+ }
279
+ case 'write_file': {
280
+ return 'Writing file...';
281
+ }
282
+ default: {
283
+ return 'Processing...';
284
+ }
285
+ }
286
+ }
287
+ /**
288
+ * Handle workspace not initialized error
289
+ */
290
+ handleWorkspaceError(_error) {
291
+ const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
292
+ exitWithCode(ExitCode.VALIDATION_ERROR, message);
293
+ }
294
+ /**
295
+ * Setup event listeners for CipherAgent
296
+ */
297
+ setupEventListeners(agent, verbose) {
298
+ if (!agent.agentEventBus) {
299
+ throw new Error('Agent event bus not initialized');
300
+ }
301
+ const eventBus = agent.agentEventBus;
302
+ if (verbose) {
303
+ // Verbose mode: show detailed events
304
+ eventBus.on('llmservice:thinking', () => {
305
+ this.log('🤔 [Event] LLM is thinking...');
306
+ });
307
+ eventBus.on('llmservice:response', (payload) => {
308
+ this.log(`✅ [Event] LLM Response (${payload.provider}/${payload.model})`);
309
+ });
310
+ eventBus.on('llmservice:toolCall', (payload) => {
311
+ // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
312
+ const formattedCall = formatToolCall(payload.toolName, payload.args);
313
+ this.log(`🔧 [Event] Tool Call: ${formattedCall}`);
314
+ });
315
+ eventBus.on('llmservice:toolResult', (payload) => {
316
+ const resultSummary = formatToolResult(payload.toolName, payload.success, payload.result, payload.error);
317
+ if (payload.success) {
318
+ this.log(`✓ [Event] Tool Success: ${payload.toolName} → ${resultSummary}`);
319
+ }
320
+ else {
321
+ this.log(`✗ [Event] Tool Error: ${payload.toolName} → ${resultSummary}`);
322
+ }
323
+ });
324
+ // NOTE: llmservice:error is handled by catch block in the run method
325
+ // which displays error via this.error(). DO NOT display here to avoid duplicate.
326
+ }
327
+ else {
328
+ // Non-verbose mode: show concise tool progress with descriptions
329
+ eventBus.on('llmservice:toolCall', (payload) => {
330
+ // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
331
+ const description = this.getToolDescription(payload.toolName, payload.args);
332
+ this.log(`🔧 ${payload.toolName} → ${description}`);
333
+ });
334
+ eventBus.on('llmservice:toolResult', (payload) => {
335
+ if (payload.success) {
336
+ // Show brief success summary for tool completion
337
+ const summary = this.formatToolResultSummary(payload.toolName, payload.result);
338
+ const completionText = summary ? `Complete (${summary})` : 'Complete';
339
+ this.log(`✅ ${payload.toolName} → ${completionText}`);
340
+ }
341
+ else {
342
+ this.log(`✗ ${payload.toolName} → Failed: ${payload.error}`);
343
+ }
344
+ });
345
+ // NOTE: llmservice:error is handled by catch block in the run method
346
+ // which displays error via this.error(). DO NOT display here to avoid duplicate.
347
+ }
348
+ }
349
+ }
@@ -2,7 +2,6 @@ import { Command } from '@oclif/core';
2
2
  import type { IProjectConfigStore } from '../../core/interfaces/i-project-config-store.js';
3
3
  import type { ISpaceService } from '../../core/interfaces/i-space-service.js';
4
4
  import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
5
- import { AuthToken } from '../../core/domain/entities/auth-token.js';
6
5
  export default class SpaceList extends Command {
7
6
  static description: string;
8
7
  static examples: string[];
@@ -12,11 +11,15 @@ export default class SpaceList extends Command {
12
11
  limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
13
12
  offset: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
14
13
  };
14
+ catch(error: Error & {
15
+ oclif?: {
16
+ exit: number;
17
+ };
18
+ }): Promise<void>;
15
19
  protected createServices(): {
16
20
  projectConfigStore: IProjectConfigStore;
17
21
  spaceService: ISpaceService;
18
22
  tokenStore: ITokenStore;
19
23
  };
20
24
  run(): Promise<void>;
21
- protected validateAuth(tokenStore: ITokenStore): Promise<AuthToken>;
22
25
  }
@@ -1,5 +1,6 @@
1
1
  import { Command, Flags, ux } from '@oclif/core';
2
2
  import { getCurrentConfig } from '../../config/environment.js';
3
+ import { ExitCode, ExitError, exitWithCode } from '../../infra/cipher/exit-codes.js';
3
4
  import { ProjectConfigStore } from '../../infra/config/file-config-store.js';
4
5
  import { HttpSpaceService } from '../../infra/space/http-space-service.js';
5
6
  import { KeychainTokenStore } from '../../infra/storage/keychain-token-store.js';
@@ -36,6 +37,18 @@ export default class SpaceList extends Command {
36
37
  description: 'Number of spaces to skip',
37
38
  }),
38
39
  };
40
+ async catch(error) {
41
+ // Check if error is ExitError (message already displayed)
42
+ if (error instanceof ExitError) {
43
+ return;
44
+ }
45
+ // Backwards compatibility: also check oclif.exit property
46
+ if (error.oclif?.exit !== undefined) {
47
+ return;
48
+ }
49
+ // For unexpected errors, show the message
50
+ this.error(error instanceof Error ? error.message : 'Failed to list spaces');
51
+ }
39
52
  createServices() {
40
53
  const envConfig = getCurrentConfig();
41
54
  return {
@@ -45,66 +58,57 @@ export default class SpaceList extends Command {
45
58
  };
46
59
  }
47
60
  async run() {
48
- try {
49
- const { flags } = await this.parse(SpaceList);
50
- const { projectConfigStore, spaceService, tokenStore } = this.createServices();
51
- // Check project initialization
52
- const projectConfig = await projectConfigStore.read();
53
- if (projectConfig === undefined) {
54
- this.error('Project not initialized. Run "brv init" first.');
55
- }
56
- const token = await this.validateAuth(tokenStore);
57
- // Fetch spaces for the team from project config
58
- ux.action.start(`Fetching spaces for ${projectConfig.teamName}`);
59
- let result;
60
- try {
61
- result = await spaceService.getSpaces(token.accessToken, token.sessionKey, projectConfig.teamId, flags.all ? { fetchAll: true } : { limit: flags.limit, offset: flags.offset });
62
- }
63
- finally {
64
- ux.action.stop();
65
- }
66
- // Handle empty results
67
- if (result.spaces.length === 0) {
68
- this.log(`No spaces found in team "${projectConfig.teamName}".`);
69
- return;
70
- }
71
- // Display results based on format
72
- if (flags.json) {
73
- this.log(JSON.stringify({
74
- showing: result.spaces.length,
75
- spaces: result.spaces.map((s) => s.toJson()),
76
- team: { id: projectConfig.teamId, name: projectConfig.teamName },
77
- total: result.total,
78
- }, null, 2));
79
- return;
80
- }
81
- // Human-readable format
82
- this.log(`\nSpaces in team "${projectConfig.teamName}":\n`);
83
- this.log(`Found ${result.spaces.length} space(s):\n`);
84
- for (const [index, space] of result.spaces.entries()) {
85
- this.log(` ${index + 1}. ${space.getDisplayName()}`);
86
- }
87
- // Pagination warning
88
- if (!flags.all && result.spaces.length < result.total) {
89
- const remaining = result.total - result.spaces.length - flags.offset;
90
- this.log(`\nShowing ${result.spaces.length} of ${result.total} spaces.`);
91
- if (remaining > 0) {
92
- this.log('Use --all to fetch all spaces, or use --limit and --offset for pagination.');
93
- }
94
- }
61
+ const { flags } = await this.parse(SpaceList);
62
+ const { projectConfigStore, spaceService, tokenStore } = this.createServices();
63
+ // Check project initialization
64
+ const projectConfig = await projectConfigStore.read();
65
+ if (!projectConfig) {
66
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Project not initialized. Please run "brv init" first.');
95
67
  }
96
- catch (error) {
97
- this.error(error instanceof Error ? error.message : 'Failed to list spaces');
98
- }
99
- }
100
- async validateAuth(tokenStore) {
101
68
  const token = await tokenStore.load();
102
- if (token === undefined) {
103
- this.error('Not authenticated. Please run "brv login" first.');
69
+ if (!token) {
70
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Not authenticated. Please run "brv login" first.');
104
71
  }
105
72
  if (!token.isValid()) {
106
- this.error('Authentication token expired. Please run "brv login" again.');
73
+ exitWithCode(ExitCode.VALIDATION_ERROR, 'Authentication token expired. Please run "brv login" again.');
74
+ }
75
+ // Fetch spaces for the team from project config
76
+ ux.action.start(`Fetching spaces for ${projectConfig.teamName}`);
77
+ let result;
78
+ try {
79
+ result = await spaceService.getSpaces(token.accessToken, token.sessionKey, projectConfig.teamId, flags.all ? { fetchAll: true } : { limit: flags.limit, offset: flags.offset });
80
+ }
81
+ finally {
82
+ ux.action.stop();
83
+ }
84
+ // Handle empty results
85
+ if (result.spaces.length === 0) {
86
+ this.log(`No spaces found in team "${projectConfig.teamName}".`);
87
+ return;
88
+ }
89
+ // Display results based on format
90
+ if (flags.json) {
91
+ this.log(JSON.stringify({
92
+ showing: result.spaces.length,
93
+ spaces: result.spaces.map((s) => s.toJson()),
94
+ team: { id: projectConfig.teamId, name: projectConfig.teamName },
95
+ total: result.total,
96
+ }, null, 2));
97
+ return;
98
+ }
99
+ // Human-readable format
100
+ this.log(`\nSpaces in team "${projectConfig.teamName}":\n`);
101
+ this.log(`Found ${result.spaces.length} space(s):\n`);
102
+ for (const [index, space] of result.spaces.entries()) {
103
+ this.log(` ${index + 1}. ${space.getDisplayName()}`);
104
+ }
105
+ // Pagination warning
106
+ if (!flags.all && result.spaces.length < result.total) {
107
+ const remaining = result.total - result.spaces.length - flags.offset;
108
+ this.log(`\nShowing ${result.spaces.length} of ${result.total} spaces.`);
109
+ if (remaining > 0) {
110
+ this.log('Use --all to fetch all spaces, or use --limit and --offset for pagination.');
111
+ }
107
112
  }
108
- return token;
109
113
  }
110
114
  }
@@ -5,15 +5,31 @@ import type { IProjectConfigStore } from '../../core/interfaces/i-project-config
5
5
  import type { ISpaceService } from '../../core/interfaces/i-space-service.js';
6
6
  import type { ITeamService } from '../../core/interfaces/i-team-service.js';
7
7
  import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
8
+ import { Agent } from '../../core/domain/entities/agent.js';
8
9
  export default class SpaceSwitch extends Command {
9
10
  static description: string;
10
11
  static examples: string[];
12
+ catch(error: Error & {
13
+ oclif?: {
14
+ exit: number;
15
+ };
16
+ }): Promise<void>;
11
17
  protected createServices(): {
12
18
  projectConfigStore: IProjectConfigStore;
13
19
  spaceService: ISpaceService;
14
20
  teamService: ITeamService;
15
21
  tokenStore: ITokenStore;
16
22
  };
23
+ protected detectWorkspacesForAgent(agent: Agent): {
24
+ chatLogPath: string;
25
+ cwd: string;
26
+ };
27
+ /**
28
+ * Prompts the user to select an agent.
29
+ * This method is protected to allow test overrides.
30
+ * @returns The selected agent
31
+ */
32
+ protected promptForAgentSelection(): Promise<Agent>;
17
33
  protected promptForSpaceSelection(spaces: Space[]): Promise<Space>;
18
34
  protected promptForTeamSelection(teams: Team[]): Promise<Team>;
19
35
  run(): Promise<void>;