byterover-cli 0.4.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +1 -9
  2. package/dist/commands/curate.d.ts +1 -3
  3. package/dist/commands/curate.js +14 -51
  4. package/dist/commands/main.d.ts +8 -0
  5. package/dist/commands/main.js +29 -8
  6. package/dist/commands/query.d.ts +1 -3
  7. package/dist/commands/query.js +8 -35
  8. package/dist/config/context-tree-domains.d.ts +5 -0
  9. package/dist/config/context-tree-domains.js +6 -1
  10. package/dist/config/environment.js +9 -9
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.js +18 -0
  13. package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
  14. package/dist/core/domain/cipher/agent/agent-info.js +143 -0
  15. package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
  16. package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
  17. package/dist/core/domain/cipher/agent/index.d.ts +4 -1
  18. package/dist/core/domain/cipher/agent/index.js +7 -1
  19. package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
  20. package/dist/core/domain/cipher/agent-events/types.js +11 -0
  21. package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
  22. package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
  23. package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
  24. package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
  25. package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
  26. package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
  27. package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
  28. package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
  29. package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
  30. package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
  31. package/dist/core/domain/cipher/llm/error-codes.js +51 -0
  32. package/dist/core/domain/cipher/llm/index.d.ts +9 -0
  33. package/dist/core/domain/cipher/llm/index.js +13 -0
  34. package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
  35. package/dist/core/domain/cipher/llm/registry.js +244 -0
  36. package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
  37. package/dist/core/domain/cipher/llm/schemas.js +151 -0
  38. package/dist/core/domain/cipher/llm/types.d.ts +121 -0
  39. package/dist/core/domain/cipher/llm/types.js +60 -0
  40. package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
  41. package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
  42. package/dist/core/domain/cipher/streaming/types.js +16 -0
  43. package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
  44. package/dist/core/domain/cipher/todos/types.d.ts +34 -0
  45. package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
  46. package/dist/core/domain/cipher/tools/constants.js +5 -2
  47. package/dist/core/domain/cipher/tools/types.d.ts +31 -0
  48. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  49. package/dist/core/domain/errors/connection-error.js +54 -0
  50. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  51. package/dist/core/domain/errors/core-process-error.js +43 -0
  52. package/dist/core/domain/errors/task-error.d.ts +64 -0
  53. package/dist/core/domain/errors/task-error.js +116 -0
  54. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  55. package/dist/core/domain/errors/transport-error.js +114 -0
  56. package/dist/core/domain/instance/index.d.ts +1 -0
  57. package/dist/core/domain/instance/index.js +1 -0
  58. package/dist/core/domain/instance/types.d.ts +57 -0
  59. package/dist/core/domain/instance/types.js +72 -0
  60. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  61. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  62. package/dist/core/domain/transport/index.d.ts +2 -0
  63. package/dist/core/domain/transport/index.js +2 -0
  64. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  65. package/dist/core/domain/transport/schemas.js +554 -0
  66. package/dist/core/domain/transport/types.d.ts +67 -0
  67. package/dist/core/domain/transport/types.js +7 -0
  68. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  69. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  70. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  71. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  72. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  73. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  74. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  75. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  76. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  77. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  79. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  80. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  81. package/dist/core/interfaces/cipher/index.js +11 -0
  82. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  83. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  84. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  85. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  86. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  87. package/dist/core/interfaces/cipher/message-types.js +6 -0
  88. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  89. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  90. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  91. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  92. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  93. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  94. package/dist/core/interfaces/executor/index.d.ts +2 -0
  95. package/dist/core/interfaces/executor/index.js +2 -0
  96. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  97. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  98. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  99. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  100. package/dist/core/interfaces/instance/index.d.ts +2 -0
  101. package/dist/core/interfaces/instance/index.js +2 -0
  102. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  103. package/dist/core/interfaces/noop-implementations.js +62 -0
  104. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  105. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  106. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  107. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  108. package/dist/core/interfaces/transport/index.d.ts +2 -0
  109. package/dist/core/interfaces/transport/index.js +2 -0
  110. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  111. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  112. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  113. package/dist/infra/cipher/agent/agent-error.js +79 -0
  114. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  115. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  116. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  117. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  118. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  119. package/dist/infra/cipher/agent/base-agent.js +240 -0
  120. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  121. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  122. package/dist/infra/cipher/agent/index.d.ts +22 -0
  123. package/dist/infra/cipher/agent/index.js +24 -0
  124. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  125. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  126. package/dist/infra/cipher/agent/types.d.ts +35 -0
  127. package/dist/infra/cipher/agent/types.js +1 -0
  128. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  129. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  130. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  131. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  132. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  133. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  134. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  135. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  136. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  137. package/dist/infra/cipher/consumer/index.js +2 -1
  138. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  139. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  140. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  141. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  142. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  143. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  144. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  145. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  146. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  147. package/dist/infra/cipher/interactive-loop.js +41 -33
  148. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  149. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  150. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  151. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  152. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  153. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  154. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  155. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  156. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  157. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  158. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  159. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  160. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  161. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  162. package/dist/infra/cipher/llm/context/utils.js +17 -4
  163. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  164. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  165. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  166. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  167. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  168. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  169. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  170. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  171. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  172. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  173. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  174. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  175. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  176. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  177. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  178. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  179. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  180. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  181. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  182. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  183. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  184. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  185. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  186. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  187. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  188. package/dist/infra/cipher/process/command-validator.js +75 -0
  189. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  190. package/dist/infra/cipher/process/path-utils.js +94 -0
  191. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  192. package/dist/infra/cipher/process/process-service.js +98 -17
  193. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  194. package/dist/infra/cipher/session/chat-session.js +163 -13
  195. package/dist/infra/cipher/session/index.d.ts +1 -0
  196. package/dist/infra/cipher/session/index.js +2 -0
  197. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  198. package/dist/infra/cipher/session/message-queue.js +90 -0
  199. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  200. package/dist/infra/cipher/session/session-manager.js +254 -7
  201. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  202. package/dist/infra/cipher/session/session-status.js +184 -0
  203. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  204. package/dist/infra/cipher/session/title-generator.js +31 -0
  205. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  206. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  207. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  208. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  209. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  210. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  211. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  212. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  213. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  214. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  215. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  216. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  217. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  218. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  219. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  220. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  221. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  222. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  223. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  224. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  225. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  226. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  227. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  228. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  229. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  230. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  231. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  232. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  233. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  234. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  235. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  236. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  237. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  238. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  239. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  240. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  241. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  242. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  243. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  244. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  245. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  246. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  247. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  249. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  250. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  251. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  252. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  253. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  254. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  255. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  256. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  257. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  258. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  259. package/dist/infra/cipher/tools/index.d.ts +1 -1
  260. package/dist/infra/cipher/tools/index.js +1 -1
  261. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  262. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  263. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  264. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  265. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  266. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  267. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  268. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  269. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  270. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  271. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  272. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  273. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  274. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  275. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  276. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  277. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  278. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  279. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  280. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  281. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  282. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  283. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  284. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  285. package/dist/infra/context-tree/path-utils.js +7 -0
  286. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  287. package/dist/infra/core/executors/curate-executor.js +123 -0
  288. package/dist/infra/core/executors/index.d.ts +2 -0
  289. package/dist/infra/core/executors/index.js +2 -0
  290. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  291. package/dist/infra/core/executors/query-executor.js +51 -0
  292. package/dist/infra/core/task-processor.d.ts +81 -0
  293. package/dist/infra/core/task-processor.js +115 -0
  294. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  295. package/dist/infra/instance/file-instance-discovery.js +84 -0
  296. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  297. package/dist/infra/instance/file-instance-manager.js +123 -0
  298. package/dist/infra/instance/index.d.ts +3 -0
  299. package/dist/infra/instance/index.js +3 -0
  300. package/dist/infra/instance/process-utils.d.ts +14 -0
  301. package/dist/infra/instance/process-utils.js +39 -0
  302. package/dist/infra/process/agent-worker.d.ts +20 -0
  303. package/dist/infra/process/agent-worker.js +602 -0
  304. package/dist/infra/process/index.d.ts +12 -0
  305. package/dist/infra/process/index.js +11 -0
  306. package/dist/infra/process/ipc-types.d.ts +55 -0
  307. package/dist/infra/process/ipc-types.js +12 -0
  308. package/dist/infra/process/process-manager.d.ts +154 -0
  309. package/dist/infra/process/process-manager.js +471 -0
  310. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  311. package/dist/infra/process/task-queue-manager.js +226 -0
  312. package/dist/infra/process/transport-handlers.d.ts +124 -0
  313. package/dist/infra/process/transport-handlers.js +348 -0
  314. package/dist/infra/process/transport-worker.d.ts +20 -0
  315. package/dist/infra/process/transport-worker.js +168 -0
  316. package/dist/infra/repl/commands/curate-command.js +0 -5
  317. package/dist/infra/repl/commands/query-command.js +0 -3
  318. package/dist/infra/repl/repl-startup.d.ts +4 -0
  319. package/dist/infra/repl/repl-startup.js +8 -1
  320. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  321. package/dist/infra/repl/transport-client-helper.js +96 -0
  322. package/dist/infra/transport/index.d.ts +4 -0
  323. package/dist/infra/transport/index.js +4 -0
  324. package/dist/infra/transport/port-utils.d.ts +42 -0
  325. package/dist/infra/transport/port-utils.js +84 -0
  326. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  327. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  328. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  329. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  330. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  331. package/dist/infra/transport/transport-client-factory.js +168 -0
  332. package/dist/infra/transport/transport-factory.d.ts +33 -0
  333. package/dist/infra/transport/transport-factory.js +59 -0
  334. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  335. package/dist/infra/usecase/curate-use-case.js +71 -262
  336. package/dist/infra/usecase/init-use-case.js +3 -2
  337. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  338. package/dist/infra/usecase/query-use-case.js +250 -326
  339. package/dist/infra/usecase/status-use-case.js +1 -1
  340. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  341. package/dist/resources/prompts/explore.yml +78 -0
  342. package/dist/resources/prompts/plan.yml +114 -0
  343. package/dist/resources/prompts/reflection.yml +1 -1
  344. package/dist/resources/prompts/system-prompt.yml +15 -8
  345. package/dist/resources/prompts/tool-outputs.yml +0 -5
  346. package/dist/resources/tools/bash_exec.txt +98 -0
  347. package/dist/resources/tools/bash_output.txt +40 -0
  348. package/dist/resources/tools/batch.txt +28 -0
  349. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  350. package/dist/resources/tools/curate.txt +22 -0
  351. package/dist/resources/tools/delete_memory.txt +1 -0
  352. package/dist/resources/tools/detect_domains.txt +11 -0
  353. package/dist/resources/tools/edit_file.txt +1 -0
  354. package/dist/resources/tools/edit_memory.txt +1 -0
  355. package/dist/resources/tools/glob_files.txt +20 -0
  356. package/dist/resources/tools/grep_content.txt +18 -0
  357. package/dist/resources/tools/kill_process.txt +16 -0
  358. package/dist/resources/tools/list_directory.txt +16 -0
  359. package/dist/resources/tools/list_memories.txt +1 -0
  360. package/dist/resources/tools/read_file.txt +31 -0
  361. package/dist/resources/tools/read_memory.txt +1 -0
  362. package/dist/resources/tools/read_todos.txt +17 -0
  363. package/dist/resources/tools/search_history.txt +1 -0
  364. package/dist/resources/tools/task.txt +23 -0
  365. package/dist/resources/tools/write_file.txt +1 -0
  366. package/dist/resources/tools/write_memory.txt +1 -0
  367. package/dist/resources/tools/write_todos.txt +29 -0
  368. package/dist/tui/app.js +9 -13
  369. package/dist/tui/components/command-details.d.ts +14 -0
  370. package/dist/tui/components/command-details.js +35 -0
  371. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  372. package/dist/tui/components/execution/execution-changes.js +19 -4
  373. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  374. package/dist/tui/components/execution/execution-content.js +26 -13
  375. package/dist/tui/components/execution/execution-input.js +3 -3
  376. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  377. package/dist/tui/components/execution/execution-progress.js +8 -6
  378. package/dist/tui/components/execution/log-item.d.ts +3 -4
  379. package/dist/tui/components/execution/log-item.js +2 -5
  380. package/dist/tui/components/footer.js +9 -4
  381. package/dist/tui/components/header.d.ts +3 -3
  382. package/dist/tui/components/header.js +5 -3
  383. package/dist/tui/components/index.d.ts +1 -0
  384. package/dist/tui/components/index.js +1 -0
  385. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  386. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  387. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  388. package/dist/tui/components/scrollable-list.js +12 -10
  389. package/dist/tui/components/suggestions.js +39 -41
  390. package/dist/tui/components/tab-bar.d.ts +2 -1
  391. package/dist/tui/components/tab-bar.js +3 -4
  392. package/dist/tui/constants.d.ts +0 -5
  393. package/dist/tui/constants.js +0 -5
  394. package/dist/tui/contexts/auth-context.js +9 -2
  395. package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
  396. package/dist/tui/contexts/index.d.ts +6 -1
  397. package/dist/tui/contexts/index.js +6 -1
  398. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  399. package/dist/tui/contexts/onboarding-context.js +9 -9
  400. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  401. package/dist/tui/contexts/tasks-context.js +218 -0
  402. package/dist/tui/contexts/transport-context.d.ts +29 -0
  403. package/dist/tui/contexts/transport-context.js +82 -0
  404. package/dist/tui/hooks/index.d.ts +10 -6
  405. package/dist/tui/hooks/index.js +7 -6
  406. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  407. package/dist/tui/hooks/use-activity-logs.js +87 -34
  408. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  409. package/dist/tui/hooks/use-auth-polling.js +104 -0
  410. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  411. package/dist/tui/hooks/use-slash-completion.js +1 -1
  412. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  413. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  414. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  415. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  416. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  417. package/dist/tui/hooks/use-ui-heights.js +88 -0
  418. package/dist/tui/providers/app-providers.js +2 -6
  419. package/dist/tui/types/commands.d.ts +0 -26
  420. package/dist/tui/types/index.d.ts +1 -1
  421. package/dist/tui/types/ui.d.ts +9 -4
  422. package/dist/tui/utils/line.d.ts +11 -0
  423. package/dist/tui/utils/line.js +16 -0
  424. package/dist/tui/utils/log.d.ts +27 -0
  425. package/dist/tui/utils/log.js +114 -0
  426. package/dist/tui/views/command-view.d.ts +7 -0
  427. package/dist/tui/views/command-view.js +103 -80
  428. package/dist/tui/views/login-view.js +7 -4
  429. package/dist/tui/views/logs-view.d.ts +13 -0
  430. package/dist/tui/views/logs-view.js +27 -52
  431. package/dist/utils/connection-error-handler.d.ts +16 -0
  432. package/dist/utils/connection-error-handler.js +49 -0
  433. package/dist/utils/crash-log.d.ts +14 -0
  434. package/dist/utils/crash-log.js +19 -0
  435. package/dist/utils/file-helpers.d.ts +14 -0
  436. package/dist/utils/file-helpers.js +21 -0
  437. package/dist/utils/global-logs-path.d.ts +11 -0
  438. package/dist/utils/global-logs-path.js +37 -0
  439. package/dist/utils/process-logger.d.ts +53 -0
  440. package/dist/utils/process-logger.js +253 -0
  441. package/dist/utils/sandbox-detector.d.ts +31 -0
  442. package/dist/utils/sandbox-detector.js +122 -0
  443. package/oclif.manifest.json +10 -198
  444. package/package.json +5 -1
  445. package/dist/commands/cipher-agent/run.d.ts +0 -142
  446. package/dist/commands/cipher-agent/run.js +0 -555
  447. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  448. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  449. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  450. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  451. package/dist/commands/foo.d.ts +0 -14
  452. package/dist/commands/foo.js +0 -66
  453. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  454. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  455. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  456. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  457. package/dist/infra/cipher/cipher-agent.js +0 -317
  458. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  459. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  460. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  461. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  462. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  463. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  464. package/dist/tui/contexts/consumer.d.ts +0 -31
  465. package/dist/tui/contexts/consumer.js +0 -56
  466. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  467. package/dist/tui/hooks/use-consumer.js +0 -50
  468. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  469. package/dist/tui/hooks/use-queue-polling.js +0 -90
  470. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  471. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  472. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  473. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  474. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Transport Handlers - Message routing in Transport Process.
