byterover-cli 0.4.1 → 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 (474) 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/errors/connection-error.d.ts +33 -0
  49. package/dist/core/domain/errors/connection-error.js +54 -0
  50. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  51. package/dist/core/domain/errors/core-process-error.js +43 -0
  52. package/dist/core/domain/errors/task-error.d.ts +64 -0
  53. package/dist/core/domain/errors/task-error.js +116 -0
  54. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  55. package/dist/core/domain/errors/transport-error.js +114 -0
  56. package/dist/core/domain/instance/index.d.ts +1 -0
  57. package/dist/core/domain/instance/index.js +1 -0
  58. package/dist/core/domain/instance/types.d.ts +57 -0
  59. package/dist/core/domain/instance/types.js +72 -0
  60. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  61. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  62. package/dist/core/domain/transport/index.d.ts +2 -0
  63. package/dist/core/domain/transport/index.js +2 -0
  64. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  65. package/dist/core/domain/transport/schemas.js +554 -0
  66. package/dist/core/domain/transport/types.d.ts +67 -0
  67. package/dist/core/domain/transport/types.js +7 -0
  68. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  69. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  70. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  71. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  72. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  73. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  74. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  75. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  76. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  77. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  79. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  80. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  81. package/dist/core/interfaces/cipher/index.js +11 -0
  82. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  83. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  84. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  85. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  86. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  87. package/dist/core/interfaces/cipher/message-types.js +6 -0
  88. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  89. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  90. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  91. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  92. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  93. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  94. package/dist/core/interfaces/executor/index.d.ts +2 -0
  95. package/dist/core/interfaces/executor/index.js +2 -0
  96. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  97. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  98. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  99. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  100. package/dist/core/interfaces/instance/index.d.ts +2 -0
  101. package/dist/core/interfaces/instance/index.js +2 -0
  102. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  103. package/dist/core/interfaces/noop-implementations.js +62 -0
  104. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  105. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  106. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  107. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  108. package/dist/core/interfaces/transport/index.d.ts +2 -0
  109. package/dist/core/interfaces/transport/index.js +2 -0
  110. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  111. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  112. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  113. package/dist/infra/cipher/agent/agent-error.js +79 -0
  114. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  115. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  116. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  117. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  118. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  119. package/dist/infra/cipher/agent/base-agent.js +240 -0
  120. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  121. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  122. package/dist/infra/cipher/agent/index.d.ts +22 -0
  123. package/dist/infra/cipher/agent/index.js +24 -0
  124. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  125. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  126. package/dist/infra/cipher/agent/types.d.ts +35 -0
  127. package/dist/infra/cipher/agent/types.js +1 -0
  128. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  129. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  130. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  131. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  132. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  133. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  134. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  135. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  136. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  137. package/dist/infra/cipher/consumer/index.js +2 -1
  138. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  139. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  140. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  141. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  142. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  143. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  144. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  145. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  146. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  147. package/dist/infra/cipher/interactive-loop.js +41 -33
  148. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  149. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  150. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  151. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  152. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  153. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  154. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  155. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  156. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  157. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  158. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  159. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  160. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  161. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  162. package/dist/infra/cipher/llm/context/utils.js +17 -4
  163. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  164. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  165. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  166. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  167. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  168. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  169. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  170. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  171. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  172. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  173. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  174. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  175. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  176. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  177. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  178. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  179. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  180. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  181. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  182. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  183. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  184. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  185. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  186. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  187. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  188. package/dist/infra/cipher/process/command-validator.js +75 -0
  189. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  190. package/dist/infra/cipher/process/path-utils.js +94 -0
  191. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  192. package/dist/infra/cipher/process/process-service.js +98 -17
  193. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  194. package/dist/infra/cipher/session/chat-session.js +163 -13
  195. package/dist/infra/cipher/session/index.d.ts +1 -0
  196. package/dist/infra/cipher/session/index.js +2 -0
  197. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  198. package/dist/infra/cipher/session/message-queue.js +90 -0
  199. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  200. package/dist/infra/cipher/session/session-manager.js +254 -7
  201. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  202. package/dist/infra/cipher/session/session-status.js +184 -0
  203. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  204. package/dist/infra/cipher/session/title-generator.js +31 -0
  205. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  206. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  207. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  208. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  209. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  210. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  211. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  212. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  213. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  214. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  215. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  216. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  217. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  218. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  219. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  220. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  221. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  222. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  223. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  224. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  225. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  226. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  227. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  228. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  229. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  230. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  231. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  232. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  233. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  234. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  235. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  236. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  237. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  238. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  239. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  240. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  241. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  242. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  243. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  244. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  245. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  246. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  247. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  249. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  250. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  251. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  252. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  253. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  254. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  255. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  256. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  257. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  258. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  259. package/dist/infra/cipher/tools/index.d.ts +1 -1
  260. package/dist/infra/cipher/tools/index.js +1 -1
  261. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  262. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  263. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  264. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  265. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  266. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  267. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  268. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  269. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  270. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  271. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  272. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  273. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  274. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  275. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  276. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  277. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  278. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  279. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  280. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  281. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  282. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  283. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  284. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  285. package/dist/infra/context-tree/path-utils.js +7 -0
  286. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  287. package/dist/infra/core/executors/curate-executor.js +123 -0
  288. package/dist/infra/core/executors/index.d.ts +2 -0
  289. package/dist/infra/core/executors/index.js +2 -0
  290. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  291. package/dist/infra/core/executors/query-executor.js +51 -0
  292. package/dist/infra/core/task-processor.d.ts +81 -0
  293. package/dist/infra/core/task-processor.js +115 -0
  294. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  295. package/dist/infra/instance/file-instance-discovery.js +84 -0
  296. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  297. package/dist/infra/instance/file-instance-manager.js +123 -0
  298. package/dist/infra/instance/index.d.ts +3 -0
  299. package/dist/infra/instance/index.js +3 -0
  300. package/dist/infra/instance/process-utils.d.ts +14 -0
  301. package/dist/infra/instance/process-utils.js +39 -0
  302. package/dist/infra/process/agent-worker.d.ts +20 -0
  303. package/dist/infra/process/agent-worker.js +602 -0
  304. package/dist/infra/process/index.d.ts +12 -0
  305. package/dist/infra/process/index.js +11 -0
  306. package/dist/infra/process/ipc-types.d.ts +55 -0
  307. package/dist/infra/process/ipc-types.js +12 -0
  308. package/dist/infra/process/process-manager.d.ts +154 -0
  309. package/dist/infra/process/process-manager.js +471 -0
  310. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  311. package/dist/infra/process/task-queue-manager.js +226 -0
  312. package/dist/infra/process/transport-handlers.d.ts +124 -0
  313. package/dist/infra/process/transport-handlers.js +348 -0
  314. package/dist/infra/process/transport-worker.d.ts +20 -0
  315. package/dist/infra/process/transport-worker.js +168 -0
  316. package/dist/infra/repl/commands/curate-command.js +0 -5
  317. package/dist/infra/repl/commands/query-command.js +0 -3
  318. package/dist/infra/repl/repl-startup.d.ts +4 -0
  319. package/dist/infra/repl/repl-startup.js +8 -1
  320. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  321. package/dist/infra/repl/transport-client-helper.js +96 -0
  322. package/dist/infra/transport/index.d.ts +4 -0
  323. package/dist/infra/transport/index.js +4 -0
  324. package/dist/infra/transport/port-utils.d.ts +42 -0
  325. package/dist/infra/transport/port-utils.js +84 -0
  326. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  327. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  328. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  329. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  330. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  331. package/dist/infra/transport/transport-client-factory.js +168 -0
  332. package/dist/infra/transport/transport-factory.d.ts +33 -0
  333. package/dist/infra/transport/transport-factory.js +59 -0
  334. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  335. package/dist/infra/usecase/curate-use-case.js +71 -262
  336. package/dist/infra/usecase/init-use-case.js +3 -2
  337. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  338. package/dist/infra/usecase/query-use-case.js +250 -326
  339. package/dist/infra/usecase/status-use-case.js +1 -1
  340. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  341. package/dist/resources/prompts/explore.yml +78 -0
  342. package/dist/resources/prompts/plan.yml +114 -0
  343. package/dist/resources/prompts/reflection.yml +1 -1
  344. package/dist/resources/prompts/system-prompt.yml +15 -8
  345. package/dist/resources/prompts/tool-outputs.yml +0 -5
  346. package/dist/resources/tools/bash_exec.txt +98 -0
  347. package/dist/resources/tools/bash_output.txt +40 -0
  348. package/dist/resources/tools/batch.txt +28 -0
  349. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  350. package/dist/resources/tools/curate.txt +22 -0
  351. package/dist/resources/tools/delete_memory.txt +1 -0
  352. package/dist/resources/tools/detect_domains.txt +11 -0
  353. package/dist/resources/tools/edit_file.txt +1 -0
  354. package/dist/resources/tools/edit_memory.txt +1 -0
  355. package/dist/resources/tools/glob_files.txt +20 -0
  356. package/dist/resources/tools/grep_content.txt +18 -0
  357. package/dist/resources/tools/kill_process.txt +16 -0
  358. package/dist/resources/tools/list_directory.txt +16 -0
  359. package/dist/resources/tools/list_memories.txt +1 -0
  360. package/dist/resources/tools/read_file.txt +31 -0
  361. package/dist/resources/tools/read_memory.txt +1 -0
  362. package/dist/resources/tools/read_todos.txt +17 -0
  363. package/dist/resources/tools/search_history.txt +1 -0
  364. package/dist/resources/tools/task.txt +23 -0
  365. package/dist/resources/tools/write_file.txt +1 -0
  366. package/dist/resources/tools/write_memory.txt +1 -0
  367. package/dist/resources/tools/write_todos.txt +29 -0
  368. package/dist/tui/app.js +9 -13
  369. package/dist/tui/components/command-details.d.ts +14 -0
  370. package/dist/tui/components/command-details.js +35 -0
  371. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  372. package/dist/tui/components/execution/execution-changes.js +19 -4
  373. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  374. package/dist/tui/components/execution/execution-content.js +26 -13
  375. package/dist/tui/components/execution/execution-input.js +3 -3
  376. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  377. package/dist/tui/components/execution/execution-progress.js +8 -6
  378. package/dist/tui/components/execution/log-item.d.ts +3 -4
  379. package/dist/tui/components/execution/log-item.js +2 -5
  380. package/dist/tui/components/footer.js +9 -4
  381. package/dist/tui/components/header.d.ts +3 -3
  382. package/dist/tui/components/header.js +5 -3
  383. package/dist/tui/components/index.d.ts +1 -0
  384. package/dist/tui/components/index.js +1 -0
  385. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  386. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  387. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  388. package/dist/tui/components/scrollable-list.js +12 -10
  389. package/dist/tui/components/suggestions.js +39 -41
  390. package/dist/tui/components/tab-bar.d.ts +2 -1
  391. package/dist/tui/components/tab-bar.js +3 -4
  392. package/dist/tui/constants.d.ts +0 -5
  393. package/dist/tui/constants.js +0 -5
  394. package/dist/tui/contexts/auth-context.js +9 -2
  395. package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
  396. package/dist/tui/contexts/index.d.ts +6 -1
  397. package/dist/tui/contexts/index.js +6 -1
  398. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  399. package/dist/tui/contexts/onboarding-context.js +9 -9
  400. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  401. package/dist/tui/contexts/tasks-context.js +218 -0
  402. package/dist/tui/contexts/transport-context.d.ts +29 -0
  403. package/dist/tui/contexts/transport-context.js +82 -0
  404. package/dist/tui/hooks/index.d.ts +10 -6
  405. package/dist/tui/hooks/index.js +7 -6
  406. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  407. package/dist/tui/hooks/use-activity-logs.js +87 -34
  408. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  409. package/dist/tui/hooks/use-auth-polling.js +104 -0
  410. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  411. package/dist/tui/hooks/use-slash-completion.js +1 -1
  412. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  413. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  414. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  415. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  416. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  417. package/dist/tui/hooks/use-ui-heights.js +88 -0
  418. package/dist/tui/providers/app-providers.js +2 -6
  419. package/dist/tui/types/commands.d.ts +0 -26
  420. package/dist/tui/types/index.d.ts +1 -1
  421. package/dist/tui/types/ui.d.ts +9 -4
  422. package/dist/tui/utils/line.d.ts +11 -0
  423. package/dist/tui/utils/line.js +16 -0
  424. package/dist/tui/utils/log.d.ts +27 -0
  425. package/dist/tui/utils/log.js +114 -0
  426. package/dist/tui/views/command-view.d.ts +7 -0
  427. package/dist/tui/views/command-view.js +103 -80
  428. package/dist/tui/views/login-view.js +7 -4
  429. package/dist/tui/views/logs-view.d.ts +13 -0
  430. package/dist/tui/views/logs-view.js +27 -52
  431. package/dist/utils/connection-error-handler.d.ts +16 -0
  432. package/dist/utils/connection-error-handler.js +49 -0
  433. package/dist/utils/crash-log.d.ts +14 -0
  434. package/dist/utils/crash-log.js +19 -0
  435. package/dist/utils/file-helpers.d.ts +14 -0
  436. package/dist/utils/file-helpers.js +21 -0
  437. package/dist/utils/global-logs-path.d.ts +11 -0
  438. package/dist/utils/global-logs-path.js +37 -0
  439. package/dist/utils/process-logger.d.ts +53 -0
  440. package/dist/utils/process-logger.js +253 -0
  441. package/dist/utils/sandbox-detector.d.ts +31 -0
  442. package/dist/utils/sandbox-detector.js +122 -0
  443. package/oclif.manifest.json +10 -198
  444. package/package.json +5 -1
  445. package/dist/commands/cipher-agent/run.d.ts +0 -142
  446. package/dist/commands/cipher-agent/run.js +0 -555
  447. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  448. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  449. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  450. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  451. package/dist/commands/foo.d.ts +0 -14
  452. package/dist/commands/foo.js +0 -66
  453. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  454. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  455. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  456. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  457. package/dist/infra/cipher/cipher-agent.js +0 -317
  458. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  459. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  460. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  461. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  462. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  463. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  464. package/dist/tui/contexts/consumer.d.ts +0 -31
  465. package/dist/tui/contexts/consumer.js +0 -56
  466. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  467. package/dist/tui/hooks/use-consumer.js +0 -50
  468. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  469. package/dist/tui/hooks/use-queue-polling.js +0 -90
  470. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  471. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  472. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  473. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  474. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -1,21 +1,17 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { getCurrentConfig } from '../../config/environment.js';
