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,154 @@
1
+ /**
2
+ * Process Manager - Manages the lifecycle of Transport and Agent processes.
3
+ *
4
+ * Architecture v0.5.0:
5
+ * - Spawns 2 separate child processes: Transport and Agent
6
+ * - Transport Process: Socket.IO server only (message hub)
7
+ * - Agent Process: TaskProcessor + UseCases + CipherAgent
8
+ * - ALL task communication via Socket.IO (NO IPC for tasks)
9
+ * - IPC only for process lifecycle: ready, shutdown, stopped
10
+ *
11
+ * Startup sequence:
12
+ * 1. fork('transport-worker.js')
13
+ * 2. Wait for Transport 'ready' with port
14
+ * 3. fork('agent-worker.js') with TRANSPORT_PORT env
15
+ * 4. Wait for Agent 'ready'
16
+ *
17
+ * Shutdown sequence:
18
+ * 1. Send 'shutdown' to Agent via IPC
19
+ * 2. Wait for Agent to exit
20
+ * 3. Send 'shutdown' to Transport via IPC
21
+ * 4. Wait for Transport to exit
22
+ */
23
+ import { type ChildProcess } from 'node:child_process';
24
+ /**
25
+ * Process state tracking.
26
+ */
27
+ export type ProcessState = {
28
+ /** Agent child process */
29
+ agentProcess?: ChildProcess;
30
+ /** Whether Agent is connected */
31
+ agentReady: boolean;
32
+ /** Transport port (from Transport Process) */
33
+ port?: number;
34
+ /** Whether system is running */
35
+ running: boolean;
36
+ /** Transport child process */
37
+ transportProcess?: ChildProcess;
38
+ /** Whether Transport is ready */
39
+ transportReady: boolean;
40
+ };
41
+ /**
42
+ * ProcessManager configuration.
43
+ */
44
+ export type ProcessManagerConfig = {
45
+ /** Timeout for process shutdown (ms) */
46
+ shutdownTimeoutMs?: number;
47
+ /** Timeout for process startup (ms) */
48
+ startupTimeoutMs?: number;
49
+ };
50
+ /**
51
+ * ProcessManager - Spawns and manages Transport and Agent processes.
52
+ *
53
+ * Architecture v0.5.0:
54
+ * - Single source of truth for child process lifecycle
55
+ * - Transport spawned first (needs port)
56
+ * - Agent spawned second (needs transport port)
57
+ * - Crash recovery: respawn on exit
58
+ */
59
+ export declare class ProcessManager {
60
+ private healthCheckInterval?;
61
+ private lastHealthCheckTime;
62
+ private readonly shutdownTimeoutMs;
63
+ private readonly startupTimeoutMs;
64
+ private state;
65
+ constructor(config?: ProcessManagerConfig);
66
+ /**
67
+ * Get current state.
68
+ */
69
+ getState(): Readonly<ProcessState>;
70
+ /**
71
+ * Get transport port (for TUI to connect).
72
+ */
73
+ getTransportPort(): number | undefined;
74
+ /**
75
+ * Check if system is fully running.
76
+ */
77
+ isRunning(): boolean;
78
+ /**
79
+ * Start Transport and Agent processes.
80
+ *
81
+ * Sequence:
82
+ * 1. Start Transport Process
83
+ * 2. Wait for Transport 'ready' with port
84
+ * 3. Start Agent Process with TRANSPORT_PORT env
85
+ * 4. Wait for Agent 'ready'
86
+ *
87
+ * @throws Error if startup fails or times out
88
+ */
89
+ start(): Promise<void>;
90
+ /**
91
+ * Stop all processes gracefully.
92
+ *
93
+ * Sequence:
94
+ * 1. Stop Agent first (so it can disconnect cleanly)
95
+ * 2. Stop Transport after Agent is gone
96
+ */
97
+ stop(): Promise<void>;
98
+ /**
99
+ * Get directory for worker files.
100
+ * In dev mode (tsx), import.meta.url points to src/ but workers need compiled .js from dist/
101
+ */
102
+ private getWorkerDir;
103
+ /**
104
+ * Handle system wake from sleep.
105
+ * Verify processes are still alive and restart if needed.
106
+ */
107
+ private handleSystemWake;
108
+ /**
109
+ * Send IPC message to child process.
110
+ */
111
+ private sendToChild;
112
+ /**
113
+ * Setup Agent crash recovery.
114
+ */
115
+ private setupAgentCrashRecovery;
116
+ /**
117
+ * Setup Transport crash recovery.
118
+ */
119
+ private setupTransportCrashRecovery;
120
+ /**
121
+ * Start Agent Process.
122
+ */
123
+ private startAgentProcess;
124
+ /**
125
+ * Start health check interval for sleep/wake detection.
126
+ * Detects system sleep by monitoring for large time gaps between checks.
127
+ */
128
+ private startHealthCheck;
129
+ /**
130
+ * Start Transport Process.
131
+ * @returns The port Transport is listening on
132
+ */
133
+ private startTransportProcess;
134
+ /**
135
+ * Stop Agent Process.
136
+ */
137
+ private stopAgentProcess;
138
+ /**
139
+ * Stop health check interval.
140
+ */
141
+ private stopHealthCheck;
142
+ /**
143
+ * Stop Transport Process.
144
+ */
145
+ private stopTransportProcess;
146
+ }
147
+ /**
148
+ * Get or create the ProcessManager singleton.
149
+ */
150
+ export declare function getProcessManager(config?: ProcessManagerConfig): ProcessManager;
151
+ /**
152
+ * Dispose the ProcessManager singleton.
153
+ */
154
+ export declare function disposeProcessManager(): Promise<void>;
@@ -0,0 +1,471 @@
1
+ /**
2
+ * Process Manager - Manages the lifecycle of Transport and Agent processes.
3
+ *
4
+ * Architecture v0.5.0:
5
+ * - Spawns 2 separate child processes: Transport and Agent
6
+ * - Transport Process: Socket.IO server only (message hub)
7
+ * - Agent Process: TaskProcessor + UseCases + CipherAgent
8
+ * - ALL task communication via Socket.IO (NO IPC for tasks)
9
+ * - IPC only for process lifecycle: ready, shutdown, stopped
10
+ *
11
+ * Startup sequence:
12
+ * 1. fork('transport-worker.js')
13
+ * 2. Wait for Transport 'ready' with port
14
+ * 3. fork('agent-worker.js') with TRANSPORT_PORT env
15
+ * 4. Wait for Agent 'ready'
16
+ *
17
+ * Shutdown sequence:
18
+ * 1. Send 'shutdown' to Agent via IPC
19
+ * 2. Wait for Agent to exit
20
+ * 3. Send 'shutdown' to Transport via IPC
21
+ * 4. Wait for Transport to exit
22
+ */
23
+ import { fork } from 'node:child_process';
24
+ import path from 'node:path';
25
+ import { fileURLToPath } from 'node:url';
26
+ import { crashLog, getSessionLogPath, processManagerLog } from '../../utils/process-logger.js';
27
+ const DEFAULT_SHUTDOWN_TIMEOUT_MS = 5000;
28
+ const DEFAULT_STARTUP_TIMEOUT_MS = 30_000;
29
+ const HEALTH_CHECK_INTERVAL_MS = 5000; // Check every 5 seconds
30
+ const SLEEP_DETECTION_THRESHOLD_MS = 30_000; // If 30s passed when expecting 5s, likely slept
31
+ /**
32
+ * Creates a system error with crash log.
33
+ * Logs error details to session log and returns user-friendly message.
34
+ */
35
+ function createSystemError(error, context) {
36
+ const logPath = crashLog(new Error(error), context);
37
+ return new Error(`brv failed to start. Details logged to: ${logPath}`);
38
+ }
39
+ /**
40
+ * ProcessManager - Spawns and manages Transport and Agent processes.
41
+ *
42
+ * Architecture v0.5.0:
43
+ * - Single source of truth for child process lifecycle
44
+ * - Transport spawned first (needs port)
45
+ * - Agent spawned second (needs transport port)
46
+ * - Crash recovery: respawn on exit
47
+ */
48
+ export class ProcessManager {
49
+ healthCheckInterval;
50
+ lastHealthCheckTime = Date.now();
51
+ shutdownTimeoutMs;
52
+ startupTimeoutMs;
53
+ state = {
54
+ agentReady: false,
55
+ running: false,
56
+ transportReady: false,
57
+ };
58
+ constructor(config) {
59
+ this.startupTimeoutMs = config?.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
60
+ this.shutdownTimeoutMs = config?.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
61
+ }
62
+ /**
63
+ * Get current state.
64
+ */
65
+ getState() {
66
+ return { ...this.state };
67
+ }
68
+ /**
69
+ * Get transport port (for TUI to connect).
70
+ */
71
+ getTransportPort() {
72
+ return this.state.port;
73
+ }
74
+ /**
75
+ * Check if system is fully running.
76
+ */
77
+ isRunning() {
78
+ return this.state.running && this.state.transportReady && this.state.agentReady;
79
+ }
80
+ /**
81
+ * Start Transport and Agent processes.
82
+ *
83
+ * Sequence:
84
+ * 1. Start Transport Process
85
+ * 2. Wait for Transport 'ready' with port
86
+ * 3. Start Agent Process with TRANSPORT_PORT env
87
+ * 4. Wait for Agent 'ready'
88
+ *
89
+ * @throws Error if startup fails or times out
90
+ */
91
+ async start() {
92
+ if (this.state.running) {
93
+ return;
94
+ }
95
+ // Step 1: Start Transport Process
96
+ const port = await this.startTransportProcess();
97
+ this.state.port = port;
98
+ this.state.transportReady = true;
99
+ // Step 2: Start Agent Process (with transport port)
100
+ await this.startAgentProcess(port);
101
+ this.state.agentReady = true;
102
+ this.state.running = true;
103
+ // Step 3: Start health check for sleep/wake detection
104
+ this.startHealthCheck();
105
+ }
106
+ /**
107
+ * Stop all processes gracefully.
108
+ *
109
+ * Sequence:
110
+ * 1. Stop Agent first (so it can disconnect cleanly)
111
+ * 2. Stop Transport after Agent is gone
112
+ */
113
+ async stop() {
114
+ if (!this.state.running) {
115
+ return;
116
+ }
117
+ this.state.running = false;
118
+ // Stop health check first
119
+ this.stopHealthCheck();
120
+ // Step 1: Stop Agent Process
121
+ await this.stopAgentProcess();
122
+ this.state.agentReady = false;
123
+ // Step 2: Stop Transport Process
124
+ await this.stopTransportProcess();
125
+ this.state.transportReady = false;
126
+ this.state.port = undefined;
127
+ }
128
+ /**
129
+ * Get directory for worker files.
130
+ * In dev mode (tsx), import.meta.url points to src/ but workers need compiled .js from dist/
131
+ */
132
+ getWorkerDir() {
133
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
134
+ // If running from src/ (dev mode with tsx), redirect to dist/
135
+ if (currentDir.includes(`${path.sep}src${path.sep}`)) {
136
+ return currentDir.replace(`${path.sep}src${path.sep}`, `${path.sep}dist${path.sep}`);
137
+ }
138
+ return currentDir;
139
+ }
140
+ /**
141
+ * Handle system wake from sleep.
142
+ * Verify processes are still alive and restart if needed.
143
+ */
144
+ handleSystemWake() {
145
+ const { agentProcess, transportProcess } = this.state;
146
+ // Check if processes are still running
147
+ const agentAlive = agentProcess && !agentProcess.killed && agentProcess.exitCode === null;
148
+ const transportAlive = transportProcess && !transportProcess.killed && transportProcess.exitCode === null;
149
+ if (!agentAlive || !transportAlive) {
150
+ processManagerLog('Processes not healthy after wake, triggering restart');
151
+ // Trigger restart by simulating crash recovery
152
+ if (!transportAlive && transportProcess) {
153
+ processManagerLog('Transport process died during sleep, respawning...');
154
+ // The crash recovery handler will handle this
155
+ transportProcess.emit('exit', 1, null);
156
+ }
157
+ else if (!agentAlive && agentProcess) {
158
+ processManagerLog('Agent process died during sleep, respawning...');
159
+ // The crash recovery handler will handle this
160
+ agentProcess.emit('exit', 1, null);
161
+ }
162
+ }
163
+ else {
164
+ processManagerLog('Processes healthy after wake');
165
+ }
166
+ }
167
+ /**
168
+ * Send IPC message to child process.
169
+ */
170
+ sendToChild(child, message) {
171
+ child.send?.(message);
172
+ }
173
+ /**
174
+ * Setup Agent crash recovery.
175
+ */
176
+ setupAgentCrashRecovery() {
177
+ const { agentProcess } = this.state;
178
+ if (!agentProcess)
179
+ return;
180
+ // Use .once() to prevent listener accumulation on crash/respawn cycles
181
+ agentProcess.once('exit', (code, signal) => {
182
+ if (!this.state.running)
183
+ return; // Intentional shutdown
184
+ processManagerLog(`Agent process exited unexpectedly (code=${code}, signal=${signal})`);
185
+ this.state.agentReady = false;
186
+ // Respawn Agent
187
+ if (this.state.port) {
188
+ this.startAgentProcess(this.state.port)
189
+ .then(() => {
190
+ this.state.agentReady = true;
191
+ processManagerLog('Agent process respawned');
192
+ })
193
+ .catch((error) => {
194
+ processManagerLog(`Failed to respawn Agent: ${error}`);
195
+ });
196
+ }
197
+ });
198
+ }
199
+ /**
200
+ * Setup Transport crash recovery.
201
+ */
202
+ setupTransportCrashRecovery() {
203
+ const { transportProcess } = this.state;
204
+ if (!transportProcess)
205
+ return;
206
+ // Use .once() to prevent listener accumulation on crash/respawn cycles
207
+ transportProcess.once('exit', (code, signal) => {
208
+ if (!this.state.running)
209
+ return; // Intentional shutdown
210
+ processManagerLog(`Transport process exited unexpectedly (code=${code}, signal=${signal})`);
211
+ this.state.transportReady = false;
212
+ // Respawn Transport, then reconnect Agent
213
+ this.startTransportProcess()
214
+ .then(async (newPort) => {
215
+ this.state.port = newPort;
216
+ this.state.transportReady = true;
217
+ processManagerLog(`Transport process respawned on port ${newPort}`);
218
+ // Agent needs to reconnect to new port
219
+ // For now, just restart Agent
220
+ if (this.state.agentProcess) {
221
+ await this.stopAgentProcess();
222
+ await this.startAgentProcess(newPort);
223
+ this.state.agentReady = true;
224
+ processManagerLog('Agent reconnected to new Transport');
225
+ }
226
+ })
227
+ .catch((error) => {
228
+ processManagerLog(`Failed to respawn Transport: ${error}`);
229
+ });
230
+ });
231
+ }
232
+ /**
233
+ * Start Agent Process.
234
+ */
235
+ async startAgentProcess(transportPort) {
236
+ return new Promise((resolve, reject) => {
237
+ const workerPath = path.resolve(this.getWorkerDir(), 'agent-worker.js');
238
+ const child = fork(workerPath, [], {
239
+ env: {
240
+ ...process.env,
241
+ BRV_SESSION_LOG: getSessionLogPath(),
242
+ TRANSPORT_PORT: String(transportPort),
243
+ },
244
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
245
+ });
246
+ this.state.agentProcess = child;
247
+ const timeout = setTimeout(() => {
248
+ cleanup();
249
+ child.kill('SIGKILL');
250
+ reject(createSystemError(`Agent startup timed out after ${this.startupTimeoutMs}ms`, 'Agent startup timeout'));
251
+ }, this.startupTimeoutMs);
252
+ const onMessage = (message) => {
253
+ if (message.type === 'ready') {
254
+ cleanup();
255
+ this.setupAgentCrashRecovery();
256
+ resolve();
257
+ }
258
+ else if (message.type === 'error') {
259
+ cleanup();
260
+ child.kill('SIGKILL');
261
+ reject(createSystemError(message.error, 'Agent startup error'));
262
+ }
263
+ };
264
+ const onError = (error) => {
265
+ cleanup();
266
+ reject(createSystemError(error.message, 'Agent process error'));
267
+ };
268
+ const onExit = (code) => {
269
+ cleanup();
270
+ reject(createSystemError(`Agent exited with code ${code}`, 'Agent unexpected exit'));
271
+ };
272
+ const cleanup = () => {
273
+ clearTimeout(timeout);
274
+ child.off('message', onMessage);
275
+ child.off('error', onError);
276
+ child.off('exit', onExit);
277
+ };
278
+ child.on('message', onMessage);
279
+ child.on('error', onError);
280
+ child.on('exit', onExit);
281
+ // Forward stdout/stderr
282
+ child.stdout?.pipe(process.stdout);
283
+ child.stderr?.pipe(process.stderr);
284
+ });
285
+ }
286
+ /**
287
+ * Start health check interval for sleep/wake detection.
288
+ * Detects system sleep by monitoring for large time gaps between checks.
289
+ */
290
+ startHealthCheck() {
291
+ this.lastHealthCheckTime = Date.now();
292
+ this.healthCheckInterval = setInterval(() => {
293
+ const now = Date.now();
294
+ const elapsed = now - this.lastHealthCheckTime;
295
+ this.lastHealthCheckTime = now;
296
+ // If significantly more time passed than expected, system likely slept
297
+ if (elapsed > SLEEP_DETECTION_THRESHOLD_MS) {
298
+ processManagerLog(`System wake detected (${Math.round(elapsed / 1000)}s gap)`);
299
+ this.handleSystemWake();
300
+ }
301
+ }, HEALTH_CHECK_INTERVAL_MS);
302
+ // Don't prevent process exit
303
+ this.healthCheckInterval.unref();
304
+ }
305
+ /**
306
+ * Start Transport Process.
307
+ * @returns The port Transport is listening on
308
+ */
309
+ async startTransportProcess() {
310
+ return new Promise((resolve, reject) => {
311
+ const workerPath = path.resolve(this.getWorkerDir(), 'transport-worker.js');
312
+ const child = fork(workerPath, [], {
313
+ env: {
314
+ ...process.env,
315
+ BRV_SESSION_LOG: getSessionLogPath(),
316
+ },
317
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
318
+ });
319
+ this.state.transportProcess = child;
320
+ const timeout = setTimeout(() => {
321
+ cleanup();
322
+ child.kill('SIGKILL');
323
+ reject(createSystemError(`Transport startup timed out after ${this.startupTimeoutMs}ms`, 'Transport startup timeout'));
324
+ }, this.startupTimeoutMs);
325
+ const onMessage = (message) => {
326
+ if (message.type === 'ready') {
327
+ cleanup();
328
+ this.setupTransportCrashRecovery();
329
+ resolve(message.port);
330
+ }
331
+ else if (message.type === 'error') {
332
+ cleanup();
333
+ child.kill('SIGKILL');
334
+ // Pass through user-friendly errors directly
335
+ const isUserFriendly = message.error.startsWith('brv is already running');
336
+ if (isUserFriendly) {
337
+ reject(new Error(message.error));
338
+ }
339
+ else {
340
+ reject(createSystemError(message.error, 'Transport startup error'));
341
+ }
342
+ }
343
+ };
344
+ const onError = (error) => {
345
+ cleanup();
346
+ reject(createSystemError(error.message, 'Transport process error'));
347
+ };
348
+ const onExit = (code) => {
349
+ cleanup();
350
+ reject(createSystemError(`Transport exited with code ${code}`, 'Transport unexpected exit'));
351
+ };
352
+ const cleanup = () => {
353
+ clearTimeout(timeout);
354
+ child.off('message', onMessage);
355
+ child.off('error', onError);
356
+ child.off('exit', onExit);
357
+ };
358
+ child.on('message', onMessage);
359
+ child.on('error', onError);
360
+ child.on('exit', onExit);
361
+ // Forward stdout/stderr
362
+ child.stdout?.pipe(process.stdout);
363
+ child.stderr?.pipe(process.stderr);
364
+ });
365
+ }
366
+ /**
367
+ * Stop Agent Process.
368
+ */
369
+ async stopAgentProcess() {
370
+ const { agentProcess } = this.state;
371
+ if (!agentProcess)
372
+ return;
373
+ return new Promise((resolve) => {
374
+ const cleanup = () => {
375
+ clearTimeout(timeout);
376
+ agentProcess.off('message', onMessage);
377
+ agentProcess.off('exit', onExit);
378
+ };
379
+ const timeout = setTimeout(() => {
380
+ cleanup();
381
+ agentProcess.kill('SIGKILL');
382
+ this.state.agentProcess = undefined;
383
+ resolve();
384
+ }, this.shutdownTimeoutMs);
385
+ const onMessage = (message) => {
386
+ if (message.type === 'stopped') {
387
+ cleanup();
388
+ this.state.agentProcess = undefined;
389
+ resolve();
390
+ }
391
+ };
392
+ const onExit = () => {
393
+ cleanup();
394
+ this.state.agentProcess = undefined;
395
+ resolve();
396
+ };
397
+ agentProcess.on('message', onMessage);
398
+ agentProcess.on('exit', onExit);
399
+ // Send shutdown command
400
+ this.sendToChild(agentProcess, { type: 'shutdown' });
401
+ });
402
+ }
403
+ /**
404
+ * Stop health check interval.
405
+ */
406
+ stopHealthCheck() {
407
+ if (this.healthCheckInterval) {
408
+ clearInterval(this.healthCheckInterval);
409
+ this.healthCheckInterval = undefined;
410
+ }
411
+ }
412
+ /**
413
+ * Stop Transport Process.
414
+ */
415
+ async stopTransportProcess() {
416
+ const { transportProcess } = this.state;
417
+ if (!transportProcess)
418
+ return;
419
+ return new Promise((resolve) => {
420
+ const cleanup = () => {
421
+ clearTimeout(timeout);
422
+ transportProcess.off('message', onMessage);
423
+ transportProcess.off('exit', onExit);
424
+ };
425
+ const timeout = setTimeout(() => {
426
+ cleanup();
427
+ transportProcess.kill('SIGKILL');
428
+ this.state.transportProcess = undefined;
429
+ resolve();
430
+ }, this.shutdownTimeoutMs);
431
+ const onMessage = (message) => {
432
+ if (message.type === 'stopped') {
433
+ cleanup();
434
+ this.state.transportProcess = undefined;
435
+ resolve();
436
+ }
437
+ };
438
+ const onExit = () => {
439
+ cleanup();
440
+ this.state.transportProcess = undefined;
441
+ resolve();
442
+ };
443
+ transportProcess.on('message', onMessage);
444
+ transportProcess.on('exit', onExit);
445
+ // Send shutdown command
446
+ this.sendToChild(transportProcess, { type: 'shutdown' });
447
+ });
448
+ }
449
+ }
450
+ // ============================================================================
451
+ // Singleton
452
+ // ============================================================================
453
+ let instance;
454
+ /**
455
+ * Get or create the ProcessManager singleton.
456
+ */
457
+ export function getProcessManager(config) {
458
+ if (!instance) {
459
+ instance = new ProcessManager(config);
460
+ }
461
+ return instance;
462
+ }
463
+ /**
464
+ * Dispose the ProcessManager singleton.
465
+ */
466
+ export async function disposeProcessManager() {
467
+ if (instance) {
468
+ await instance.stop();
469
+ instance = undefined;
470
+ }
471
+ }