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
@@ -0,0 +1,207 @@
1
+ import { instrument } from '@socket.io/admin-ui';
2
+ import { createServer } from 'node:http';
3
+ import { Server } from 'socket.io';
4
+ import { isDevelopment } from '../../config/environment.js';
5
+ import { TRANSPORT_PING_INTERVAL_MS, TRANSPORT_PING_TIMEOUT_MS } from '../../constants.js';
6
+ import { TransportPortInUseError, TransportServerAlreadyRunningError, TransportServerNotStartedError, } from '../../core/domain/errors/transport-error.js';
7
+ import { transportLog } from '../../utils/process-logger.js';
8
+ /**
9
+ * Internal protocol constants for request/response pattern.
10
+ */
11
+ const RESPONSE_EVENT_SUFFIX = ':response';
12
+ const ERROR_EVENT_SUFFIX = ':error';
13
+ /**
14
+ * Socket.IO implementation of ITransportServer.
15
+ *
16
+ * Architecture notes:
17
+ * - Uses an HTTP server internally for Socket.IO
18
+ * - Request/response pattern: client emits "event", server emits "event:response" or "event:error"
19
+ * - Rooms are used for targeted broadcasts (e.g., per-task events)
20
+ */
21
+ export class SocketIOTransportServer {
22
+ config;
23
+ connectionHandlers = [];
24
+ disconnectionHandlers = [];
25
+ httpServer;
26
+ io;
27
+ port;
28
+ requestHandlers = new Map();
29
+ running = false;
30
+ sockets = new Map();
31
+ constructor(config) {
32
+ this.config = {
33
+ corsOrigin: config?.corsOrigin ?? '*',
34
+ pingIntervalMs: config?.pingIntervalMs ?? TRANSPORT_PING_INTERVAL_MS,
35
+ pingTimeoutMs: config?.pingTimeoutMs ?? TRANSPORT_PING_TIMEOUT_MS,
36
+ };
37
+ }
38
+ addToRoom(clientId, room) {
39
+ const socket = this.sockets.get(clientId);
40
+ if (socket) {
41
+ socket.join(room);
42
+ }
43
+ }
44
+ broadcast(event, data) {
45
+ const { io } = this;
46
+ if (!io) {
47
+ throw new TransportServerNotStartedError('broadcast');
48
+ }
49
+ io.emit(event, data);
50
+ }
51
+ broadcastTo(room, event, data) {
52
+ const { io } = this;
53
+ if (!io) {
54
+ throw new TransportServerNotStartedError('broadcastTo');
55
+ }
56
+ io.to(room).emit(event, data);
57
+ }
58
+ getPort() {
59
+ return this.port;
60
+ }
61
+ isRunning() {
62
+ return this.running;
63
+ }
64
+ onConnection(handler) {
65
+ this.connectionHandlers.push(handler);
66
+ }
67
+ onDisconnection(handler) {
68
+ this.disconnectionHandlers.push(handler);
69
+ }
70
+ onRequest(event, handler) {
71
+ const { io } = this;
72
+ if (!io) {
73
+ throw new TransportServerNotStartedError('onRequest');
74
+ }
75
+ // Store handler wrapped to accept unknown types (avoids type assertion)
76
+ const wrappedHandler = (data, clientId) => handler(data, clientId);
77
+ this.requestHandlers.set(event, wrappedHandler);
78
+ // Apply handler to all existing sockets
79
+ for (const socket of this.sockets.values()) {
80
+ this.registerEventHandler(socket, event, wrappedHandler);
81
+ }
82
+ }
83
+ removeFromRoom(clientId, room) {
84
+ const socket = this.sockets.get(clientId);
85
+ if (socket) {
86
+ socket.leave(room);
87
+ }
88
+ }
89
+ sendTo(clientId, event, data) {
90
+ const socket = this.sockets.get(clientId);
91
+ if (socket) {
92
+ socket.emit(event, data);
93
+ }
94
+ }
95
+ async start(port) {
96
+ if (this.running) {
97
+ throw new TransportServerAlreadyRunningError(this.port ?? port);
98
+ }
99
+ return new Promise((resolve, reject) => {
100
+ this.httpServer = createServer();
101
+ // In development mode, allow admin.socket.io for debugging
102
+ const corsOrigin = isDevelopment() ? [this.config.corsOrigin, 'https://admin.socket.io'] : this.config.corsOrigin;
103
+ this.io = new Server(this.httpServer, {
104
+ cors: {
105
+ credentials: isDevelopment(), // Required for admin UI authentication
106
+ origin: corsOrigin,
107
+ },
108
+ // Aggressive ping for faster disconnect detection (real-time)
109
+ pingInterval: this.config.pingIntervalMs,
110
+ pingTimeout: this.config.pingTimeoutMs,
111
+ });
112
+ // Enable Socket.IO Admin UI in development mode only
113
+ if (isDevelopment()) {
114
+ instrument(this.io, {
115
+ auth: false, // No authentication for local dev
116
+ mode: 'development',
117
+ });
118
+ transportLog('Socket.IO Admin UI enabled - connect at https://admin.socket.io');
119
+ }
120
+ this.io.on('connection', (socket) => {
121
+ const clientId = socket.id;
122
+ this.sockets.set(clientId, socket);
123
+ // Apply all registered request handlers to new socket
124
+ for (const [event, handler] of this.requestHandlers) {
125
+ this.registerEventHandler(socket, event, handler);
126
+ }
127
+ // Notify connection handlers
128
+ for (const handler of this.connectionHandlers) {
129
+ handler(clientId);
130
+ }
131
+ socket.on('disconnect', () => {
132
+ this.sockets.delete(clientId);
133
+ // Notify disconnection handlers
134
+ for (const handler of this.disconnectionHandlers) {
135
+ handler(clientId);
136
+ }
137
+ });
138
+ // Handle room join requests
139
+ socket.on('room:join', (room, callback) => {
140
+ socket.join(room);
141
+ callback?.({ success: true });
142
+ });
143
+ // Handle room leave requests
144
+ socket.on('room:leave', (room, callback) => {
145
+ socket.leave(room);
146
+ callback?.({ success: true });
147
+ });
148
+ });
149
+ this.httpServer.on('error', (err) => {
150
+ if (err.code === 'EADDRINUSE') {
151
+ reject(new TransportPortInUseError(port));
152
+ }
153
+ else {
154
+ reject(err);
155
+ }
156
+ });
157
+ this.httpServer.listen(port, () => {
158
+ this.port = port;
159
+ this.running = true;
160
+ resolve();
161
+ });
162
+ });
163
+ }
164
+ async stop() {
165
+ const { httpServer, io } = this;
166
+ if (!this.running || !io || !httpServer) {
167
+ return;
168
+ }
169
+ return new Promise((resolve) => {
170
+ // Disconnect all sockets
171
+ io.disconnectSockets(true);
172
+ // Close Socket.IO server
173
+ io.close(() => {
174
+ // Close HTTP server
175
+ httpServer.close(() => {
176
+ this.running = false;
177
+ this.port = undefined;
178
+ this.sockets.clear();
179
+ resolve();
180
+ });
181
+ });
182
+ });
183
+ }
184
+ registerEventHandler(socket, event, handler) {
185
+ socket.on(event, async (data, callback) => {
186
+ try {
187
+ const result = await handler(data, socket.id);
188
+ // Support both callback style and event-based response
189
+ if (callback) {
190
+ callback({ data: result, success: true });
191
+ }
192
+ else {
193
+ socket.emit(`${event}${RESPONSE_EVENT_SUFFIX}`, { data: result, success: true });
194
+ }
195
+ }
196
+ catch (error) {
197
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
198
+ if (callback) {
199
+ callback({ error: errorMessage, success: false });
200
+ }
201
+ else {
202
+ socket.emit(`${event}${ERROR_EVENT_SUFFIX}`, { error: errorMessage, success: false });
203
+ }
204
+ }
205
+ });
206
+ }
207
+ }
@@ -0,0 +1,76 @@
1
+ import type { ILogger } from '../../core/interfaces/cipher/i-logger.js';
2
+ import type { IInstanceDiscovery } from '../../core/interfaces/instance/i-instance-discovery.js';
3
+ import type { ITransportClient } from '../../core/interfaces/transport/i-transport-client.js';
4
+ /**
5
+ * Result of connection attempt.
6
+ */
7
+ export type ConnectionResult = {
8
+ /** The connected transport client */
9
+ client: ITransportClient;
10
+ /** Project root where instance was found */
11
+ projectRoot: string;
12
+ };
13
+ /**
14
+ * Configuration for TransportClientFactory.
15
+ */
16
+ export type TransportClientFactoryConfig = {
17
+ /** Instance discovery service */
18
+ discovery?: IInstanceDiscovery;
19
+ /** Logger instance */
20
+ logger?: ILogger;
21
+ /** Maximum retry attempts (default: 8 for sandbox environments) */
22
+ maxRetries?: number;
23
+ /** Delay between retries in ms (default: 150 for faster sandbox warm-up) */
24
+ retryDelayMs?: number;
25
+ };
26
+ /**
27
+ * Factory for creating connected transport clients.
28
+ *
29
+ * Handles:
30
+ * - Instance discovery (walk-up directory tree)
31
+ * - Connection establishment
32
+ * - Retry logic
33
+ * - Error translation to user-friendly messages
34
+ */
35
+ export declare class TransportClientFactory {
36
+ private readonly discovery;
37
+ private readonly logger;
38
+ private readonly maxRetries;
39
+ private readonly retryDelayMs;
40
+ constructor(config?: TransportClientFactoryConfig);
41
+ /**
42
+ * Discovers a running instance and connects to it.
43
+ *
44
+ * @param fromDir - Directory to start discovery from (default: cwd)
45
+ * @returns Connected client and project root
46
+ * @throws NoInstanceRunningError - No .brv directory found
47
+ * @throws InstanceCrashedError - Instance found but process dead
48
+ * @throws ConnectionFailedError - Instance found but connection failed
49
+ */
50
+ connect(fromDir?: string): Promise<ConnectionResult>;
51
+ /**
52
+ * Connects to the instance with retry logic.
53
+ * Includes HTTP warm-up to trigger sandbox permission requests.
54
+ *
55
+ * Sandbox environments (like Cursor IDE terminals) block network access initially.
56
+ * The first connection attempt triggers the permission request, subsequent attempts succeed.
57
+ */
58
+ private connectWithRetry;
59
+ /**
60
+ * Delay helper.
61
+ */
62
+ private delay;
63
+ /**
64
+ * Attempts an HTTP warm-up request to trigger sandbox network permission.
65
+ * This uses native fetch() which might be handled differently by sandboxes than WebSocket.
66
+ */
67
+ private httpWarmUp;
68
+ }
69
+ /**
70
+ * Gets or creates the singleton factory.
71
+ */
72
+ export declare function getTransportClientFactory(config?: TransportClientFactoryConfig): TransportClientFactory;
73
+ /**
74
+ * Creates a new factory instance.
75
+ */
76
+ export declare function createTransportClientFactory(config?: TransportClientFactoryConfig): TransportClientFactory;
@@ -0,0 +1,168 @@
1
+ import { ConnectionFailedError, InstanceCrashedError, NoInstanceRunningError, } from '../../core/domain/errors/connection-error.js';
2
+ import { NoOpLogger } from '../../core/interfaces/cipher/i-logger.js';
3
+ import { FileInstanceDiscovery } from '../instance/file-instance-discovery.js';
4
+ import { SocketIOTransportClient } from './socket-io-transport-client.js';
5
+ /**
6
+ * Factory for creating connected transport clients.
7
+ *
8
+ * Handles:
9
+ * - Instance discovery (walk-up directory tree)
10
+ * - Connection establishment
11
+ * - Retry logic
12
+ * - Error translation to user-friendly messages
13
+ */
14
+ export class TransportClientFactory {
15
+ discovery;
16
+ logger;
17
+ maxRetries;
18
+ retryDelayMs;
19
+ constructor(config) {
20
+ this.discovery = config?.discovery ?? new FileInstanceDiscovery();
21
+ this.logger = config?.logger ?? new NoOpLogger();
22
+ // Increased retries for sandbox warm-up scenarios (IDE terminals like Cursor)
23
+ // First connection often fails, subsequent ones succeed after sandbox "warms up"
24
+ this.maxRetries = config?.maxRetries ?? 8;
25
+ // Shorter delay to retry faster after sandbox warm-up
26
+ this.retryDelayMs = config?.retryDelayMs ?? 150;
27
+ }
28
+ /**
29
+ * Discovers a running instance and connects to it.
30
+ *
31
+ * @param fromDir - Directory to start discovery from (default: cwd)
32
+ * @returns Connected client and project root
33
+ * @throws NoInstanceRunningError - No .brv directory found
34
+ * @throws InstanceCrashedError - Instance found but process dead
35
+ * @throws ConnectionFailedError - Instance found but connection failed
36
+ */
37
+ async connect(fromDir = process.cwd()) {
38
+ // Discover running instance
39
+ this.logger.debug('Discovering instance', { fromDir });
40
+ const result = await this.discovery.discover(fromDir);
41
+ if (!result.found) {
42
+ if (result.reason === 'instance_crashed') {
43
+ throw new InstanceCrashedError();
44
+ }
45
+ throw new NoInstanceRunningError();
46
+ }
47
+ const { instance, projectRoot } = result;
48
+ const url = instance.getTransportUrl();
49
+ this.logger.info('Instance discovered', { pid: instance.pid, port: instance.port, projectRoot });
50
+ // Connect with retry
51
+ const client = await this.connectWithRetry(url, instance.port);
52
+ return { client, projectRoot };
53
+ }
54
+ /**
55
+ * Connects to the instance with retry logic.
56
+ * Includes HTTP warm-up to trigger sandbox permission requests.
57
+ *
58
+ * Sandbox environments (like Cursor IDE terminals) block network access initially.
59
+ * The first connection attempt triggers the permission request, subsequent attempts succeed.
60
+ */
61
+ async connectWithRetry(url, port) {
62
+ let lastError;
63
+ // HTTP warm-up: Try a simple HTTP request first to trigger sandbox permission
64
+ // This is simpler than WebSocket and might trigger sandbox permission differently
65
+ this.logger.debug('Attempting HTTP warm-up', { url });
66
+ await this.httpWarmUp(url);
67
+ // Small delay after HTTP warm-up
68
+ await this.delay(100);
69
+ // Now retry with proper connection attempts
70
+ for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
71
+ const client = new SocketIOTransportClient();
72
+ try {
73
+ this.logger.debug('Connection attempt', { attempt, maxRetries: this.maxRetries, url });
74
+ // eslint-disable-next-line no-await-in-loop
75
+ await client.connect(url);
76
+ this.logger.info('Connected to instance', { clientId: client.getClientId(), url });
77
+ return client;
78
+ }
79
+ catch (error) {
80
+ // Safety cleanup: ensure client is disconnected even if connect() throws
81
+ // for reasons other than connect_error (edge cases).
82
+ // Note: SocketIOTransportClient.connect() now handles cleanup on connect_error,
83
+ // but this provides defense-in-depth for unexpected exceptions.
84
+ try {
85
+ // eslint-disable-next-line no-await-in-loop
86
+ await client.disconnect();
87
+ }
88
+ catch {
89
+ // Ignore disconnect errors during cleanup
90
+ }
91
+ lastError = error instanceof Error ? error : new Error(String(error));
92
+ const errorMessage = lastError.message.toLowerCase();
93
+ const isSandboxError = errorMessage.includes('websocket error') ||
94
+ errorMessage.includes('network') ||
95
+ errorMessage.includes('connection failed') ||
96
+ errorMessage.includes('econnrefused');
97
+ this.logger.warn('Connection attempt failed', {
98
+ attempt,
99
+ error: lastError.message,
100
+ isSandboxError,
101
+ });
102
+ // Don't retry on the last attempt
103
+ if (attempt < this.maxRetries) {
104
+ // For sandbox errors, use longer delays to allow network permissions to be granted
105
+ // First retry: 300ms (if sandbox), 150ms (otherwise)
106
+ // Second retry: 600ms (if sandbox), 300ms (otherwise)
107
+ const baseDelay = isSandboxError ? 300 : this.retryDelayMs;
108
+ const delayMs = baseDelay * attempt;
109
+ // eslint-disable-next-line no-await-in-loop
110
+ await this.delay(delayMs);
111
+ }
112
+ }
113
+ }
114
+ throw new ConnectionFailedError(port, lastError);
115
+ }
116
+ /**
117
+ * Delay helper.
118
+ */
119
+ delay(ms) {
120
+ return new Promise((resolve) => {
121
+ setTimeout(resolve, ms);
122
+ });
123
+ }
124
+ /**
125
+ * Attempts an HTTP warm-up request to trigger sandbox network permission.
126
+ * This uses native fetch() which might be handled differently by sandboxes than WebSocket.
127
+ */
128
+ async httpWarmUp(url) {
129
+ try {
130
+ // Try to hit the Socket.IO endpoint with a simple HTTP GET
131
+ // This might trigger sandbox permission without the WebSocket complexity
132
+ const controller = new AbortController();
133
+ const timeoutId = setTimeout(() => controller.abort(), 1000);
134
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins -- fetch available in Node 18+
135
+ await fetch(`${url}/socket.io/?EIO=4&transport=polling`, {
136
+ method: 'GET',
137
+ signal: controller.signal,
138
+ }).catch(() => {
139
+ // Ignore errors - we just want to trigger the network request
140
+ });
141
+ clearTimeout(timeoutId);
142
+ return true;
143
+ }
144
+ catch {
145
+ // HTTP warm-up failed - not critical, continue with WebSocket
146
+ return false;
147
+ }
148
+ }
149
+ }
150
+ /**
151
+ * Singleton factory instance for convenience.
152
+ */
153
+ let factoryInstance;
154
+ /**
155
+ * Gets or creates the singleton factory.
156
+ */
157
+ export function getTransportClientFactory(config) {
158
+ if (!factoryInstance) {
159
+ factoryInstance = new TransportClientFactory(config);
160
+ }
161
+ return factoryInstance;
162
+ }
163
+ /**
164
+ * Creates a new factory instance.
165
+ */
166
+ export function createTransportClientFactory(config) {
167
+ return new TransportClientFactory(config);
168
+ }
@@ -0,0 +1,33 @@
1
+ import type { TransportClientConfig, TransportServerConfig } from '../../core/domain/transport/types.js';
2
+ import type { ITransportClient } from '../../core/interfaces/transport/i-transport-client.js';
3
+ import type { ITransportServer } from '../../core/interfaces/transport/i-transport-server.js';
4
+ /**
5
+ * Creates a transport server instance.
6
+ *
7
+ * @param config - Optional server configuration, defaults to constants
8
+ * @returns Transport server implementation
9
+ *
10
+ * @example
11
+ * // Use defaults
12
+ * const server = createTransportServer();
13
+ *
14
+ * @example
15
+ * // Custom config
16
+ * const server = createTransportServer({ pingIntervalMs: 2000 });
17
+ */
18
+ export declare function createTransportServer(config?: TransportServerConfig): ITransportServer;
19
+ /**
20
+ * Creates a transport client instance.
21
+ *
22
+ * @param config - Optional client configuration, defaults to constants
23
+ * @returns Transport client implementation
24
+ *
25
+ * @example
26
+ * // Use defaults
27
+ * const client = createTransportClient();
28
+ *
29
+ * @example
30
+ * // Custom config for tests
31
+ * const client = createTransportClient({ connectTimeoutMs: 1000 });
32
+ */
33
+ export declare function createTransportClient(config?: TransportClientConfig): ITransportClient;
@@ -0,0 +1,59 @@
1
+ import { TRANSPORT_CONNECT_TIMEOUT_MS, TRANSPORT_DEFAULT_TRANSPORTS, TRANSPORT_PING_INTERVAL_MS, TRANSPORT_PING_TIMEOUT_MS, TRANSPORT_RECONNECTION_ATTEMPTS, TRANSPORT_RECONNECTION_DELAY_MAX_MS, TRANSPORT_RECONNECTION_DELAY_MS, TRANSPORT_REQUEST_TIMEOUT_MS, TRANSPORT_ROOM_TIMEOUT_MS, } from '../../constants.js';
2
+ import { SocketIOTransportClient } from './socket-io-transport-client.js';
3
+ import { SocketIOTransportServer } from './socket-io-transport-server.js';
4
+ /**
5
+ * Default server configuration using constants.
6
+ */
7
+ const DEFAULT_SERVER_CONFIG = {
8
+ corsOrigin: '*',
9
+ pingIntervalMs: TRANSPORT_PING_INTERVAL_MS,
10
+ pingTimeoutMs: TRANSPORT_PING_TIMEOUT_MS,
11
+ };
12
+ /**
13
+ * Default client configuration using constants.
14
+ */
15
+ const DEFAULT_CLIENT_CONFIG = {
16
+ connectTimeoutMs: TRANSPORT_CONNECT_TIMEOUT_MS,
17
+ reconnectionAttempts: TRANSPORT_RECONNECTION_ATTEMPTS,
18
+ reconnectionDelayMaxMs: TRANSPORT_RECONNECTION_DELAY_MAX_MS,
19
+ reconnectionDelayMs: TRANSPORT_RECONNECTION_DELAY_MS,
20
+ requestTimeoutMs: TRANSPORT_REQUEST_TIMEOUT_MS,
21
+ roomTimeoutMs: TRANSPORT_ROOM_TIMEOUT_MS,
22
+ transports: TRANSPORT_DEFAULT_TRANSPORTS,
23
+ };
24
+ /**
25
+ * Creates a transport server instance.
26
+ *
27
+ * @param config - Optional server configuration, defaults to constants
28
+ * @returns Transport server implementation
29
+ *
30
+ * @example
31
+ * // Use defaults
32
+ * const server = createTransportServer();
33
+ *
34
+ * @example
35
+ * // Custom config
36
+ * const server = createTransportServer({ pingIntervalMs: 2000 });
37
+ */
38
+ export function createTransportServer(config) {
39
+ const mergedConfig = { ...DEFAULT_SERVER_CONFIG, ...config };
40
+ return new SocketIOTransportServer(mergedConfig);
41
+ }
42
+ /**
43
+ * Creates a transport client instance.
44
+ *
45
+ * @param config - Optional client configuration, defaults to constants
46
+ * @returns Transport client implementation
47
+ *
48
+ * @example
49
+ * // Use defaults
50
+ * const client = createTransportClient();
51
+ *
52
+ * @example
53
+ * // Custom config for tests
54
+ * const client = createTransportClient({ connectTimeoutMs: 1000 });
55
+ */
56
+ export function createTransportClient(config) {
57
+ const mergedConfig = { ...DEFAULT_CLIENT_CONFIG, ...config };
58
+ return new SocketIOTransportClient(mergedConfig);
59
+ }
@@ -1,66 +1,19 @@
1
- import type { IProjectConfigStore } from '../../core/interfaces/i-project-config-store.js';
2
1
  import type { ITerminal } from '../../core/interfaces/i-terminal.js';
