byterover-cli 0.4.0 → 1.0.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 (478) hide show
  1. package/README.md +1 -9
  2. package/dist/commands/curate.d.ts +1 -3
  3. package/dist/commands/curate.js +14 -51
  4. package/dist/commands/main.d.ts +8 -0
  5. package/dist/commands/main.js +29 -8
  6. package/dist/commands/query.d.ts +1 -3
  7. package/dist/commands/query.js +8 -35
  8. package/dist/config/context-tree-domains.d.ts +5 -0
  9. package/dist/config/context-tree-domains.js +6 -1
  10. package/dist/config/environment.js +9 -9
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.js +18 -0
  13. package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
  14. package/dist/core/domain/cipher/agent/agent-info.js +143 -0
  15. package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
  16. package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
  17. package/dist/core/domain/cipher/agent/index.d.ts +4 -1
  18. package/dist/core/domain/cipher/agent/index.js +7 -1
  19. package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
  20. package/dist/core/domain/cipher/agent-events/types.js +11 -0
  21. package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
  22. package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
  23. package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
  24. package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
  25. package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
  26. package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
  27. package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
  28. package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
  29. package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
  30. package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
  31. package/dist/core/domain/cipher/llm/error-codes.js +51 -0
  32. package/dist/core/domain/cipher/llm/index.d.ts +9 -0
  33. package/dist/core/domain/cipher/llm/index.js +13 -0
  34. package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
  35. package/dist/core/domain/cipher/llm/registry.js +244 -0
  36. package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
  37. package/dist/core/domain/cipher/llm/schemas.js +151 -0
  38. package/dist/core/domain/cipher/llm/types.d.ts +121 -0
  39. package/dist/core/domain/cipher/llm/types.js +60 -0
  40. package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
  41. package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
  42. package/dist/core/domain/cipher/streaming/types.js +16 -0
  43. package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
  44. package/dist/core/domain/cipher/todos/types.d.ts +34 -0
  45. package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
  46. package/dist/core/domain/cipher/tools/constants.js +5 -2
  47. package/dist/core/domain/cipher/tools/types.d.ts +31 -0
  48. package/dist/core/domain/entities/event.d.ts +1 -1
  49. package/dist/core/domain/entities/event.js +3 -1
  50. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  51. package/dist/core/domain/errors/connection-error.js +54 -0
  52. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  53. package/dist/core/domain/errors/core-process-error.js +43 -0
  54. package/dist/core/domain/errors/task-error.d.ts +64 -0
  55. package/dist/core/domain/errors/task-error.js +116 -0
  56. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  57. package/dist/core/domain/errors/transport-error.js +114 -0
  58. package/dist/core/domain/instance/index.d.ts +1 -0
  59. package/dist/core/domain/instance/index.js +1 -0
  60. package/dist/core/domain/instance/types.d.ts +57 -0
  61. package/dist/core/domain/instance/types.js +72 -0
  62. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  63. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  64. package/dist/core/domain/transport/index.d.ts +2 -0
  65. package/dist/core/domain/transport/index.js +2 -0
  66. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  67. package/dist/core/domain/transport/schemas.js +554 -0
  68. package/dist/core/domain/transport/types.d.ts +67 -0
  69. package/dist/core/domain/transport/types.js +7 -0
  70. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  71. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  72. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  73. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  74. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  75. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  76. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  77. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  79. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  80. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  81. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  82. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  83. package/dist/core/interfaces/cipher/index.js +11 -0
  84. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  85. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  86. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  87. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  88. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  89. package/dist/core/interfaces/cipher/message-types.js +6 -0
  90. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  91. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  92. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  93. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  94. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  95. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  96. package/dist/core/interfaces/executor/index.d.ts +2 -0
  97. package/dist/core/interfaces/executor/index.js +2 -0
  98. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  99. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  100. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  101. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  102. package/dist/core/interfaces/instance/index.d.ts +2 -0
  103. package/dist/core/interfaces/instance/index.js +2 -0
  104. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  105. package/dist/core/interfaces/noop-implementations.js +62 -0
  106. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  107. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  108. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  109. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  110. package/dist/core/interfaces/transport/index.d.ts +2 -0
  111. package/dist/core/interfaces/transport/index.js +2 -0
  112. package/dist/hooks/init/welcome.js +9 -24
  113. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  114. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  115. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  116. package/dist/infra/cipher/agent/agent-error.js +79 -0
  117. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  118. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  119. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  120. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  121. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  122. package/dist/infra/cipher/agent/base-agent.js +240 -0
  123. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  124. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  125. package/dist/infra/cipher/agent/index.d.ts +22 -0
  126. package/dist/infra/cipher/agent/index.js +24 -0
  127. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  128. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  129. package/dist/infra/cipher/agent/types.d.ts +35 -0
  130. package/dist/infra/cipher/agent/types.js +1 -0
  131. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  132. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  133. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  134. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  135. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  136. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  137. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  138. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  139. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  140. package/dist/infra/cipher/consumer/index.js +2 -1
  141. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  142. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  143. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  144. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  145. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  146. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  147. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  148. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  149. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  150. package/dist/infra/cipher/interactive-loop.js +41 -33
  151. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  152. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  153. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  154. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  155. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  156. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  157. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  158. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  159. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  160. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  161. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  162. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  163. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  164. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  165. package/dist/infra/cipher/llm/context/utils.js +17 -4
  166. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  167. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  168. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  169. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  170. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  171. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  172. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  173. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  174. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  175. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  176. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  177. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  178. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  179. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  180. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  181. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  182. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  183. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  184. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  185. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  186. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  187. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  188. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  189. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  190. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  191. package/dist/infra/cipher/process/command-validator.js +75 -0
  192. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  193. package/dist/infra/cipher/process/path-utils.js +94 -0
  194. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  195. package/dist/infra/cipher/process/process-service.js +98 -17
  196. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  197. package/dist/infra/cipher/session/chat-session.js +163 -13
  198. package/dist/infra/cipher/session/index.d.ts +1 -0
  199. package/dist/infra/cipher/session/index.js +2 -0
  200. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  201. package/dist/infra/cipher/session/message-queue.js +90 -0
  202. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  203. package/dist/infra/cipher/session/session-manager.js +254 -7
  204. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  205. package/dist/infra/cipher/session/session-status.js +184 -0
  206. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  207. package/dist/infra/cipher/session/title-generator.js +31 -0
  208. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  209. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  210. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  211. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  212. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  213. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  214. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  215. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  216. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  217. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  218. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  219. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  220. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  221. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  222. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  223. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  224. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  225. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  226. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  227. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  228. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  229. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  230. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  231. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  232. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  233. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  234. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  235. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  236. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  237. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  238. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  239. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  240. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  241. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  242. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  243. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  244. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  245. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  246. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  247. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  249. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  250. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  251. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  252. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  253. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  254. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  255. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  256. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  257. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  258. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  259. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  260. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  261. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  262. package/dist/infra/cipher/tools/index.d.ts +1 -1
  263. package/dist/infra/cipher/tools/index.js +1 -1
  264. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  265. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  266. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  267. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  268. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  269. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  270. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  271. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  272. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  273. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  274. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  275. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  276. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  277. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  278. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  279. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  280. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  281. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  282. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  283. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  284. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  285. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  286. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  287. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  288. package/dist/infra/context-tree/path-utils.js +7 -0
  289. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  290. package/dist/infra/core/executors/curate-executor.js +123 -0
  291. package/dist/infra/core/executors/index.d.ts +2 -0
  292. package/dist/infra/core/executors/index.js +2 -0
  293. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  294. package/dist/infra/core/executors/query-executor.js +51 -0
  295. package/dist/infra/core/task-processor.d.ts +81 -0
  296. package/dist/infra/core/task-processor.js +115 -0
  297. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  298. package/dist/infra/instance/file-instance-discovery.js +84 -0
  299. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  300. package/dist/infra/instance/file-instance-manager.js +123 -0
  301. package/dist/infra/instance/index.d.ts +3 -0
  302. package/dist/infra/instance/index.js +3 -0
  303. package/dist/infra/instance/process-utils.d.ts +14 -0
  304. package/dist/infra/instance/process-utils.js +39 -0
  305. package/dist/infra/process/agent-worker.d.ts +20 -0
  306. package/dist/infra/process/agent-worker.js +602 -0
  307. package/dist/infra/process/index.d.ts +12 -0
  308. package/dist/infra/process/index.js +11 -0
  309. package/dist/infra/process/ipc-types.d.ts +55 -0
  310. package/dist/infra/process/ipc-types.js +12 -0
  311. package/dist/infra/process/process-manager.d.ts +154 -0
  312. package/dist/infra/process/process-manager.js +471 -0
  313. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  314. package/dist/infra/process/task-queue-manager.js +226 -0
  315. package/dist/infra/process/transport-handlers.d.ts +124 -0
  316. package/dist/infra/process/transport-handlers.js +348 -0
  317. package/dist/infra/process/transport-worker.d.ts +20 -0
  318. package/dist/infra/process/transport-worker.js +168 -0
  319. package/dist/infra/repl/commands/curate-command.js +0 -5
  320. package/dist/infra/repl/commands/query-command.js +0 -3
  321. package/dist/infra/repl/repl-startup.d.ts +4 -0
  322. package/dist/infra/repl/repl-startup.js +10 -1
  323. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  324. package/dist/infra/repl/transport-client-helper.js +96 -0
  325. package/dist/infra/transport/index.d.ts +4 -0
  326. package/dist/infra/transport/index.js +4 -0
  327. package/dist/infra/transport/port-utils.d.ts +42 -0
  328. package/dist/infra/transport/port-utils.js +84 -0
  329. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  330. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  331. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  332. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  333. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  334. package/dist/infra/transport/transport-client-factory.js +168 -0
  335. package/dist/infra/transport/transport-factory.d.ts +33 -0
  336. package/dist/infra/transport/transport-factory.js +59 -0
  337. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  338. package/dist/infra/usecase/curate-use-case.js +73 -259
  339. package/dist/infra/usecase/init-use-case.js +19 -8
  340. package/dist/infra/usecase/login-use-case.js +9 -3
  341. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  342. package/dist/infra/usecase/query-use-case.js +251 -326
  343. package/dist/infra/usecase/status-use-case.js +1 -1
  344. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  345. package/dist/resources/prompts/explore.yml +78 -0
  346. package/dist/resources/prompts/plan.yml +114 -0
  347. package/dist/resources/prompts/reflection.yml +1 -1
  348. package/dist/resources/prompts/system-prompt.yml +15 -8
  349. package/dist/resources/prompts/tool-outputs.yml +0 -5
  350. package/dist/resources/tools/bash_exec.txt +98 -0
  351. package/dist/resources/tools/bash_output.txt +40 -0
  352. package/dist/resources/tools/batch.txt +28 -0
  353. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  354. package/dist/resources/tools/curate.txt +22 -0
  355. package/dist/resources/tools/delete_memory.txt +1 -0
  356. package/dist/resources/tools/detect_domains.txt +11 -0
  357. package/dist/resources/tools/edit_file.txt +1 -0
  358. package/dist/resources/tools/edit_memory.txt +1 -0
  359. package/dist/resources/tools/glob_files.txt +20 -0
  360. package/dist/resources/tools/grep_content.txt +18 -0
  361. package/dist/resources/tools/kill_process.txt +16 -0
  362. package/dist/resources/tools/list_directory.txt +16 -0
  363. package/dist/resources/tools/list_memories.txt +1 -0
  364. package/dist/resources/tools/read_file.txt +31 -0
  365. package/dist/resources/tools/read_memory.txt +1 -0
  366. package/dist/resources/tools/read_todos.txt +17 -0
  367. package/dist/resources/tools/search_history.txt +1 -0
  368. package/dist/resources/tools/task.txt +23 -0
  369. package/dist/resources/tools/write_file.txt +1 -0
  370. package/dist/resources/tools/write_memory.txt +1 -0
  371. package/dist/resources/tools/write_todos.txt +29 -0
  372. package/dist/tui/app.js +9 -13
  373. package/dist/tui/components/command-details.d.ts +14 -0
  374. package/dist/tui/components/command-details.js +35 -0
  375. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  376. package/dist/tui/components/execution/execution-changes.js +19 -4
  377. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  378. package/dist/tui/components/execution/execution-content.js +26 -13
  379. package/dist/tui/components/execution/execution-input.js +3 -3
  380. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  381. package/dist/tui/components/execution/execution-progress.js +8 -6
  382. package/dist/tui/components/execution/log-item.d.ts +3 -4
  383. package/dist/tui/components/execution/log-item.js +2 -5
  384. package/dist/tui/components/footer.js +9 -4
  385. package/dist/tui/components/header.d.ts +3 -3
  386. package/dist/tui/components/header.js +5 -3
  387. package/dist/tui/components/index.d.ts +1 -0
  388. package/dist/tui/components/index.js +1 -0
  389. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  390. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  391. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  392. package/dist/tui/components/scrollable-list.js +12 -10
  393. package/dist/tui/components/suggestions.js +39 -41
  394. package/dist/tui/components/tab-bar.d.ts +2 -1
  395. package/dist/tui/components/tab-bar.js +3 -4
  396. package/dist/tui/constants.d.ts +0 -5
  397. package/dist/tui/constants.js +0 -5
  398. package/dist/tui/contexts/auth-context.js +9 -2
  399. package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
  400. package/dist/tui/contexts/index.d.ts +6 -1
  401. package/dist/tui/contexts/index.js +6 -1
  402. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  403. package/dist/tui/contexts/onboarding-context.js +9 -9
  404. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  405. package/dist/tui/contexts/tasks-context.js +218 -0
  406. package/dist/tui/contexts/transport-context.d.ts +29 -0
  407. package/dist/tui/contexts/transport-context.js +82 -0
  408. package/dist/tui/hooks/index.d.ts +10 -6
  409. package/dist/tui/hooks/index.js +7 -6
  410. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  411. package/dist/tui/hooks/use-activity-logs.js +87 -34
  412. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  413. package/dist/tui/hooks/use-auth-polling.js +104 -0
  414. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  415. package/dist/tui/hooks/use-slash-completion.js +1 -1
  416. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  417. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  418. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  419. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  420. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  421. package/dist/tui/hooks/use-ui-heights.js +88 -0
  422. package/dist/tui/providers/app-providers.js +2 -6
  423. package/dist/tui/types/commands.d.ts +0 -26
  424. package/dist/tui/types/index.d.ts +1 -1
  425. package/dist/tui/types/ui.d.ts +9 -4
  426. package/dist/tui/utils/line.d.ts +11 -0
  427. package/dist/tui/utils/line.js +16 -0
  428. package/dist/tui/utils/log.d.ts +27 -0
  429. package/dist/tui/utils/log.js +114 -0
  430. package/dist/tui/views/command-view.d.ts +7 -0
  431. package/dist/tui/views/command-view.js +103 -80
  432. package/dist/tui/views/login-view.js +7 -4
  433. package/dist/tui/views/logs-view.d.ts +13 -0
  434. package/dist/tui/views/logs-view.js +27 -52
  435. package/dist/utils/connection-error-handler.d.ts +16 -0
  436. package/dist/utils/connection-error-handler.js +49 -0
  437. package/dist/utils/crash-log.d.ts +14 -0
  438. package/dist/utils/crash-log.js +19 -0
  439. package/dist/utils/file-helpers.d.ts +14 -0
  440. package/dist/utils/file-helpers.js +21 -0
  441. package/dist/utils/global-logs-path.d.ts +11 -0
  442. package/dist/utils/global-logs-path.js +37 -0
  443. package/dist/utils/process-logger.d.ts +53 -0
  444. package/dist/utils/process-logger.js +253 -0
  445. package/dist/utils/sandbox-detector.d.ts +31 -0
  446. package/dist/utils/sandbox-detector.js +122 -0
  447. package/oclif.manifest.json +10 -198
  448. package/package.json +5 -1
  449. package/dist/commands/cipher-agent/run.d.ts +0 -142
  450. package/dist/commands/cipher-agent/run.js +0 -555
  451. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  452. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  453. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  454. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  455. package/dist/commands/foo.d.ts +0 -14
  456. package/dist/commands/foo.js +0 -66
  457. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  458. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  459. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  460. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  461. package/dist/infra/cipher/cipher-agent.js +0 -317
  462. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  463. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  464. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  465. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  466. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  467. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  468. package/dist/tui/contexts/consumer.d.ts +0 -31
  469. package/dist/tui/contexts/consumer.js +0 -56
  470. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  471. package/dist/tui/hooks/use-consumer.js +0 -50
  472. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  473. package/dist/tui/hooks/use-queue-polling.js +0 -90
  474. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  475. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  476. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  477. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  478. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -1,283 +1,97 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import open from 'open';
