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,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.
@@ -32,370 +28,299 @@ export class QueryUseCase {
32
28
  return randomUUID();
33
29
  }
34
30
  async run(options) {
35
- // Initialize storage for tool call tracking (auto-detects .brv/blobs)
36
- const storage = await getAgentStorage();
37
- let executionId = null;
31
+ await this.trackingService.track('mem:query', { status: 'started' });
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;
38
40
  try {
39
- // Get authentication token
40
- const token = await this.tokenStore.load();
41
- if (!token) {
42
- this.terminal.log('Authentication required. Please run "brv login" first.');
43
- return;
44
- }
45
- // Load project config
46
- const brvConfig = await this.projectConfigStore.read();
47
- // Validate workspace is initialized
48
- if (!brvConfig) {
49
- throw new WorkspaceNotInitializedError('Project not initialized. Please run "brv init" to select your team and workspace.', '.brv');
41
+ const transportClientFactory = this.transportClientFactoryCreator();
42
+ if (verbose) {
43
+ this.terminal.log('Discovering running instance...');
50
44
  }
51
- // Create execution with status='running' (query runs synchronously)
52
- executionId = storage.createExecution('query', options.query);
53
- // Create LLM config
54
- const model = options.model ?? (options.apiKey ? 'google/gemini-2.5-pro' : 'gemini-2.5-pro');
55
- const envConfig = getCurrentConfig();
56
- const llmConfig = {
57
- accessToken: token.accessToken,
58
- apiBaseUrl: envConfig.llmApiBaseUrl,
59
- fileSystemConfig: { workingDirectory: process.cwd() },
60
- maxIterations: 5,
61
- maxTokens: 2048,
62
- model,
63
- openRouterApiKey: options.apiKey,
64
- projectId: PROJECT,
65
- sessionKey: token.sessionKey,
66
- temperature: 0.7,
67
- topK: 10,
68
- topP: 0.95,
69
- verbose: options.verbose ?? false,
70
- };
71
- // Create and start CipherAgent
72
- const agent = this.createCipherAgent(llmConfig, brvConfig);
73
- this.terminal.log('Querying context tree...');
74
- await agent.start();
75
- try {
76
- const sessionId = this.generateSessionId();
77
- // Setup event listeners (display + tool call tracking)
78
- this.setupEventListeners(agent, options.verbose ?? false);
79
- this.setupToolCallTracking(agent, executionId);
80
- // Execute with autonomous mode and query commandType
81
- const prompt = `Search the context tree for: ${options.query}`;
82
- const response = await agent.execute(prompt, sessionId, {
83
- executionContext: { commandType: 'query' },
84
- mode: 'autonomous',
85
- });
86
- // Mark execution as completed
87
- storage.updateExecutionStatus(executionId, 'completed', response);
88
- this.terminal.log('\nQuery Results:');
89
- this.terminal.log(response);
90
- // Track query
91
- await this.trackingService.track('mem:query');
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;
67
+ this.handleConnectionError(error);
68
+ await this.trackingService.track('mem:query', { message: formatError(error), status: 'error' });
69
+ }
70
+ finally {
71
+ // Cleanup
72
+ if (client) {
73
+ await client.disconnect();
107
74
  }
108
- // Display context on one line, error on separate line
109
- process.stderr.write('Failed to query context tree:\n');
110
- this.terminal.log(formatError(error));
111
75
  }
112
76
  }
113
77
  /**
114
- * Create result summary for tool call
115
- */
116
- createResultSummary(result) {
117
- const lines = result.split('\n').length;
118
- const chars = result.length;
119
- return `${lines} lines, ${chars} chars`;
120
- }
121
- /**
122
- * Extract summary from curate tool result
78
+ * Format a parsed object result into a concise summary.
123
79
  */
124
- extractCurateSummary(result) {
125
- if (typeof result === 'string') {
126
- try {
127
- const parsed = JSON.parse(result);
128
- return parsed.summary ?? null;
129
- }
130
- catch {
131
- return null;
132
- }
80
+ formatParsedResult(obj) {
81
+ // Check for common patterns
82
+ if ('topics' in obj && Array.isArray(obj.topics)) {
83
+ return `${obj.topics.length} topics found`;
133
84
  }
134
- if (typeof result === 'object' && result !== null) {
135
- const resultObj = result;
136
- return resultObj.summary ?? null;
85
+ if ('results' in obj && Array.isArray(obj.results)) {
86
+ return `${obj.results.length} matches`;
137
87
  }
138
- return null;
139
- }
140
- /**
141
- * Format curate tool operation summary
142
- */
143
- formatCurateResult(result) {
144
- const summary = this.extractCurateSummary(result);
145
- if (!summary) {
146
- return '';
88
+ if ('matches' in obj && Array.isArray(obj.matches)) {
89
+ return `${obj.matches.length} matches`;
147
90
  }
148
- const { added = 0, deleted = 0, failed = 0, merged = 0, updated = 0 } = summary;
149
- const parts = [];
150
- if (added > 0)
151
- parts.push(`${added} added`);
152
- if (updated > 0)
153
- parts.push(`${updated} updated`);
154
- if (merged > 0)
155
- parts.push(`${merged} merged`);
156
- if (deleted > 0)
157
- parts.push(`${deleted} deleted`);
158
- if (failed > 0)
159
- parts.push(`${failed} failed`);
160
- return parts.length > 0 ? parts.join(', ') : 'No operations';
161
- }
162
- /**
163
- * Format items count from list_directory result
164
- */
165
- formatItemsCount(result) {
166
- if (typeof result === 'string') {
167
- const lines = result.split('\n').filter((line) => line.trim());
168
- return `${lines.length} items`;
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`;
169
95
  }
170
- if (Array.isArray(result)) {
171
- return `${result.length} items`;
96
+ // glob_files returns {files: [...]}
97
+ if ('files' in obj && Array.isArray(obj.files)) {
98
+ return `${obj.files.length} files`;
172
99
  }
173
- return '';
174
- }
175
- /**
176
- * Format matches count from grep_content result
177
- */
178
- formatMatchesCount(result) {
179
- if (typeof result === 'string') {
180
- const lines = result.split('\n').filter((line) => line.trim());
181
- return `${lines.length} matches found`;
100
+ // list_directory returns {entries: [...]}
101
+ if ('entries' in obj && Array.isArray(obj.entries)) {
102
+ return `${obj.entries.length} entries`;
182
103
  }
183
- if (Array.isArray(result)) {
184
- return `${result.length} matches found`;
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`;
185
109
  }
186
- return '';
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';
187
121
  }
188
122
  /**
189
- * Format tool result summary for display
123
+ * Format tool arguments for display.
124
+ * Extract the most meaningful value for human reading.
190
125
  */
191
- formatToolResultSummary(toolName, result) {
192
- try {
193
- switch (toolName) {
194
- case 'bash_exec':
195
- case 'create_knowledge_topic':
196
- case 'delete_knowledge_topic':
197
- case 'detect_domains':
198
- case 'read_file':
199
- case 'write_file': {
200
- return '';
201
- }
202
- case 'curate': {
203
- return this.formatCurateResult(result);
204
- }
205
- case 'find_knowledge_topics': {
206
- return this.formatTopicsCount(result);
207
- }
208
- case 'grep_content': {
209
- return this.formatMatchesCount(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;
210
147
  }
211
- case 'list_directory': {
212
- return this.formatItemsCount(result);
213
- }
214
- default: {
215
- return '';
148
+ if (Array.isArray(value)) {
149
+ return `${value.length} items`;
216
150
  }
217
151
  }
218
152
  }
219
- catch {
220
- return '';
221
- }
153
+ return '';
222
154
  }
223
155
  /**
224
- * Format topics count from find_knowledge_topics result
156
+ * Format tool result for display.
157
+ * Shows meaningful, concise summary - NEVER shows raw JSON.
225
158
  */
226
- formatTopicsCount(result) {
227
- 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
228
173
  try {
229
- const parsed = JSON.parse(result);
230
- const count = Array.isArray(parsed) ? parsed.length : Object.keys(parsed).length;
231
- return `${count} topics retrieved`;
174
+ const parsed = JSON.parse(payload.result);
175
+ return this.formatParsedResult(parsed);
232
176
  }
233
177
  catch {
234
- 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;
235
183
  }
236
184
  }
237
- if (typeof result === 'object' && result !== null) {
238
- const resultObj = result;
239
- if (Array.isArray(resultObj.results)) {
240
- return `${resultObj.results.length} topics retrieved`;
241
- }
242
- if (typeof resultObj.total === 'number') {
243
- return `${resultObj.total} topics retrieved`;
244
- }
245
- if (Array.isArray(result)) {
246
- return `${result.length} topics retrieved`;
247
- }
185
+ if (typeof payload.result === 'object') {
186
+ return this.formatParsedResult(payload.result);
248
187
  }
249
- return '';
188
+ return 'Done';
250
189
  }
251
190
  /**
252
- * Get user-friendly description for a tool
253
- *
254
- * @param toolName - Name of the tool
255
- * @param args - Tool arguments
256
- * @returns User-friendly description
191
+ * Handle connection-related errors with user-friendly messages.
257
192
  */
258
- getToolDescription(toolName, args) {
259
- switch (toolName) {
260
- case 'bash_exec': {
261
- const cmd = String(args.command ?? '');
262
- return cmd.length > 60 ? `Running command...` : `Running: ${cmd}`;
263
- }
264
- case 'create_knowledge_topic': {
265
- return 'Creating knowledge topic...';
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.`);
266
201
  }
267
- case 'curate': {
268
- return 'Curating context tree...';
269
- }
270
- case 'find_knowledge_topics': {
271
- return 'Querying context tree...';
272
- }
273
- case 'grep_content': {
274
- return 'Searching context tree...';
275
- }
276
- case 'list_directory': {
277
- return 'Listing directory...';
278
- }
279
- case 'read_file': {
280
- return `Reading file...`;
281
- }
282
- case 'write_file': {
283
- return 'Writing file...';
284
- }
285
- default: {
286
- 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.');
287
206
  }
207
+ return;
288
208
  }
289
- }
290
- /**
291
- * Handle workspace not initialized error
292
- */
293
- handleWorkspaceError(_error) {
294
- const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
295
- this.terminal.log(message);
296
- }
297
- /**
298
- * Setup event listeners for CipherAgent
299
- */
300
- setupEventListeners(agent, verbose) {
301
- if (!agent.agentEventBus) {
302
- 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;
303
212
  }
304
- const eventBus = agent.agentEventBus;
305
- if (verbose) {
306
- // Verbose mode: show detailed events
307
- eventBus.on('llmservice:thinking', () => {
308
- this.terminal.log('🤔 [Event] LLM is thinking...');
309
- });
310
- eventBus.on('llmservice:response', (payload) => {
311
- this.terminal.log(`✅ [Event] LLM Response (${payload.provider}/${payload.model})`);
312
- });
313
- eventBus.on('llmservice:toolCall', (payload) => {
314
- // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
315
- const formattedCall = formatToolCall(payload.toolName, payload.args);
316
- this.terminal.log(`🔧 [Event] Tool Call: ${formattedCall}`);
317
- });
318
- eventBus.on('llmservice:toolResult', (payload) => {
319
- const resultSummary = formatToolResult(payload.toolName, payload.success, payload.result, payload.error);
320
- if (payload.success) {
321
- this.terminal.log(`✓ [Event] Tool Success: ${payload.toolName} → ${resultSummary}`);
322
- }
323
- else {
324
- this.terminal.log(`✗ [Event] Tool Error: ${payload.toolName} → ${resultSummary}`);
325
- }
326
- });
327
- // NOTE: llmservice:error is handled by catch block in the run method
328
- // 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;
329
227
  }
330
- else {
331
- // Non-verbose mode: show concise tool progress with descriptions
332
- // eventBus.on('llmservice:toolCall', (payload) => {
333
- // // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
334
- // const description = this.getToolDescription(payload.toolName, payload.args)
335
- // this.terminal.log(`🔧 ${payload.toolName} → ${description}`)
336
- // })
337
- // eventBus.on('llmservice:toolResult', (payload) => {
338
- // if (payload.success) {
339
- // // Show brief success summary for tool completion
340
- // const summary = this.formatToolResultSummary(payload.toolName, payload.result)
341
- // const completionText = summary ? `Complete (${summary})` : 'Complete'
342
- // this.terminal.log(`✅ ${payload.toolName} → ${completionText}`)
343
- // } else {
344
- // this.terminal.log(`✗ ${payload.toolName} → Failed: ${payload.error}`)
345
- // }
346
- // })
347
- // NOTE: llmservice:error is handled by catch block in the run method
348
- // 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;
349
231
  }
232
+ // Unknown error
233
+ const message = error instanceof Error ? error.message : String(error);
234
+ this.terminal.log(`Unexpected error: ${message}`);
350
235
  }
351
236
  /**
352
- * Setup tool call tracking to persist in database
237
+ * Stream task results from the connected instance.
353
238
  */
354
- setupToolCallTracking(agent, executionId) {
355
- if (!agent.agentEventBus) {
356
- return;
357
- }
358
- const storage = getAgentStorageSync();
359
- const eventBus = agent.agentEventBus;
360
- const toolCallMap = new Map(); // callId -> dbToolCallId
361
- eventBus.on('llmservice:toolCall', (payload) => {
362
- try {
363
- if (!payload.callId)
364
- return;
365
- const toolCallId = storage.addToolCall(executionId, {
366
- args: payload.args,
367
- name: payload.toolName,
368
- });
369
- toolCallMap.set(payload.callId, toolCallId);
370
- }
371
- catch {
372
- // Ignore errors - don't break query execution
373
- }
374
- });
375
- eventBus.on('llmservice:toolResult', (payload) => {
376
- try {
377
- if (!payload.callId)
378
- return;
379
- const toolCallId = toolCallMap.get(payload.callId);
380
- if (toolCallId) {
381
- // Format result: if error, wrap in {error: "..."} object
382
- let result;
383
- if (payload.success) {
384
- 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');
385
257
  }
386
- else {
387
- const errorMsg = payload.error ?? (typeof payload.result === 'string' ? payload.result : 'Unknown error');
388
- 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...');
389
263
  }
390
- storage.updateToolCall(toolCallId, payload.success ? 'completed' : 'failed', {
391
- result,
392
- resultSummary: payload.success ? this.createResultSummary(result) : undefined,
393
- });
394
- }
395
- }
396
- catch {
397
- // Ignore errors - don't break query execution
398
- }
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
+ };
399
324
  });
400
325
  }
401
326
  }