3
- import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
4
- import type { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
5
2
  import type { CurateUseCaseRunOptions, ICurateUseCase } from '../../core/interfaces/usecase/i-curate-use-case.js';
3
+ import { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
4
+ import { type TransportClientFactory } from '../transport/transport-client-factory.js';
5
+ export type TransportClientFactoryCreator = () => TransportClientFactory;
6
6
  export interface CurateUseCaseOptions {
7
- projectConfigStore: IProjectConfigStore;
8
7
  terminal: ITerminal;
9
- tokenStore: ITokenStore;
10
8
  trackingService: ITrackingService;
9
+ /** Optional factory creator for dependency injection (defaults to createTransportClientFactory) */
10
+ transportClientFactoryCreator?: TransportClientFactoryCreator;
11
11
  }
12
12
  export declare class CurateUseCase implements ICurateUseCase {
13
- private readonly projectConfigStore;
14
13
  private readonly terminal;
15
- private readonly tokenStore;
16
14
  private readonly trackingService;
15
+ private readonly transportClientFactoryCreator;
17
16
  constructor(options: CurateUseCaseOptions);
18
- /**
19
- * Create topic folder with context.md file
20
- * @param targetPath - The parent path where the topic folder will be created
21
- * @param topicName - The name of the topic folder to create
22
- * @returns The path to the created context.md file
23
- */
24
- protected createTopicWithContextFile(targetPath: string, topicName: string): string;
25
- /**
26
- * Generate a unique session ID for the autonomous agent.
27
- * Uses crypto.randomUUID() for guaranteed uniqueness (122 bits of entropy).
28
- */
29
- protected generateSessionId(): string;
30
- /**
31
- * Navigate through the context tree using file selector
32
- * Returns the selected path relative to context-tree root
33
- */
34
- protected navigateContextTree(): Promise<null | string>;
35
- /**
36
- * Open a file in the default editor
37
- * @param filePath - The path to the file to open
38
- */
39
- protected openFile(filePath: string): Promise<void>;
40
- /**
41
- * Prompt user to enter topic name with validation
42
- * @param targetPath - The path where the topic folder will be created
43
- * @returns The topic name or null if cancelled
44
- */
45
- protected promptForTopicName(targetPath: string): Promise<null | string>;
46
- run(options: CurateUseCaseRunOptions): Promise<void>;
47
- /**
48
- * Handle workspace not initialized error
49
- */
50
- private handleWorkspaceError;
51
- /**
52
- * Process file paths from --files flag
53
- * @param filePaths - Array of file paths (relative or absolute)
54
- * @returns Formatted instructions for the agent to read the specified files, or undefined if validation fails
55
- */
56
- private processFileReferences;
57
- /**
58
- * Run in autonomous mode - push to queue for background processing
59
- */
60
- private runAutonomous;
61
- /**
62
- * Run in interactive mode with manual prompts
63
- */
64
- private runInteractive;
65
- private validateTopicName;
17
+ run({ context, files, verbose }: CurateUseCaseRunOptions): Promise<void>;
18
+ private handleConnectionError;
66
19
  }