5
- import { CONTEXT_TREE_DOMAINS } from '../../config/context-tree-domains.js';
6
- import { BRV_DIR, CONTEXT_FILE, CONTEXT_TREE_DIR } from '../../constants.js';
7
- import { validateFileForCurate } from '../../utils/file-validator.js';
8
- import { getAgentStorage } from '../cipher/storage/agent-storage.js';
9
- import { WorkspaceNotInitializedError } from '../cipher/validation/workspace-validator.js';
10
- // Full path to context tree
11
- const CONTEXT_TREE_PATH = path.join(BRV_DIR, CONTEXT_TREE_DIR);
2
+ import { ConnectionError, ConnectionFailedError, InstanceCrashedError, NoInstanceRunningError } from '../../core/domain/errors/connection-error.js';
3
+ import { formatError } from '../../utils/error-handler.js';
4
+ import { getSandboxEnvironmentName, isSandboxEnvironment, isSandboxNetworkError } from '../../utils/sandbox-detector.js';
5
+ import { createTransportClientFactory } from '../transport/transport-client-factory.js';
12
6
  export class CurateUseCase {
13
- projectConfigStore;
14
7
  terminal;
15
- tokenStore;
16
8
  trackingService;
9
+ transportClientFactoryCreator;
17
10
  constructor(options) {
18
- this.projectConfigStore = options.projectConfigStore;
19
11
  this.terminal = options.terminal;
20
- this.tokenStore = options.tokenStore;
21
12
  this.trackingService = options.trackingService;
13
+ this.transportClientFactoryCreator = options.transportClientFactoryCreator ?? createTransportClientFactory;
22
14
  }
23
- /**
24
- * Create topic folder with context.md file
25
- * @param targetPath - The parent path where the topic folder will be created
26
- * @param topicName - The name of the topic folder to create
27
- * @returns The path to the created context.md file
28
- */
29
- createTopicWithContextFile(targetPath, topicName) {
30
- const topicPath = path.join(targetPath, topicName);
31
- const contextFilePath = path.join(topicPath, CONTEXT_FILE);
32
- // Create the topic directory
33
- fs.mkdirSync(topicPath, { recursive: true });
34
- // Create the context.md file with initial content
35
- const initialContent = `# ${topicName}\n\n<!-- Add your context here -->\n`;
36
- fs.writeFileSync(contextFilePath, initialContent, 'utf8');
37
- return contextFilePath;
38
- }
39
- /**
40
- * Generate a unique session ID for the autonomous agent.
41
- * Uses crypto.randomUUID() for guaranteed uniqueness (122 bits of entropy).
42
- */
43
- generateSessionId() {
44
- return randomUUID();
45
- }
46
- /**
47
- * Navigate through the context tree using file selector
48
- * Returns the selected path relative to context-tree root
49
- */
50
- async navigateContextTree() {
51
- const contextTreePath = path.resolve(process.cwd(), CONTEXT_TREE_PATH);
52
- // Ensure context tree directory exists
53
- if (!fs.existsSync(contextTreePath)) {
54
- fs.mkdirSync(contextTreePath, { recursive: true });
55
- }
56
- // Ensure predefined domains exist as directories
57
- for (const domain of CONTEXT_TREE_DOMAINS) {
58
- const domainPath = path.join(contextTreePath, domain.name);
59
- if (!fs.existsSync(domainPath)) {
60
- fs.mkdirSync(domainPath, { recursive: true });
61
- }
62
- }
63
- while (true) {
64
- try {
65
- // eslint-disable-next-line no-await-in-loop
66
- const selectedItem = await this.terminal.fileSelector({
67
- allowCancel: true,
68
- basePath: contextTreePath,
69
- filter: (item) => item.isDirectory,
70
- message: 'Target context location:',
71
- pageSize: 15,
72
- theme: {
73
- labels: {
74
- messages: {
75
- cancel: 'Selection cancelled.',
76
- empty: 'No sub-folders. Press Enter to add content here.',
77
- },
78
- },
79
- },
80
- type: 'directory',
81
- });
82
- // User cancelled
83
- if (!selectedItem) {
84
- return null;
85
- }
86
- // Restrict navigation to stay within the context tree
87
- const normalizedItemPath = path.resolve(selectedItem.path);
88
- const isValid = normalizedItemPath.startsWith(contextTreePath);
89
- if (isValid) {
90
- // Valid selection - proceed
91
- return selectedItem.path;
92
- }
93
- // Invalid selection - retry
94
- this.terminal.log('Invalid selection. Please choose a valid location within the context tree.');
15
+ async run({ context, files, verbose = false }) {
16
+ await this.trackingService.track('mem:curate', { status: 'started' });
17
+ if (!context) {
18
+ this.terminal.log('Context argument is required.');
19
+ this.terminal.log('Usage: brv curate "your context here"');
20
+ return;
21
+ }
22
+ let client;
23
+ try {
24
+ const transportClientFactory = this.transportClientFactoryCreator();
25
+ if (verbose) {
26
+ this.terminal.log('Discovering running instance...');
95
27
  }
96
- catch {
97
- // Error occurred
98
- return null;
28
+ const { client: connectedClient } = await transportClientFactory.connect();
29
+ client = connectedClient;
30
+ if (verbose) {
31
+ this.terminal.log(`Connected to instance (clientId: ${client.getClientId()})`);
99
32
  }
100
- }
101
- }
102
- /**
103
- * Open a file in the default editor
104
- * @param filePath - The path to the file to open
105
- */
106
- async openFile(filePath) {
107
- await open(filePath);
108
- }
109
- /**
110
- * Prompt user to enter topic name with validation
111
- * @param targetPath - The path where the topic folder will be created
112
- * @returns The topic name or null if cancelled
113
- */
114
- async promptForTopicName(targetPath) {
115
- try {
116
- const topicName = await this.terminal.input({
117
- message: 'New topic name:',
118
- validate: (value) => this.validateTopicName(value, targetPath),
33
+ // Generate taskId in UseCase (Application layer owns task creation)
34
+ const taskId = randomUUID();
35
+ // Send task:create - Transport routes to Agent, UseCase handles logic
36
+ await client.request('task:create', {
37
+ content: context,
38
+ ...(files?.length ? { files } : {}),
39
+ taskId,
40
+ type: 'curate',
119
41
  });
120
- return topicName.trim();
121
- }
122
- catch {
123
- return null;
124
- }
125
- }
126
- async run(options) {
127
- // Determine mode: autonomous if context is provided
128
- return options.context ? this.runAutonomous(options.context, options) : this.runInteractive();
129
- }
130
- /**
131
- * Handle workspace not initialized error
132
- */
133
- handleWorkspaceError(_error) {
134
- const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
135
- this.terminal.log(message);
136
- }
137
- /**
138
- * Process file paths from --files flag
139
- * @param filePaths - Array of file paths (relative or absolute)
140
- * @returns Formatted instructions for the agent to read the specified files, or undefined if validation fails
141
- */
142
- processFileReferences(filePaths) {
143
- const MAX_FILES = 5;
144
- if (!filePaths || filePaths.length === 0) {
145
- return '';
42
+ this.terminal.log('✓ Context queued for processing.');
43
+ await this.trackingService.track('mem:curate', { status: 'finished' });
146
44
  }
147
- // Validate max files and truncate if needed
148
- if (filePaths.length > MAX_FILES) {
149
- const ignored = filePaths.slice(MAX_FILES);
150
- this.terminal.log(`\n⚠️ Only the first ${MAX_FILES} files will be processed. Ignoring: ${ignored.join(', ')}\n`);
151
- filePaths = filePaths.slice(0, MAX_FILES);
45
+ catch (error) {
46
+ this.handleConnectionError(error);
47
+ await this.trackingService.track('mem:curate', { message: formatError(error), status: 'error' });
152
48
  }
153
- // Get project root (current directory with .brv)
154
- const projectRoot = process.cwd();
155
- // Validate each file and collect errors
156
- const validPaths = [];
157
- const errors = [];
158
- for (const filePath of filePaths) {
159
- const result = validateFileForCurate(filePath, projectRoot);
160
- if (result.valid && result.normalizedPath) {
161
- validPaths.push(result.normalizedPath);
162
- }
163
- else {
164
- errors.push(` ✗ ${result.error}`);
49
+ finally {
50
+ if (client) {
51
+ await client.disconnect();
165
52
  }
166
53
  }
167
- // If there are any validation errors, show them and return undefined
168
- if (errors.length > 0) {
169
- this.terminal.log('\n❌ File validation failed:\n');
170
- this.terminal.log(errors.join('\n'));
171
- this.terminal.log('');
172
- this.terminal.log('Invalid files provided. Please fix the errors above and try again.');
173
- return undefined;
174
- }
175
- // Format instructions for the agent
176
- const instructions = [
177
- '\n## IMPORTANT: Critical Files to Read (--files flag)',
178
- '',
179
- 'The user has explicitly specified these files as critical context that MUST be read before creating knowledge topics:',
180
- '',
181
- ...validPaths.map((p) => `- ${p}`),
182
- '',
183
- '**MANDATORY INSTRUCTIONS:**',
184
- '- You MUST use the `read_file` tool to read ALL of these files IN PARALLEL (in a single iteration) before proceeding to create knowledge topics',
185
- '- These files contain essential context that will help you create comprehensive and accurate knowledge topics',
186
- '- Read them in parallel to maximize efficiency - they do not depend on each other',
187
- '- After reading all files, proceed with the normal workflow: detect domains, find existing knowledge, and create/update topics',
188
- '',
189
- ];
190
- return instructions.join('\n');
191
54
  }
192
- /**
193
- * Run in autonomous mode - push to queue for background processing
194
- */
195
- async runAutonomous(content, options) {
196
- try {
197
- // Get authentication token
198
- const token = await this.tokenStore.load();
199
- if (!token) {
200
- this.terminal.log('Authentication required. Please run "brv login" first.');
201
- return;
202
- }
203
- // Load project config
204
- const brvConfig = await this.projectConfigStore.read();
205
- // Validate workspace is initialized
206
- if (!brvConfig) {
207
- throw new WorkspaceNotInitializedError('Project not initialized. Please run "brv init" to select your team and workspace.', '.brv');
208
- }
209
- // Process file references if provided (validates and creates instructions)
210
- const fileReferenceInstructions = this.processFileReferences(options.files ?? []);
211
- if (fileReferenceInstructions === undefined) {
212
- // Validation failed, error already displayed
213
- return;
55
+ handleConnectionError(error) {
56
+ if (error instanceof NoInstanceRunningError) {
57
+ // Check if running in sandbox environment
58
+ if (isSandboxEnvironment()) {
59
+ const sandboxName = getSandboxEnvironmentName();
60
+ this.terminal.log(`Error: No ByteRover instance is running.\n` +
61
+ `⚠️ Sandbox environment detected (${sandboxName}).\n\n` +
62
+ `Please run 'brv' command in a separate terminal window/tab outside the sandbox first.`);
214
63
  }
215
- // Initialize storage and create execution (auto-detects .brv/blobs)
216
- const storage = await getAgentStorage();
217
- // Create execution with status='queued'
218
- storage.createExecution('curate', JSON.stringify({
219
- content,
220
- fileReferenceInstructions,
221
- flags: { apiKey: options.apiKey, model: options.model, verbose: options.verbose },
222
- }));
223
- // Simple output for agents - just confirm saved
224
- this.terminal.log('✓ Context queued for processing.');
225
- // Track the event
226
- await this.trackingService.track('mem:curate');
227
- }
228
- catch (error) {
229
- if (error instanceof WorkspaceNotInitializedError) {
230
- this.handleWorkspaceError(error);
231
- return;
64
+ else {
65
+ this.terminal.log('No ByteRover instance is running.\n\n' +
66
+ 'Start a ByteRover instance by running "brv" in a separate terminal window/tab.\n' +
67
+ 'The instance will keep running and handle your commands.');
232
68
  }
233
- // Display error
234
- this.terminal.error(error instanceof Error ? error.message : 'Runtime error occurred');
235
- }
236
- }
237
- /**
238
- * Run in interactive mode with manual prompts
239
- */
240
- async runInteractive() {
241
- try {
242
- // Navigate to target location in context tree
243
- const targetPath = await this.navigateContextTree();
244
- if (!targetPath) {
245
- this.terminal.log('\nOperation cancelled.');
246
- return;
69
+ return;
70
+ }
71
+ if (error instanceof InstanceCrashedError) {
72
+ this.terminal.log('ByteRover instance has crashed.\n\nPlease restart with: brv');
73
+ return;
74
+ }
75
+ if (error instanceof ConnectionFailedError) {
76
+ // Check if it's specifically a sandbox network restriction error
77
+ const isSandboxError = isSandboxNetworkError(error.originalError ?? error);
78
+ if (isSandboxError) {
79
+ const sandboxName = getSandboxEnvironmentName();
80
+ this.terminal.log(`Error: Failed to connect to ByteRover instance.\n` +
81
+ `Port: ${error.port ?? 'unknown'}\n` +
82
+ `⚠️ Sandbox network restriction detected (${sandboxName}).\n\n` +
83
+ `Please allow network access in the sandbox and retry the command.`);
247
84
  }
248
- // Prompt for topic name with validation
249
- const topicName = await this.promptForTopicName(targetPath);
250
- if (!topicName) {
251
- this.terminal.log('\nOperation cancelled.');
252
- return;
85
+ else {
86
+ this.terminal.log(`Failed to connect to ByteRover instance: ${error.message}`);
253
87
  }
254
- // Create the topic folder with context.md
255
- const contextFilePath = this.createTopicWithContextFile(targetPath, topicName);
256
- this.terminal.log(`\nCreated: ${path.relative(process.cwd(), contextFilePath)}`);
257
- // Track the event
258
- this.trackingService.track('mem:curate');
259
- // Auto-open context.md in default editor
260
- this.terminal.log('Opening context.md for editing...');
261
- await this.openFile(contextFilePath);
262
- }
263
- catch (error) {
264
- this.terminal.error(error instanceof Error ? error.message : 'Unexpected error occurred');
265
- }
266
- }
267
- validateTopicName(value, targetPath) {
268
- const trimmed = value.trim();
269
- if (!trimmed) {
270
- return 'Topic name cannot be empty';
271
- }
272
- // Only allow letters, numbers, and hyphens
273
- if (!/^[a-zA-Z0-9-]+$/.test(trimmed)) {
274
- return 'Topic name can only contain letters (a-z, A-Z), numbers (0-9), and hyphens (-)';
88
+ return;
275
89
  }
276
- // Check if folder already exists
277
- const topicPath = path.join(targetPath, trimmed);
278
- if (fs.existsSync(topicPath)) {
279
- return `Topic "${trimmed}" already exists at this location`;
90
+ if (error instanceof ConnectionError) {
91
+ this.terminal.log(`Connection error: ${error.message}`);
92
+ return;
280
93
  }
281
- return true;
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ this.terminal.log(`Unexpected error: ${message}`);
282
96
  }
283
97
  }
@@ -58,7 +58,9 @@ export class InitUseCase {
58
58
  }
59
59
  catch (error) {
60
60
  this.terminal.actionStop('✗');
61
- throw new Error(`Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`);
61
+ const brvDirRemovalErr = `Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`;
62
+ await this.trackingService.track('init', { message: brvDirRemovalErr, status: 'error' });
63
+ throw new Error(brvDirRemovalErr);
62
64
  }
63
65
  }
64
66
  async confirmReInitialization(config) {
@@ -93,17 +95,17 @@ export class InitUseCase {
93
95
  async ensureAuthenticated() {
94
96
  const token = await this.tokenStore.load();
95
97
  if (token === undefined) {
96
- this.terminal.log('Not authenticated. Please run "brv login" first.');
98
+ this.terminal.log('Not authenticated. Please run "/login" first.');
97
99
  return undefined;
98
100
  }
99
101
  if (!token.isValid()) {
100
- this.terminal.log('Authentication token expired. Please run "brv login" again.');
102
+ this.terminal.log('Authentication token expired. Please run "/login" again.');
101
103
  return undefined;
102
104
  }
103
105
  return token;
104
106
  }
105
107
  async fetchAndSelectSpace(token, team) {
106
- this.terminal.actionStart('\nFetching all spaces');
108
+ this.terminal.actionStart('Fetching all spaces');
107
109
  const { spaces } = await this.spaceService.getSpaces(token.accessToken, token.sessionKey, team.id, { fetchAll: true });
108
110
  this.terminal.actionStop();
109
111
  if (spaces.length === 0) {
@@ -205,7 +207,9 @@ export class InitUseCase {
205
207
  try {
206
208
  const projectConfig = await this.projectConfigStore.read();
207
209
  if (projectConfig === undefined) {
208
- throw new Error('Configuration file exists but cannot be read. Please check .brv/config.json');
210
+ const corruptedConfigFileErr = 'Configuration file exists but cannot be read. Please check .brv/config.json';
211
+ this.trackingService.track('init', { message: corruptedConfigFileErr, status: 'error' });
212
+ throw new Error(corruptedConfigFileErr);
209
213
  }
210
214
  return projectConfig;
211
215
  }
@@ -362,6 +366,7 @@ export class InitUseCase {
362
366
  }
363
367
  async run(options) {
364
368
  try {
369
+ await this.trackingService.track('init', { status: 'started' });
365
370
  const authToken = await this.ensureAuthenticated();
366
371
  if (!authToken)
367
372
  return;
@@ -416,16 +421,19 @@ export class InitUseCase {
416
421
  await this.trackingService.track('rule:generate');
417
422
  await this.trackingService.track('space:init');
418
423
  this.logSuccess(selectedSpace);
424
+ await this.trackingService.track('init', { status: 'finished' });
419
425
  }
420
426
  catch (error) {
421
427
  // Stop action if it's in progress
422
428
  this.terminal.actionStop();
423
- this.terminal.error(`Initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
429
+ const initErr = `Initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
430
+ await this.trackingService.track('init', { message: initErr, status: 'error' });
431
+ this.terminal.error(initErr);
424
432
  }
425
433
  }
426
434
  async syncFromRemoteOrInitialize(params) {
427
435
  // Pull from remote - fail if network/API error
428
- this.terminal.log('\nSyncing from ByteRover...');
436
+ this.terminal.actionStart('Syncing from ByteRover...');
429
437
  try {
430
438
  const coGitSnapshot = await this.cogitPullService.pull({
431
439
  accessToken: params.token.accessToken,
@@ -452,8 +460,11 @@ export class InitUseCase {
452
460
  }
453
461
  }
454
462
  catch (error) {
455
- throw new Error(`Failed to sync from ByteRover: ${error instanceof Error ? error.message : 'Unknown error'}. Please try again.`);
463
+ const syncFailureErr = `Failed to sync from ByteRover: ${error instanceof Error ? error.message : 'Unknown error'}. Please try again.`;
464
+ await this.trackingService.track('init', { message: syncFailureErr, status: 'error' });
465
+ throw new Error(syncFailureErr);
456
466
  }
467
+ this.terminal.actionStop();
457
468
  }
458
469
  /**
459
470
  * Appends ByteRover rules to a file that has no ByteRover content.
@@ -19,13 +19,16 @@ export class LoginUseCase {
19
19
  }
20
20
  async run() {
21
21
  try {
22
+ await this.trackingService.track('auth:sign_in', { status: 'started' });
22
23
  this.terminal.log('Starting authentication process...');
23
24
  // Start callback server
24
25
  await this.callbackHandler.start();
25
26
  // Get port and build redirect URI
26
27
  const port = this.callbackHandler.getPort();
27
28
  if (!port) {
28
- throw new Error('Failed to get callback server port');
29
+ const getPortFailedErr = 'Failed to get callback server port';
30
+ await this.trackingService.track('auth:sign_in', { message: getPortFailedErr, status: 'error' });
31
+ throw new Error(getPortFailedErr);
29
32
  }
30
33
  const redirectUri = `http://localhost:${port}/callback`;
31
34
  // Initiate authorization (generates PKCE parameters and state internally)
@@ -38,6 +41,7 @@ export class LoginUseCase {
38
41
  }
39
42
  catch {
40
43
  // Browser launch failed, will return URL to user
44
+ await this.trackingService.track('auth:sign_in', { message: 'browser launch failed', status: 'error' });
41
45
  }
42
46
  // If browser failed to open, display the URL for manual copy
43
47
  if (!browserOpened) {
@@ -60,13 +64,13 @@ export class LoginUseCase {
60
64
  userId: user.id,
61
65
  });
62
66
  await this.tokenStore.save(authToken);
63
- // Track successful authentication
64
- await this.trackingService.track('auth:signed_in');
67
+ await this.trackingService.track('auth:sign_in', { status: 'finished' });
65
68
  this.terminal.log(`Logged in as ${user.email}`);
66
69
  }
67
70
  catch (error) {
68
71
  // Throw error to let oclif handle display
69
72
  const errorMessage = error instanceof Error ? error.message : 'Authentication failed';
73
+ await this.trackingService.track('auth:sign_in', { message: errorMessage, status: 'error' });
70
74
  this.terminal.error(errorMessage);
71
75
  }
72
76
  }
@@ -74,10 +78,12 @@ export class LoginUseCase {
74
78
  if (error instanceof DiscoveryError) {
75
79
  const errorMessage = `Failed to configure authentication: ${error.message}\n` +
76
80
  'Please check your network connection and try again.';
81
+ await this.trackingService.track('auth:sign_in', { message: errorMessage, status: 'error' });
77
82
  this.terminal.error(errorMessage);
78
83
  }
79
84
  // Throw error to let oclif handle display
80
85
  const errorMessage = error instanceof Error ? error.message : 'Authentication failed';
86
+ await this.trackingService.track('auth:sign_in', { message: errorMessage, status: 'error' });
81
87
  this.terminal.error(errorMessage);
82
88
  }
83
89
  finally {
@@ -1,21 +1,20 @@
1
1
  import type { BrvConfig } from '../../core/domain/entities/brv-config.js';
2
- import type { IProjectConfigStore } from '../../core/interfaces/i-project-config-store.js';
3
2
  import type { ITerminal } from '../../core/interfaces/i-terminal.js';
4
- import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
5
3
  import type { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
6
4
  import type { IQueryUseCase, QueryUseCaseRunOptions } from '../../core/interfaces/usecase/i-query-use-case.js';
7
- import { CipherAgent } from '../cipher/cipher-agent.js';
5
+ import { CipherAgent } from '../cipher/agent/index.js';
6
+ import { type TransportClientFactory } from '../transport/transport-client-factory.js';
7
+ export type TransportClientFactoryCreator = () => TransportClientFactory;
8
8
  export interface QueryUseCaseOptions {
9
- projectConfigStore: IProjectConfigStore;
10
9
  terminal: ITerminal;
11
- tokenStore: ITokenStore;
12
10
  trackingService: ITrackingService;
11
+ /** Optional factory creator for dependency injection (defaults to createTransportClientFactory) */
12
+ transportClientFactoryCreator?: TransportClientFactoryCreator;
13
13
  }
14
14
  export declare class QueryUseCase implements IQueryUseCase {
15
- private readonly projectConfigStore;
16
15
  private readonly terminal;
17
- private readonly tokenStore;
18
16
  private readonly trackingService;
17
+ private readonly transportClientFactoryCreator;
19
18
  constructor(options: QueryUseCaseOptions);
20
19
  /**
21
20
  * Create CipherAgent instance. Protected to allow test overrides.
@@ -28,51 +27,25 @@ export declare class QueryUseCase implements IQueryUseCase {
28
27
  protected generateSessionId(): string;
29
28
  run(options: QueryUseCaseRunOptions): Promise<void>;
30
29
  /**
31
- * Create result summary for tool call
30
+ * Format a parsed object result into a concise summary.
32
31
  */
33
- private createResultSummary;
32
+ private formatParsedResult;
34
33
  /**
35
- * Extract summary from curate tool result
34
+ * Format tool arguments for display.
35
+ * Extract the most meaningful value for human reading.
36
36
  */
37
- private extractCurateSummary;
37
+ private formatToolArgs;
38
38
  /**
39
- * Format curate tool operation summary
39
+ * Format tool result for display.
40
+ * Shows meaningful, concise summary - NEVER shows raw JSON.
40
41
  */
41
- private formatCurateResult;
42
+ private formatToolResult;
42
43
  /**
43
- * Format items count from list_directory result
44
+ * Handle connection-related errors with user-friendly messages.
44
45
  */
45
- private formatItemsCount;
46
+ private handleConnectionError;
46
47
  /**
47
- * Format matches count from grep_content result
48
+ * Stream task results from the connected instance.
48
49
  */
49
- private formatMatchesCount;
50
- /**
51
- * Format tool result summary for display
52
- */
53
- private formatToolResultSummary;
54
- /**
55
- * Format topics count from find_knowledge_topics result
56
- */
57
- private formatTopicsCount;
58
- /**
59
- * Get user-friendly description for a tool
60
- *
61
- * @param toolName - Name of the tool
62
- * @param args - Tool arguments
63
- * @returns User-friendly description
64
- */
65
- private getToolDescription;
66
- /**
67
- * Handle workspace not initialized error
68
- */
69
- private handleWorkspaceError;
70
- /**
71
- * Setup event listeners for CipherAgent
72
- */
73
- private setupEventListeners;
74
- /**
75
- * Setup tool call tracking to persist in database
76
- */
77
- private setupToolCallTracking;
50
+ private streamTaskResults;
78
51
  }