3
+ *
4
+ * Architecture v0.5.0:
5
+ * - Routes messages between clients (TUI, external CLIs) and Agent
6
+ * - Agent is a special client that registers via 'agent:register'
7
+ * - Client UseCase generates taskId, Transport validates and routes
8
+ * - NO TaskProcessor, NO business logic (just routing)
9
+ *
10
+ * Event naming convention:
11
+ * - task:* events are Transport-generated (ack, created, started, completed, error)
12
+ * - llmservice:* events are forwarded from Agent with ORIGINAL names
13
+ *
14
+ * Message flows:
15
+ * 1. Client → Transport: task:create {taskId, type, content}
16
+ * Transport → Agent: task:execute {taskId, type, content, clientId}
17
+ * Transport → Client: task:ack {taskId}
18
+ * Transport → broadcast-room: task:created {taskId, type, content, files?}
19
+ *
20
+ * 2. Agent → Transport: llmservice:response {taskId, content}
21
+ * Transport → Client (direct): llmservice:response
22
+ * Transport → broadcast-room: llmservice:response (for TUI monitoring)
23
+ *
24
+ * 3. Agent → Transport: task:completed {taskId}
25
+ * Transport → Client (direct): task:completed
26
+ * Transport → broadcast-room: task:completed (for TUI monitoring)
27
+ *
28
+ * Special events:
29
+ * - agent:register: Agent identifies itself
30
+ * - agent:connected / agent:disconnected: Broadcast to all clients
31
+ * - broadcast-room: TUI joins this room to monitor all events
32
+ */
33
+ import { AgentDisconnectedError, AgentNotAvailableError, serializeTaskError, } from '../../core/domain/errors/task-error.js';
34
+ import { LlmEventNames, TransportAgentEventNames, TransportLlmEventList, TransportTaskEventNames, } from '../../core/domain/transport/schemas.js';
35
+ import { eventLog, transportLog } from '../../utils/process-logger.js';
36
+ // All message types are imported from core/domain/transport/schemas.ts
37
+ // - TaskExecute: Transport → Agent (command)
38
+ // - TaskStartedEvent, TaskCompletedEvent, TaskErrorEvent: Agent → Transport (task lifecycle events)
39
+ // - LlmThinkingEvent, LlmChunkEvent, LlmResponseEvent, etc: Agent → Transport (LLM events)
40
+ // ============================================================================
41
+ // Transport Handlers
42
+ // ============================================================================
43
+ /**
44
+ * TransportHandlers - Routes messages between clients and Agent.
45
+ *
46
+ * This class is the "brain" of the Transport Process.
47
+ * It knows which client is the Agent and routes messages accordingly.
48
+ */
49
+ export class TransportHandlers {
50
+ /** The Agent's client ID (set when Agent registers) */
51
+ agentClientId;
52
+ /** Track active tasks */
53
+ tasks = new Map();
54
+ /** Transport server reference */
55
+ transport;
56
+ constructor(transport) {
57
+ this.transport = transport;
58
+ }
59
+ /**
60
+ * Cleanup handlers.
61
+ */
62
+ cleanup() {
63
+ this.tasks.clear();
64
+ this.agentClientId = undefined;
65
+ }
66
+ /**
67
+ * Setup all message handlers.
68
+ */
69
+ setup() {
70
+ this.setupConnectionHandlers();
71
+ this.setupAgentHandlers();
72
+ this.setupClientHandlers();
73
+ this.setupAgentControlHandlers();
74
+ }
75
+ /**
76
+ * Handle Agent registration.
77
+ * Agent connects as Socket.IO client and sends 'agent:register'.
78
+ */
79
+ handleAgentRegister(clientId) {
80
+ transportLog(`Agent registered: ${clientId}`);
81
+ this.agentClientId = clientId;
82
+ // Broadcast to all clients that Agent is online
83
+ this.transport.broadcast(TransportAgentEventNames.CONNECTED, {});
84
+ }
85
+ /**
86
+ * Handle task:cancel request from client.
87
+ * Returns success:false if task not found or Agent not available.
88
+ * Emits task:cancelled terminal event when cancelled locally (no Agent).
89
+ */
90
+ handleTaskCancel(data, _clientId) {
91
+ const { taskId } = data;
92
+ transportLog(`Task cancel requested: ${taskId}`);
93
+ // Check if task exists
94
+ const task = this.tasks.get(taskId);
95
+ if (!task) {
96
+ return { error: 'Task not found', success: false };
97
+ }
98
+ // If Agent connected, forward cancel request
99
+ if (this.agentClientId) {
100
+ this.transport.sendTo(this.agentClientId, TransportTaskEventNames.CANCEL, { taskId });
101
+ return { success: true };
102
+ }
103
+ // No Agent - cancel task locally and emit terminal event
104
+ transportLog(`No Agent connected, cancelling task locally: ${taskId}`);
105
+ this.transport.sendTo(task.clientId, TransportTaskEventNames.CANCELLED, { taskId });
106
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.CANCELLED, { taskId });
107
+ this.tasks.delete(taskId);
108
+ return { success: true };
109
+ }
110
+ /**
111
+ * Handle task:cancelled from Agent.
112
+ * Terminal event: task was cancelled before completion.
113
+ * Route to task owner + broadcast-room, then cleanup.
114
+ */
115
+ handleTaskCancelled(data) {
116
+ const { taskId } = data;
117
+ const task = this.tasks.get(taskId);
118
+ transportLog(`Task cancelled: ${taskId}`);
119
+ if (task) {
120
+ this.transport.sendTo(task.clientId, TransportTaskEventNames.CANCELLED, { taskId });
121
+ }
122
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.CANCELLED, { taskId });
123
+ this.tasks.delete(taskId);
124
+ }
125
+ /**
126
+ * Handle task:completed from Agent.
127
+ * Route directly to task owner + broadcast-room for monitoring.
128
+ */
129
+ handleTaskCompleted(data) {
130
+ const { result, taskId } = data;
131
+ const task = this.tasks.get(taskId);
132
+ transportLog(`Task completed: ${taskId}`);
133
+ if (task) {
134
+ this.transport.sendTo(task.clientId, TransportTaskEventNames.COMPLETED, { result, taskId });
135
+ }
136
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.COMPLETED, { result, taskId });
137
+ this.tasks.delete(taskId);
138
+ }
139
+ /**
140
+ * Handle task:create request from client.
141
+ * Validate taskId from client, add to tracking, forward to Agent.
142
+ */
143
+ handleTaskCreate(data, clientId) {
144
+ const { taskId } = data;
145
+ // Duplicate check - reject if taskId already exists
146
+ if (this.tasks.has(taskId)) {
147
+ throw new Error(`Task ${taskId} already exists`);
148
+ }
149
+ transportLog(`Task accepted: ${taskId} (type=${data.type}, client=${clientId})`);
150
+ // Track task (clientId used for direct messaging)
151
+ this.tasks.set(taskId, {
152
+ clientId,
153
+ content: data.content,
154
+ createdAt: Date.now(),
155
+ ...(data.files?.length ? { files: data.files } : {}),
156
+ taskId,
157
+ type: data.type,
158
+ });
159
+ // Send ack immediately (fast feedback)
160
+ this.transport.sendTo(clientId, TransportTaskEventNames.ACK, { taskId });
161
+ // Broadcast task:created to broadcast-room for TUI monitoring
162
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.CREATED, {
163
+ content: data.content,
164
+ ...(data.files?.length ? { files: data.files } : {}),
165
+ taskId,
166
+ type: data.type,
167
+ });
168
+ // Forward to Agent
169
+ if (this.agentClientId) {
170
+ const executeMsg = {
171
+ clientId,
172
+ content: data.content,
173
+ ...(data.files?.length ? { files: data.files } : {}),
174
+ taskId,
175
+ type: data.type,
176
+ };
177
+ this.transport.sendTo(this.agentClientId, TransportTaskEventNames.EXECUTE, executeMsg);
178
+ }
179
+ else {
180
+ // No Agent connected - send error immediately to client AND broadcast-room, then cleanup
181
+ transportLog(`No Agent connected, cannot process task ${taskId}`);
182
+ const error = serializeTaskError(new AgentNotAvailableError());
183
+ this.transport.sendTo(clientId, TransportTaskEventNames.ERROR, { error, taskId });
184
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.ERROR, { error, taskId });
185
+ this.tasks.delete(taskId);
186
+ }
187
+ return { taskId };
188
+ }
189
+ /**
190
+ * Handle task:error from Agent.
191
+ * Route directly to task owner + broadcast-room for monitoring.
192
+ */
193
+ handleTaskError(data) {
194
+ const { error, taskId } = data;
195
+ const task = this.tasks.get(taskId);
196
+ transportLog(`Task error: ${taskId} - [${error.code}] ${error.message}`);
197
+ if (task) {
198
+ this.transport.sendTo(task.clientId, TransportTaskEventNames.ERROR, { error, taskId });
199
+ }
200
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.ERROR, { error, taskId });
201
+ this.tasks.delete(taskId);
202
+ }
203
+ /**
204
+ * Handle task:started from Agent.
205
+ * Route directly to task owner + broadcast-room for monitoring.
206
+ */
207
+ handleTaskStarted(data) {
208
+ const { taskId } = data;
209
+ const task = this.tasks.get(taskId);
210
+ if (task) {
211
+ this.transport.sendTo(task.clientId, TransportTaskEventNames.STARTED, { taskId });
212
+ // Broadcast with task info for monitoring
213
+ // Note: fileReferenceInstructions is generated by UseCase during execution,
214
+ // so it's not available at task:started time. It's saved to DB instead.
215
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.STARTED, {
216
+ content: task.content,
217
+ ...(task.files?.length ? { files: task.files } : {}),
218
+ taskId,
219
+ type: task.type,
220
+ });
221
+ }
222
+ else {
223
+ // Fallback if task not found
224
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.STARTED, { taskId });
225
+ }
226
+ }
227
+ registerLlmEvent(eventName) {
228
+ this.transport.onRequest(eventName, (data) => {
229
+ this.routeLlmEvent(eventName, data);
230
+ });
231
+ }
232
+ /**
233
+ * Generic handler for routing LLM events from Agent to clients.
234
+ * Routes directly to task owner + broadcast-room for monitoring.
235
+ *
236
+ * All llmservice:* events follow the same routing pattern:
237
+ * 1. Extract taskId from payload
238
+ * 2. Check if task is still active (not completed/cancelled/errored)
239
+ * 3. Send to task owner + broadcast-room if active
240
+ * 4. Drop silently if task already ended (prevents events-after-terminal)
241
+ */
242
+ routeLlmEvent(eventName, data) {
243
+ const { taskId, ...rest } = data;
244
+ const task = this.tasks.get(taskId);
245
+ // Guard: Drop events for tasks that have already ended (terminal state reached)
246
+ // This prevents "ghost events" arriving after task:completed/cancelled/error
247
+ if (!task) {
248
+ return;
249
+ }
250
+ this.transport.sendTo(task.clientId, eventName, { taskId, ...rest });
251
+ this.transport.broadcastTo('broadcast-room', eventName, { taskId, ...rest });
252
+ }
253
+ /**
254
+ * Setup agent control handlers.
255
+ * These handle commands to control the Agent process (restart, etc.)
256
+ */
257
+ setupAgentControlHandlers() {
258
+ // agent:restart - Client requests Agent to reinitialize
259
+ this.transport.onRequest(TransportAgentEventNames.RESTART, (data, clientId) => {
260
+ transportLog(`Agent restart requested by ${clientId}: ${data.reason ?? 'no reason'}`);
261
+ if (!this.agentClientId) {
262
+ return { error: 'Agent not connected', success: false };
263
+ }
264
+ // Forward restart command to Agent
265
+ this.transport.sendTo(this.agentClientId, TransportAgentEventNames.RESTART, { reason: data.reason });
266
+ // Broadcast and log event
267
+ eventLog('agent:restarting', { reason: data.reason });
268
+ this.transport.broadcast(TransportAgentEventNames.RESTARTING, { reason: data.reason });
269
+ return { success: true };
270
+ });
271
+ // agent:restarted - Agent reports restart result
272
+ this.transport.onRequest(TransportAgentEventNames.RESTARTED, (data) => {
273
+ if (data.success) {
274
+ transportLog('Agent restarted successfully');
275
+ eventLog('agent:restarted', { success: true });
276
+ this.transport.broadcast(TransportAgentEventNames.RESTARTED, { success: true });
277
+ }
278
+ else {
279
+ transportLog(`Agent restart failed: ${data.error}`);
280
+ eventLog('agent:restarted', { error: data.error, success: false });
281
+ this.transport.broadcast(TransportAgentEventNames.RESTARTED, { error: data.error, success: false });
282
+ }
283
+ });
284
+ }
285
+ /**
286
+ * Setup Agent-related handlers.
287
+ * These handle events FROM the Agent.
288
+ */
289
+ setupAgentHandlers() {
290
+ // Agent registration
291
+ this.transport.onRequest(TransportAgentEventNames.REGISTER, (_data, clientId) => {
292
+ this.handleAgentRegister(clientId);
293
+ return { success: true };
294
+ });
295
+ // Task lifecycle events (Transport-generated names)
296
+ this.transport.onRequest(TransportTaskEventNames.STARTED, (data) => {
297
+ this.handleTaskStarted(data);
298
+ });
299
+ this.transport.onRequest(TransportTaskEventNames.COMPLETED, (data) => {
300
+ this.handleTaskCompleted(data);
301
+ });
302
+ this.transport.onRequest(TransportTaskEventNames.ERROR, (data) => {
303
+ this.handleTaskError(data);
304
+ });
305
+ this.transport.onRequest(TransportTaskEventNames.CANCELLED, (data) => {
306
+ this.handleTaskCancelled(data);
307
+ });
308
+ // LLM events - explicit list + typed payload map
309
+ for (const eventName of TransportLlmEventList) {
310
+ this.registerLlmEvent(eventName);
311
+ }
312
+ }
313
+ /**
314
+ * Setup client-related handlers.
315
+ * These handle events FROM clients (TUI, external CLIs).
316
+ */
317
+ setupClientHandlers() {
318
+ // Task creation from clients
319
+ this.transport.onRequest(TransportTaskEventNames.CREATE, (data, clientId) => this.handleTaskCreate(data, clientId));
320
+ // Task cancellation from clients
321
+ this.transport.onRequest(TransportTaskEventNames.CANCEL, (data, clientId) => this.handleTaskCancel(data, clientId));
322
+ }
323
+ /**
324
+ * Setup connection event handlers.
325
+ */
326
+ setupConnectionHandlers() {
327
+ this.transport.onConnection((clientId) => {
328
+ transportLog(`Client connected: ${clientId}`);
329
+ });
330
+ this.transport.onDisconnection((clientId) => {
331
+ transportLog(`Client disconnected: ${clientId}`);
332
+ // Check if Agent disconnected
333
+ if (clientId === this.agentClientId) {
334
+ transportLog('Agent disconnected!');
335
+ this.agentClientId = undefined;
336
+ // Broadcast to all clients
337
+ this.transport.broadcast(TransportAgentEventNames.DISCONNECTED, {});
338
+ // Fail all pending tasks - send to client AND broadcast-room for TUI monitoring
339
+ const error = serializeTaskError(new AgentDisconnectedError());
340
+ for (const [taskId, task] of this.tasks) {
341
+ this.transport.sendTo(task.clientId, TransportTaskEventNames.ERROR, { error, taskId });
342
+ this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.ERROR, { error, taskId });
343
+ }
344
+ this.tasks.clear();
345
+ }
346
+ });
347
+ }
348
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Transport Worker - Entry point for Transport Process.
3
+ *
4
+ * Architecture v0.5.0:
5
+ * - ONLY runs Socket.IO server (message hub)
6
+ * - Routes messages between clients (TUI, external CLIs) and Agent
7
+ * - NO TaskProcessor, NO CipherAgent, NO UseCases
8
+ * - Detects Agent connect/disconnect → broadcasts to clients
9
+ *
10
+ * IPC messages:
11
+ * - Receives: 'ping', 'shutdown'
12
+ * - Sends: 'ready' (with port), 'pong', 'stopped', 'error'
13
+ *
14
+ * Socket.IO events:
15
+ * - Client → Transport: task:create, task:cancel, session:*
16
+ * - Transport → Agent: task:create, task:cancel, shutdown
17
+ * - Agent → Transport: task:started, task:chunk, task:completed, task:error, task:toolCall, task:toolResult
18
+ * - Transport → Client: task:ack, task:started, task:chunk, task:completed, task:error, agent:connected, agent:disconnected
19
+ */
20
+ export {};
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Transport Worker - Entry point for Transport Process.
3
+ *
4
+ * Architecture v0.5.0:
5
+ * - ONLY runs Socket.IO server (message hub)
6
+ * - Routes messages between clients (TUI, external CLIs) and Agent
7
+ * - NO TaskProcessor, NO CipherAgent, NO UseCases
8
+ * - Detects Agent connect/disconnect → broadcasts to clients
9
+ *
10
+ * IPC messages:
11
+ * - Receives: 'ping', 'shutdown'
12
+ * - Sends: 'ready' (with port), 'pong', 'stopped', 'error'
13
+ *
14
+ * Socket.IO events:
15
+ * - Client → Transport: task:create, task:cancel, session:*
16
+ * - Transport → Agent: task:create, task:cancel, shutdown
17
+ * - Agent → Transport: task:started, task:chunk, task:completed, task:error, task:toolCall, task:toolResult
18
+ * - Transport → Client: task:ack, task:started, task:chunk, task:completed, task:error, agent:connected, agent:disconnected
19
+ */
20
+ import { existsSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { BRV_DIR, INSTANCE_FILE } from '../../constants.js';
23
+ import { transportLog } from '../../utils/process-logger.js';
24
+ import { FileInstanceManager } from '../instance/file-instance-manager.js';
25
+ import { findAvailablePort } from '../transport/port-utils.js';
26
+ import { createTransportServer } from '../transport/transport-factory.js';
27
+ import { TransportHandlers } from './transport-handlers.js';
28
+ // IPC types imported from ./ipc-types.ts
29
+ function sendToParent(message) {
30
+ process.send?.(message);
31
+ }
32
+ // ============================================================================
33
+ // Transport Process
34
+ // ============================================================================
35
+ let transportServer;
36
+ let transportHandlers;
37
+ let instancePollingInterval;
38
+ const instanceManager = new FileInstanceManager();
39
+ /** Polling interval in milliseconds */
40
+ const INSTANCE_POLLING_INTERVAL_MS = 2000;
41
+ /**
42
+ * Setup polling to detect instance.json deletion and recreate it.
43
+ *
44
+ * Why polling instead of fs.watch()?
45
+ * - fs.watch() on .brv/ directory silently stops when the directory is deleted
46
+ * - /init deletes entire .brv/ folder, causing watcher to become a dead listener
47
+ * - Polling is more reliable for this self-healing use case
48
+ */
49
+ function setupInstancePolling(projectRoot, port) {
50
+ const instancePath = join(projectRoot, BRV_DIR, INSTANCE_FILE);
51
+ instancePollingInterval = setInterval(async () => {
52
+ // Check if instance.json exists
53
+ if (!existsSync(instancePath)) {
54
+ // Check if .brv directory exists (init might have recreated it)
55
+ const brvDir = join(projectRoot, BRV_DIR);
56
+ if (existsSync(brvDir)) {
57
+ // .brv exists but instance.json doesn't - recreate it
58
+ try {
59
+ const result = await instanceManager.acquire(projectRoot, port);
60
+ if (result.acquired) {
61
+ transportLog('instance.json was deleted - recreated successfully');
62
+ }
63
+ }
64
+ catch (error) {
65
+ transportLog(`Could not recreate instance.json: ${error}`);
66
+ }
67
+ }
68
+ // If .brv doesn't exist, wait for /init to create it
69
+ }
70
+ }, INSTANCE_POLLING_INTERVAL_MS);
71
+ transportLog('Instance self-healing polling started');
72
+ }
73
+ /**
74
+ * Stop the instance polling.
75
+ */
76
+ function stopInstancePolling() {
77
+ if (instancePollingInterval) {
78
+ clearInterval(instancePollingInterval);
79
+ instancePollingInterval = undefined;
80
+ }
81
+ }
82
+ async function startTransport() {
83
+ // Create Socket.IO server
84
+ transportServer = createTransportServer();
85
+ // Find available port
86
+ const port = await findAvailablePort();
87
+ // Start server
88
+ await transportServer.start(port);
89
+ // Write instance.json for discovery by clients (TUI, external CLIs)
90
+ const projectRoot = process.cwd();
91
+ const acquireResult = await instanceManager.acquire(projectRoot, port);
92
+ if (!acquireResult.acquired) {
93
+ throw new Error('brv is already running in this directory. ' +
94
+ 'Please close the other instance first, or use a different terminal.');
95
+ }
96
+ // Setup message handlers (routing between clients and Agent)
97
+ transportHandlers = new TransportHandlers(transportServer);
98
+ transportHandlers.setup();
99
+ // Setup polling to recreate instance.json if deleted
100
+ setupInstancePolling(projectRoot, port);
101
+ transportLog(`Socket.IO server started on port ${port}`);
102
+ transportLog(`Instance registered at ${projectRoot}/.brv/instance.json`);
103
+ return port;
104
+ }
105
+ async function stopTransport() {
106
+ // Stop instance polling first
107
+ stopInstancePolling();
108
+ // Release instance.json
109
+ const projectRoot = process.cwd();
110
+ await instanceManager.release(projectRoot);
111
+ if (transportHandlers) {
112
+ transportHandlers.cleanup();
113
+ transportHandlers = undefined;
114
+ }
115
+ if (transportServer) {
116
+ await transportServer.stop();
117
+ transportServer = undefined;
118
+ }
119
+ transportLog('Socket.IO server stopped');
120
+ }
121
+ // ============================================================================
122
+ // Worker Entry Point
123
+ // ============================================================================
124
+ async function runWorker() {
125
+ try {
126
+ const port = await startTransport();
127
+ sendToParent({ port, type: 'ready' });
128
+ }
129
+ catch (error) {
130
+ const message = error instanceof Error ? error.message : String(error);
131
+ transportLog(`Failed to start: ${message}`);
132
+ sendToParent({ error: message, type: 'error' });
133
+ // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
134
+ process.exit(1);
135
+ }
136
+ // IPC message handler
137
+ process.on('message', async (msg) => {
138
+ if (msg.type === 'ping') {
139
+ sendToParent({ type: 'pong' });
140
+ }
141
+ else if (msg.type === 'shutdown') {
142
+ await stopTransport();
143
+ sendToParent({ type: 'stopped' });
144
+ // eslint-disable-next-line n/no-process-exit
145
+ process.exit(0);
146
+ }
147
+ });
148
+ // Signal handlers
149
+ const cleanup = async () => {
150
+ await stopTransport();
151
+ // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
152
+ process.exit(0);
153
+ };
154
+ process.once('SIGTERM', cleanup);
155
+ process.once('SIGINT', cleanup);
156
+ process.once('disconnect', cleanup);
157
+ }
158
+ // ============================================================================
159
+ // Run
160
+ // ============================================================================
161
+ try {
162
+ await runWorker();
163
+ }
164
+ catch (error) {
165
+ transportLog(`Fatal error: ${error}`);
166
+ // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
167
+ process.exit(1);
168
+ }
@@ -1,7 +1,6 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { isDevelopment } from '../../../config/environment.js';
3
3
  import { CommandKind } from '../../../tui/types.js';
4
- import { ProjectConfigStore } from '../../config/file-config-store.js';
5
4
  import { FileGlobalConfigStore } from "../../storage/file-global-config-store.js";
6
5
  import { KeychainTokenStore } from '../../storage/keychain-token-store.js';
7
6
  import { ReplTerminal } from '../../terminal/repl-terminal.js';
@@ -42,17 +41,13 @@ export const curateCommand = {
42
41
  const tokenStore = new KeychainTokenStore();
43
42
  const globalConfigStore = new FileGlobalConfigStore();
44
43
  const useCase = new CurateUseCase({
45
- projectConfigStore: new ProjectConfigStore(),
46
44
  terminal,
47
- tokenStore,
48
45
  trackingService: new MixpanelTrackingService({ globalConfigStore, tokenStore }),
49
46
  });
50
47
  // Run the use case - mode determined by whether context is provided
51
48
  await useCase.run({
52
- apiKey: flags.apiKey,
53
49
  context: contextText,
54
50
  files: files.length > 0 ? files : undefined,
55
- model: flags.model,
56
51
  verbose: flags.verbose,
57
52
  });
58
53
  onMessage({
@@ -1,6 +1,5 @@
1
1
  import { isDevelopment } from '../../../config/environment.js';
2
2
  import { CommandKind } from '../../../tui/types.js';
3
- import { ProjectConfigStore } from '../../config/file-config-store.js';
4
3
  import { FileGlobalConfigStore } from "../../storage/file-global-config-store.js";
5
4
  import { KeychainTokenStore } from '../../storage/keychain-token-store.js';
6
5
  import { ReplTerminal } from '../../terminal/repl-terminal.js';
@@ -35,9 +34,7 @@ export const queryCommand = {
35
34
  const tokenStore = new KeychainTokenStore();
36
35
  const globalConfigStore = new FileGlobalConfigStore();
37
36
  const useCase = new QueryUseCase({
38
- projectConfigStore: new ProjectConfigStore(),
39
37
  terminal,
40
- tokenStore,
41
38
  trackingService: new MixpanelTrackingService({ globalConfigStore, tokenStore }),
42
39
  });
43
40
  await useCase.run({
@@ -4,6 +4,10 @@ import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
4
4
  import type { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
5
5
  /**
6
6
  * Options for starting the REPL
7
+ *
8
+ * Architecture v0.5.0:
9
+ * - TUI discovers Transport via TransportClientFactory (same as external CLIs)
10
+ * - TUI is a Socket.IO client, Transport is the only server
7
11
  */
8
12
  export interface ReplOptions {
9
13
  onboardingPreferenceStore: IOnboardingPreferenceStore;
@@ -3,11 +3,16 @@ import { render } from 'ink';
3
3
  import { App } from '../../tui/app.js';
4
4
  import { AppProviders } from '../../tui/providers/app-providers.js';
5
5
  import { stopQueuePollingService } from '../cipher/consumer/queue-polling-service.js';
6
+ import { connectTransportClient, disconnectTransportClient } from './transport-client-helper.js';
7
+ /** Broadcast client - joins broadcast-room to monitor all events */
8
+ let transportBroadcastClient = null;
6
9
  /**
7
10
  * Start the ByteRover REPL
8
11
  */
9
12
  export async function startRepl(options) {
10
13
  const { onboardingPreferenceStore, projectConfigStore, tokenStore, trackingService, version } = options;
14
+ // Connect broadcast client to monitor all events
15
+ transportBroadcastClient = await connectTransportClient();
11
16
  // Check initial auth state
12
17
  const authToken = await tokenStore.load();
13
18
  const isAuthorized = authToken !== undefined && authToken.isValid();
@@ -20,9 +25,11 @@ export async function startRepl(options) {
20
25
  }
21
26
  }
22
27
  await trackingService.track('repl', { status: 'started' });
23
- // Render the App with providers
24
28
  const { waitUntilExit } = render(_jsx(AppProviders, { initialAuthToken: isAuthorized ? authToken : undefined, initialBrvConfig: brvConfig, onboardingPreferenceStore: onboardingPreferenceStore, projectConfigStore: projectConfigStore, tokenStore: tokenStore, trackingService: trackingService, version: version, children: _jsx(App, {}) }));
25
29
  await waitUntilExit();
30
+ // Cleanup
31
+ await disconnectTransportClient(transportBroadcastClient);
32
+ transportBroadcastClient = null;
26
33
  stopQueuePollingService();
27
34
  await trackingService.track('repl', { status: 'finished' });
28
35
  }
@@ -0,0 +1,9 @@
1
+ import type { ITransportClient } from '../../core/interfaces/transport/i-transport-client.js';
2
+ /**
3
+ * Connect to Transport and join TUI room for event monitoring.
4
+ */
5
+ export declare function connectTransportClient(): Promise<ITransportClient | null>;
6
+ /**
7
+ * Disconnect transport client.
8
+ */
9
+ export declare function disconnectTransportClient(client: ITransportClient | null): Promise<void>;