3
- import { PROJECT } from '../../constants.js';
2
+ import { ConnectionError, ConnectionFailedError, InstanceCrashedError, NoInstanceRunningError, } from '../../core/domain/errors/connection-error.js';
4
3
  import { formatError } from '../../utils/error-handler.js';
5
- import { formatToolCall, formatToolResult } from '../../utils/tool-display-formatter.js';
6
- import { CipherAgent } from '../cipher/cipher-agent.js';
7
- import { getAgentStorage, getAgentStorageSync } from '../cipher/storage/agent-storage.js';
8
- import { WorkspaceNotInitializedError } from '../cipher/validation/workspace-validator.js';
4
+ import { getSandboxEnvironmentName, isSandboxEnvironment, isSandboxNetworkError } from '../../utils/sandbox-detector.js';
5
+ import { CipherAgent } from '../cipher/agent/index.js';
6
+ import { createTransportClientFactory } from '../transport/transport-client-factory.js';
9
7
  export class QueryUseCase {
10
- projectConfigStore;
11
8
  terminal;
12
- tokenStore;
13
9
  trackingService;
10
+ transportClientFactoryCreator;
14
11
  constructor(options) {
15
- this.projectConfigStore = options.projectConfigStore;
16
12
  this.terminal = options.terminal;
17
- this.tokenStore = options.tokenStore;
18
13
  this.trackingService = options.trackingService;
14
+ this.transportClientFactoryCreator = options.transportClientFactoryCreator ?? createTransportClientFactory;
19
15
  }
20
16
  /**
21
17
  * Create CipherAgent instance. Protected to allow test overrides.
@@ -33,370 +29,298 @@ export class QueryUseCase {
33
29
  }
34
30
  async run(options) {
35
31
  await this.trackingService.track('mem:query', { status: 'started' });
36
- // Initialize storage for tool call tracking (auto-detects .brv/blobs)
37
- const storage = await getAgentStorage();
38
- let executionId = null;
32
+ if (!options.query.trim()) {
33
+ this.terminal.log('Query argument is required.');
34
+ this.terminal.log('Usage: brv query "your question here"');
35
+ return;
36
+ }
37
+ const verbose = options.verbose || false;
38
+ // Connect to running instance
39
+ let client;
39
40
  try {
40
- // Get authentication token
41
- const token = await this.tokenStore.load();
42
- if (!token) {
43
- this.terminal.log('Authentication required. Please run "/login" first.');
44
- return;
45
- }
46
- // Load project config
47
- const brvConfig = await this.projectConfigStore.read();
48
- // Validate workspace is initialized
49
- if (!brvConfig) {
50
- throw new WorkspaceNotInitializedError('Project not initialized. Please run "/init" to select your team and workspace.', '.brv');
41
+ const transportClientFactory = this.transportClientFactoryCreator();
42
+ if (verbose) {
43
+ this.terminal.log('Discovering running instance...');
51
44
  }
52
- // Create execution with status='running' (query runs synchronously)
53
- executionId = storage.createExecution('query', options.query);
54
- // Create LLM config
55
- const model = options.model ?? (options.apiKey ? 'google/gemini-2.5-pro' : 'gemini-2.5-pro');
56
- const envConfig = getCurrentConfig();
57
- const llmConfig = {
58
- accessToken: token.accessToken,
59
- apiBaseUrl: envConfig.llmApiBaseUrl,
60
- fileSystemConfig: { workingDirectory: process.cwd() },
61
- maxIterations: 5,
62
- maxTokens: 2048,
63
- model,
64
- openRouterApiKey: options.apiKey,
65
- projectId: PROJECT,
66
- sessionKey: token.sessionKey,
67
- temperature: 0.7,
68
- topK: 10,
69
- topP: 0.95,
70
- verbose: options.verbose ?? false,
71
- };
72
- // Create and start CipherAgent
73
- const agent = this.createCipherAgent(llmConfig, brvConfig);
74
- this.terminal.log('Querying context tree...');
75
- await agent.start();
76
- try {
77
- const sessionId = this.generateSessionId();
78
- // Setup event listeners (display + tool call tracking)
79
- this.setupEventListeners(agent, options.verbose ?? false);
80
- this.setupToolCallTracking(agent, executionId);
81
- // Execute with autonomous mode and query commandType
82
- const prompt = `Search the context tree for: ${options.query}`;
83
- const response = await agent.execute(prompt, sessionId, {
84
- executionContext: { commandType: 'query' },
85
- mode: 'autonomous',
86
- });
87
- // Mark execution as completed
88
- storage.updateExecutionStatus(executionId, 'completed', response);
89
- this.terminal.log('\nQuery Results:');
90
- this.terminal.log(response);
91
- await this.trackingService.track('mem:query', { status: 'finished' });
45
+ const { client: connectedClient } = await transportClientFactory.connect();
46
+ client = connectedClient;
47
+ if (verbose) {
48
+ this.terminal.log(`Connected to instance (clientId: ${client.getClientId()})`);
92
49
  }
93
- finally {
94
- // Cleanup old executions
95
- storage.cleanupOldExecutions(100);
50
+ // Generate taskId in UseCase (Application layer owns task creation)
51
+ const taskId = randomUUID();
52
+ // Send task:create request
53
+ await client.request('task:create', {
54
+ content: options.query,
55
+ taskId,
56
+ type: 'query',
57
+ });
58
+ // Note: response.taskId confirms what we sent (no longer extracting)
59
+ if (verbose) {
60
+ this.terminal.log(`Task created: ${taskId}`);
96
61
  }
62
+ // Wait for task completion with streaming
63
+ await this.streamTaskResults(client, taskId, verbose);
64
+ await this.trackingService.track('mem:query', { status: 'finished' });
97
65
  }
98
66
  catch (error) {
99
- // Mark execution as failed
100
- if (executionId) {
101
- const errorMessage = error instanceof Error ? error.message : String(error);
102
- storage.updateExecutionStatus(executionId, 'failed', undefined, errorMessage);
103
- }
104
- if (error instanceof WorkspaceNotInitializedError) {
105
- this.handleWorkspaceError(error);
106
- return;
107
- }
108
- // Display context on one line, error on separate line
109
- process.stderr.write('Failed to query context tree:\n');
67
+ this.handleConnectionError(error);
110
68
  await this.trackingService.track('mem:query', { message: formatError(error), status: 'error' });
111
- this.terminal.log(formatError(error));
112
69
  }
113
- }
114
- /**
115
- * Create result summary for tool call
116
- */
117
- createResultSummary(result) {
118
- const lines = result.split('\n').length;
119
- const chars = result.length;
120
- return `${lines} lines, ${chars} chars`;
121
- }
122
- /**
123
- * Extract summary from curate tool result
124
- */
125
- extractCurateSummary(result) {
126
- if (typeof result === 'string') {
127
- try {
128
- const parsed = JSON.parse(result);
129
- return parsed.summary ?? null;
70
+ finally {
71
+ // Cleanup
72
+ if (client) {
73
+ await client.disconnect();
130
74
  }
131
- catch {
132
- return null;
133
- }
134
- }
135
- if (typeof result === 'object' && result !== null) {
136
- const resultObj = result;
137
- return resultObj.summary ?? null;
138
75
  }
139
- return null;
140
76
  }
141
77
  /**
142
- * Format curate tool operation summary
78
+ * Format a parsed object result into a concise summary.
143
79
  */
144
- formatCurateResult(result) {
145
- const summary = this.extractCurateSummary(result);
146
- if (!summary) {
147
- return '';
80
+ formatParsedResult(obj) {
81
+ // Check for common patterns
82
+ if ('topics' in obj && Array.isArray(obj.topics)) {
83
+ return `${obj.topics.length} topics found`;
148
84
  }
149
- const { added = 0, deleted = 0, failed = 0, merged = 0, updated = 0 } = summary;
150
- const parts = [];
151
- if (added > 0)
152
- parts.push(`${added} added`);
153
- if (updated > 0)
154
- parts.push(`${updated} updated`);
155
- if (merged > 0)
156
- parts.push(`${merged} merged`);
157
- if (deleted > 0)
158
- parts.push(`${deleted} deleted`);
159
- if (failed > 0)
160
- parts.push(`${failed} failed`);
161
- return parts.length > 0 ? parts.join(', ') : 'No operations';
162
- }
163
- /**
164
- * Format items count from list_directory result
165
- */
166
- formatItemsCount(result) {
167
- if (typeof result === 'string') {
168
- const lines = result.split('\n').filter((line) => line.trim());
169
- return `${lines.length} items`;
85
+ if ('results' in obj && Array.isArray(obj.results)) {
86
+ return `${obj.results.length} matches`;
170
87
  }
171
- if (Array.isArray(result)) {
172
- return `${result.length} items`;
88
+ if ('matches' in obj && Array.isArray(obj.matches)) {
89
+ return `${obj.matches.length} matches`;
173
90
  }
174
- return '';
175
- }
176
- /**
177
- * Format matches count from grep_content result
178
- */
179
- formatMatchesCount(result) {
180
- if (typeof result === 'string') {
181
- const lines = result.split('\n').filter((line) => line.trim());
182
- return `${lines.length} matches found`;
91
+ if ('filesSearched' in obj) {
92
+ const files = obj.filesSearched;
93
+ const matches = Array.isArray(obj.matches) ? obj.matches.length : 0;
94
+ return `${files} files searched, ${matches} matches`;
183
95
  }
184
- if (Array.isArray(result)) {
185
- return `${result.length} matches found`;
96
+ // glob_files returns {files: [...]}
97
+ if ('files' in obj && Array.isArray(obj.files)) {
98
+ return `${obj.files.length} files`;
186
99
  }
187
- return '';
100
+ // list_directory returns {entries: [...]}
101
+ if ('entries' in obj && Array.isArray(obj.entries)) {
102
+ return `${obj.entries.length} entries`;
103
+ }
104
+ // read_file returns {content: string, ...}
105
+ if ('content' in obj && typeof obj.content === 'string') {
106
+ const content = obj.content;
107
+ const lines = content.split('\n').length;
108
+ return `${lines} lines`;
109
+ }
110
+ if ('count' in obj) {
111
+ return `${obj.count} items`;
112
+ }
113
+ // Check for any array property as fallback
114
+ for (const key of Object.keys(obj)) {
115
+ if (Array.isArray(obj[key])) {
116
+ return `${obj[key].length} ${key}`;
117
+ }
118
+ }
119
+ // Generic object - just show it worked
120
+ return 'Done';
188
121
  }
189
122
  /**
190
- * Format tool result summary for display
123
+ * Format tool arguments for display.
124
+ * Extract the most meaningful value for human reading.
191
125
  */
192
- formatToolResultSummary(toolName, result) {
193
- try {
194
- switch (toolName) {
195
- case 'bash_exec':
196
- case 'create_knowledge_topic':
197
- case 'delete_knowledge_topic':
198
- case 'detect_domains':
199
- case 'read_file':
200
- case 'write_file': {
201
- return '';
202
- }
203
- case 'curate': {
204
- return this.formatCurateResult(result);
205
- }
206
- case 'find_knowledge_topics': {
207
- return this.formatTopicsCount(result);
126
+ formatToolArgs(toolName, args) {
127
+ // Extract the most meaningful arg based on tool type
128
+ // Tool names use snake_case (LLM convention)
129
+ /* eslint-disable camelcase */
130
+ const meaningfulKeys = {
131
+ curate: ['operations'],
132
+ find_knowledge_topics: ['topicPattern', 'query'],
133
+ glob_files: ['pattern', 'glob'],
134
+ grep_content: ['pattern', 'query'],
135
+ list_directory: ['path', 'directory'],
136
+ read_file: ['filePath', 'path'],
137
+ read_knowledge_topic: ['topicPath', 'path'],
138
+ };
139
+ /* eslint-enable camelcase */
140
+ const keys = meaningfulKeys[toolName] ?? Object.keys(args);
141
+ for (const key of keys) {
142
+ if (args[key] !== undefined) {
143
+ const value = args[key];
144
+ if (typeof value === 'string') {
145
+ // Clean display - just the value, truncated if needed
146
+ return value.length > 40 ? `${value.slice(0, 37)}...` : value;
208
147
  }
209
- case 'grep_content': {
210
- return this.formatMatchesCount(result);
211
- }
212
- case 'list_directory': {
213
- return this.formatItemsCount(result);
214
- }
215
- default: {
216
- return '';
148
+ if (Array.isArray(value)) {
149
+ return `${value.length} items`;
217
150
  }
218
151
  }
219
152
  }
220
- catch {
221
- return '';
222
- }
153
+ return '';
223
154
  }
224
155
  /**
225
- * Format topics count from find_knowledge_topics result
156
+ * Format tool result for display.
157
+ * Shows meaningful, concise summary - NEVER shows raw JSON.
226
158
  */
227
- formatTopicsCount(result) {
228
- if (typeof result === 'string') {
159
+ formatToolResult(payload) {
160
+ if (!payload.success) {
161
+ const errMsg = payload.error ?? 'Failed';
162
+ return errMsg.length > 50 ? `${errMsg.slice(0, 47)}...` : errMsg;
163
+ }
164
+ if (!payload.result)
165
+ return 'Done';
166
+ // Handle different result types with concise output
167
+ if (Array.isArray(payload.result)) {
168
+ return `${payload.result.length} results`;
169
+ }
170
+ // Handle string results - might be JSON
171
+ if (typeof payload.result === 'string') {
172
+ // Try to parse as JSON for better formatting
229
173
  try {
230
- const parsed = JSON.parse(result);
231
- const count = Array.isArray(parsed) ? parsed.length : Object.keys(parsed).length;
232
- return `${count} topics retrieved`;
174
+ const parsed = JSON.parse(payload.result);
175
+ return this.formatParsedResult(parsed);
233
176
  }
234
177
  catch {
235
- return '';
178
+ // Not JSON - show char count for long strings
179
+ if (payload.result.length > 100) {
180
+ return `${payload.result.length} chars`;
181
+ }
182
+ return payload.result.length > 40 ? `${payload.result.slice(0, 37)}...` : payload.result;
236
183
  }
237
184
  }
238
- if (typeof result === 'object' && result !== null) {
239
- const resultObj = result;
240
- if (Array.isArray(resultObj.results)) {
241
- return `${resultObj.results.length} topics retrieved`;
242
- }
243
- if (typeof resultObj.total === 'number') {
244
- return `${resultObj.total} topics retrieved`;
245
- }
246
- if (Array.isArray(result)) {
247
- return `${result.length} topics retrieved`;
248
- }
185
+ if (typeof payload.result === 'object') {
186
+ return this.formatParsedResult(payload.result);
249
187
  }
250
- return '';
188
+ return 'Done';
251
189
  }
252
190
  /**
253
- * Get user-friendly description for a tool
254
- *
255
- * @param toolName - Name of the tool
256
- * @param args - Tool arguments
257
- * @returns User-friendly description
191
+ * Handle connection-related errors with user-friendly messages.
258
192
  */
259
- getToolDescription(toolName, args) {
260
- switch (toolName) {
261
- case 'bash_exec': {
262
- const cmd = String(args.command ?? '');
263
- return cmd.length > 60 ? `Running command...` : `Running: ${cmd}`;
193
+ handleConnectionError(error) {
194
+ if (error instanceof NoInstanceRunningError) {
195
+ // Check if running in sandbox environment
196
+ if (isSandboxEnvironment()) {
197
+ const sandboxName = getSandboxEnvironmentName();
198
+ this.terminal.log(`Error: No ByteRover instance is running.\n` +
199
+ `⚠️ Sandbox environment detected (${sandboxName}).\n\n` +
200
+ `Please run 'brv' command in a separate terminal window/tab outside the sandbox first.`);
264
201
  }
265
- case 'create_knowledge_topic': {
266
- return 'Creating knowledge topic...';
267
- }
268
- case 'curate': {
269
- return 'Curating context tree...';
270
- }
271
- case 'find_knowledge_topics': {
272
- return 'Querying context tree...';
273
- }
274
- case 'grep_content': {
275
- return 'Searching context tree...';
276
- }
277
- case 'list_directory': {
278
- return 'Listing directory...';
279
- }
280
- case 'read_file': {
281
- return `Reading file...`;
282
- }
283
- case 'write_file': {
284
- return 'Writing file...';
285
- }
286
- default: {
287
- return 'Processing...';
202
+ else {
203
+ this.terminal.log('No ByteRover instance is running.\n\n' +
204
+ 'Start a ByteRover instance by running "brv" in a separate terminal window/tab.\n' +
205
+ 'The instance will keep running and handle your commands.');
288
206
  }
207
+ return;
289
208
  }
290
- }
291
- /**
292
- * Handle workspace not initialized error
293
- */
294
- handleWorkspaceError(_error) {
295
- const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
296
- this.terminal.log(message);
297
- }
298
- /**
299
- * Setup event listeners for CipherAgent
300
- */
301
- setupEventListeners(agent, verbose) {
302
- if (!agent.agentEventBus) {
303
- throw new Error('Agent event bus not initialized');
209
+ if (error instanceof InstanceCrashedError) {
210
+ this.terminal.log('ByteRover instance has crashed.\n\nPlease restart with: brv');
211
+ return;
304
212
  }
305
- const eventBus = agent.agentEventBus;
306
- if (verbose) {
307
- // Verbose mode: show detailed events
308
- eventBus.on('llmservice:thinking', () => {
309
- this.terminal.log('🤔 [Event] LLM is thinking...');
310
- });
311
- eventBus.on('llmservice:response', (payload) => {
312
- this.terminal.log(`✅ [Event] LLM Response (${payload.provider}/${payload.model})`);
313
- });
314
- eventBus.on('llmservice:toolCall', (payload) => {
315
- // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
316
- const formattedCall = formatToolCall(payload.toolName, payload.args);
317
- this.terminal.log(`🔧 [Event] Tool Call: ${formattedCall}`);
318
- });
319
- eventBus.on('llmservice:toolResult', (payload) => {
320
- const resultSummary = formatToolResult(payload.toolName, payload.success, payload.result, payload.error);
321
- if (payload.success) {
322
- this.terminal.log(`✓ [Event] Tool Success: ${payload.toolName} → ${resultSummary}`);
323
- }
324
- else {
325
- this.terminal.log(`✗ [Event] Tool Error: ${payload.toolName} → ${resultSummary}`);
326
- }
327
- });
328
- // NOTE: llmservice:error is handled by catch block in the run method
329
- // which displays error via this.error(). DO NOT display here to avoid duplicate.
213
+ if (error instanceof ConnectionFailedError) {
214
+ // Check if it's specifically a sandbox network restriction error
215
+ const isSandboxError = isSandboxNetworkError(error.originalError ?? error);
216
+ if (isSandboxError) {
217
+ const sandboxName = getSandboxEnvironmentName();
218
+ this.terminal.log(`Error: Failed to connect to ByteRover instance.\n` +
219
+ `Port: ${error.port ?? 'unknown'}\n` +
220
+ `⚠️ Sandbox network restriction detected (${sandboxName}).\n\n` +
221
+ `Please allow network access in the sandbox and retry the command.`);
222
+ }
223
+ else {
224
+ this.terminal.log(`Failed to connect to ByteRover instance: ${error.message}`);
225
+ }
226
+ return;
330
227
  }
331
- else {
332
- // Non-verbose mode: show concise tool progress with descriptions
333
- // eventBus.on('llmservice:toolCall', (payload) => {
334
- // // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
335
- // const description = this.getToolDescription(payload.toolName, payload.args)
336
- // this.terminal.log(`🔧 ${payload.toolName} → ${description}`)
337
- // })
338
- // eventBus.on('llmservice:toolResult', (payload) => {
339
- // if (payload.success) {
340
- // // Show brief success summary for tool completion
341
- // const summary = this.formatToolResultSummary(payload.toolName, payload.result)
342
- // const completionText = summary ? `Complete (${summary})` : 'Complete'
343
- // this.terminal.log(`✅ ${payload.toolName} → ${completionText}`)
344
- // } else {
345
- // this.terminal.log(`✗ ${payload.toolName} → Failed: ${payload.error}`)
346
- // }
347
- // })
348
- // NOTE: llmservice:error is handled by catch block in the run method
349
- // which displays error via this.error(). DO NOT display here to avoid duplicate.
228
+ if (error instanceof ConnectionError) {
229
+ this.terminal.log(`Connection error: ${error.message}`);
230
+ return;
350
231
  }
232
+ // Unknown error
233
+ const message = error instanceof Error ? error.message : String(error);
234
+ this.terminal.log(`Unexpected error: ${message}`);
351
235
  }
352
236
  /**
353
- * Setup tool call tracking to persist in database
237
+ * Stream task results from the connected instance.
354
238
  */
355
- setupToolCallTracking(agent, executionId) {
356
- if (!agent.agentEventBus) {
357
- return;
358
- }
359
- const storage = getAgentStorageSync();
360
- const eventBus = agent.agentEventBus;
361
- const toolCallMap = new Map(); // callId -> dbToolCallId
362
- eventBus.on('llmservice:toolCall', (payload) => {
363
- try {
364
- if (!payload.callId)
365
- return;
366
- const toolCallId = storage.addToolCall(executionId, {
367
- args: payload.args,
368
- name: payload.toolName,
369
- });
370
- toolCallMap.set(payload.callId, toolCallId);
371
- }
372
- catch {
373
- // Ignore errors - don't break query execution
374
- }
375
- });
376
- eventBus.on('llmservice:toolResult', (payload) => {
377
- try {
378
- if (!payload.callId)
379
- return;
380
- const toolCallId = toolCallMap.get(payload.callId);
381
- if (toolCallId) {
382
- // Format result: if error, wrap in {error: "..."} object
383
- let result;
384
- if (payload.success) {
385
- result = typeof payload.result === 'string' ? payload.result : JSON.stringify(payload.result);
239
+ async streamTaskResults(client, taskId, verbose) {
240
+ return new Promise((resolve, reject) => {
241
+ let completed = false;
242
+ let resultPrinted = false; // Track if we've already printed the result
243
+ // Timeout after 5 minutes
244
+ const timeout = setTimeout(() => {
245
+ if (!completed) {
246
+ completed = true;
247
+ cleanup();
248
+ reject(new Error('Task timed out after 5 minutes'));
249
+ }
250
+ }, 5 * 60 * 1000);
251
+ // Setup all event handlers
252
+ const unsubscribers = [
253
+ // task:ack - immediate acknowledgment
254
+ client.on('task:ack', (payload) => {
255
+ if (payload.taskId === taskId && verbose) {
256
+ this.terminal.log('Task acknowledged by server');
386
257
  }
387
- else {
388
- const errorMsg = payload.error ?? (typeof payload.result === 'string' ? payload.result : 'Unknown error');
389
- result = JSON.stringify({ error: errorMsg });
258
+ }),
259
+ // task:started - task is being processed
260
+ client.on('task:started', (payload) => {
261
+ if (payload.taskId === taskId && verbose) {
262
+ this.terminal.log('Task started processing...');
390
263
  }
391
- storage.updateToolCall(toolCallId, payload.success ? 'completed' : 'failed', {
392
- result,
393
- resultSummary: payload.success ? this.createResultSummary(result) : undefined,
394
- });
395
- }
396
- }
397
- catch {
398
- // Ignore errors - don't break query execution
399
- }
264
+ }),
265
+ // llmservice:chunk - streaming content (for future release)
266
+ // client.on<LlmChunkPayload>('llmservice:chunk', (payload) => {
267
+ // if (payload.taskId === taskId) {
268
+ // if (!hasReceivedChunks) {
269
+ // this.terminal.log('\nResult:')
270
+ // }
271
+ // hasReceivedChunks = true
272
+ // process.stdout.write(payload.content)
273
+ // }
274
+ // }),
275
+ // llmservice:response - final response from LLM (only print once)
276
+ client.on('llmservice:response', (payload) => {
277
+ if (payload.taskId === taskId && payload.content && !resultPrinted) {
278
+ resultPrinted = true;
279
+ this.terminal.log('\nResult:');
280
+ this.terminal.log(payload.content);
281
+ }
282
+ }),
283
+ // llmservice:toolCall - tool invocation (stop showing after response)
284
+ client.on('llmservice:toolCall', (payload) => {
285
+ if (payload.taskId === taskId && !resultPrinted) {
286
+ const detail = payload.args ? this.formatToolArgs(payload.toolName, payload.args) : '';
287
+ const suffix = detail ? `: ${detail}` : '';
288
+ this.terminal.log(`🔧 ${payload.toolName}${suffix}`);
289
+ }
290
+ }),
291
+ // llmservice:toolResult - tool result with summary (stop showing after response)
292
+ client.on('llmservice:toolResult', (payload) => {
293
+ if (payload.taskId === taskId && !resultPrinted) {
294
+ const status = payload.success ? '✓' : '✗';
295
+ const resultSummary = this.formatToolResult(payload);
296
+ this.terminal.log(` ${status} ${resultSummary}`);
297
+ }
298
+ }),
299
+ // task:completed - task finished (chunks already streamed, just resolve)
300
+ client.on('task:completed', (payload) => {
301
+ if (payload.taskId === taskId && !completed) {
302
+ completed = true;
303
+ cleanup();
304
+ // Note: Don't log result here - chunks already streamed it
305
+ this.terminal.log(''); // Final newline for clean output
306
+ resolve();
307
+ }
308
+ }),
309
+ // task:error - task failed
310
+ client.on('task:error', (payload) => {
311
+ if (payload.taskId === taskId && !completed) {
312
+ completed = true;
313
+ cleanup();
314
+ reject(new Error(payload.error.message));
315
+ }
316
+ }),
317
+ // Clear timeout when done
318
+ () => clearTimeout(timeout),
319
+ ];
320
+ const cleanup = () => {
321
+ for (const unsub of unsubscribers)
322
+ unsub();
323
+ };
400
324
  });
401
325
  }
402
326
  }
@@ -84,7 +84,7 @@ export class StatusUseCase {
84
84
  ].sort((a, b) => a.path.localeCompare(b.path));
85
85
  this.terminal.log('Context Tree Changes:');
86
86
  for (const change of allChanges) {
87
- this.terminal.log(`\t${change.color(`${change.status.padEnd(10)} ${formatPath(change.path)}`)}`);
87
+ this.terminal.log(` ${change.color(`${change.status.padEnd(10)} ${formatPath(change.path)}`)}`);
88
88
  }
89
89
  // Track status
90
90
  await this.trackingService.track('mem:status');