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,85 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Base schema for all contributor configurations.
4
+ */
5
+ const BaseContributorSchema = z.object({
6
+ enabled: z.boolean().optional().default(true).describe('Whether this contributor is enabled'),
7
+ id: z.string().min(1).describe('Unique identifier for this contributor'),
8
+ priority: z.number().int().nonnegative().describe('Execution priority (lower = first)'),
9
+ });
10
+ /**
11
+ * Schema for static contributors.
12
+ * Returns inline content directly.
13
+ */
14
+ export const StaticContributorConfigSchema = BaseContributorSchema.extend({
15
+ content: z.string().min(1).describe('Static content to include in the prompt'),
16
+ type: z.literal('static'),
17
+ }).strict();
18
+ /**
19
+ * Schema for file contributors.
20
+ * Loads content from YAML files.
21
+ */
22
+ export const FileContributorConfigSchema = BaseContributorSchema.extend({
23
+ filepath: z.string().min(1).describe('Path to YAML prompt file'),
24
+ options: z
25
+ .object({
26
+ cache: z.boolean().optional().default(true).describe('Whether to cache file contents'),
27
+ validateMtime: z.boolean().optional().default(true).describe('Whether to validate file modification time'),
28
+ })
29
+ .strict()
30
+ .optional(),
31
+ type: z.literal('file'),
32
+ }).strict();
33
+ /**
34
+ * Schema for memory contributor options.
35
+ */
36
+ export const MemoryContributorOptionsSchema = z
37
+ .object({
38
+ includeTags: z.boolean().optional().default(true).describe('Whether to include tags in memory display'),
39
+ limit: z.number().int().positive().optional().default(20).describe('Maximum number of memories to include'),
40
+ pinnedOnly: z.boolean().optional().default(false).describe('Only include pinned memories'),
41
+ })
42
+ .strict();
43
+ /**
44
+ * Schema for memory contributors.
45
+ * Loads memories from the memory manager.
46
+ */
47
+ export const MemoryContributorConfigSchema = BaseContributorSchema.extend({
48
+ options: MemoryContributorOptionsSchema.optional(),
49
+ type: z.literal('memory'),
50
+ }).strict();
51
+ /**
52
+ * Schema for environment contributors.
53
+ * Provides environment context (working directory, git status, etc.).
54
+ */
55
+ export const EnvironmentContributorConfigSchema = BaseContributorSchema.extend({
56
+ type: z.literal('environment'),
57
+ }).strict();
58
+ /**
59
+ * Schema for datetime contributors.
60
+ * Provides current date and time.
61
+ */
62
+ export const DateTimeContributorConfigSchema = BaseContributorSchema.extend({
63
+ type: z.literal('dateTime'),
64
+ }).strict();
65
+ /**
66
+ * Discriminated union schema for all contributor configurations.
67
+ */
68
+ export const ContributorConfigSchema = z
69
+ .discriminatedUnion('type', [
70
+ StaticContributorConfigSchema,
71
+ FileContributorConfigSchema,
72
+ MemoryContributorConfigSchema,
73
+ EnvironmentContributorConfigSchema,
74
+ DateTimeContributorConfigSchema,
75
+ ])
76
+ .describe('System prompt contributor configuration');
77
+ /**
78
+ * Schema for the system prompt manager configuration.
79
+ */
80
+ export const SystemPromptManagerConfigSchema = z
81
+ .object({
82
+ contributors: z.array(ContributorConfigSchema).min(1).describe('Array of contributor configurations'),
83
+ })
84
+ .strict()
85
+ .describe('System prompt manager configuration');
@@ -0,0 +1,59 @@
1
+ import type { ContributorContext, SystemPromptContributor } from '../../../../core/domain/cipher/system-prompt/types.js';
2
+ /**
3
+ * Options for agent prompt contributor configuration.
4
+ */
5
+ export interface AgentPromptContributorOptions {
6
+ /** Base path for resolving relative file paths */
7
+ basePath?: string;
8
+ /** Whether to cache file contents (default: true) */
9
+ cache?: boolean;
10
+ }
11
+ /**
12
+ * Agent prompt contributor that loads agent-specific prompts from YAML files.
13
+ *
14
+ * This contributor reads the agent's prompt configuration from the agent registry
15
+ * and loads the corresponding YAML prompt file. It supports:
16
+ * - Loading prompts from the agent's `promptFile` configuration
17
+ * - Falling back to inline `prompt` if no promptFile is specified
18
+ * - Caching loaded prompts for performance
19
+ *
20
+ * The agent name is typically passed via the ContributorContext.
21
+ */
22
+ export declare class AgentPromptContributor implements SystemPromptContributor {
23
+ readonly id: string;
24
+ readonly priority: number;
25
+ private readonly basePath;
26
+ private readonly cache;
27
+ private readonly useCache;
28
+ /**
29
+ * Creates a new agent prompt contributor.
30
+ *
31
+ * @param id - Unique identifier for this contributor
32
+ * @param priority - Execution priority (lower = first)
33
+ * @param options - Configuration options
34
+ */
35
+ constructor(id: string, priority: number, options?: AgentPromptContributorOptions);
36
+ /**
37
+ * Loads and returns the agent-specific prompt content.
38
+ *
39
+ * The agent name should be provided in the context. If no agent name
40
+ * is specified, or the agent has no prompt configured, returns an empty string.
41
+ *
42
+ * @param context - Contributor context with agent name
43
+ * @returns Agent prompt content string
44
+ */
45
+ getContent(context: ContributorContext): Promise<string>;
46
+ /**
47
+ * Invalidate the cache for a specific file.
48
+ *
49
+ * @param filepath - Path to the file to invalidate
50
+ */
51
+ invalidateCache(filepath?: string): void;
52
+ /**
53
+ * Load prompt content from a YAML file.
54
+ *
55
+ * @param filepath - Path to the YAML prompt file
56
+ * @returns Prompt content string
57
+ */
58
+ private loadPromptFile;
59
+ }
@@ -0,0 +1,131 @@
1
+ import { load as loadYaml } from 'js-yaml';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { getAgentRegistry } from '../../../../core/domain/cipher/agent/agent-registry.js';
5
+ import { SystemPromptError } from '../../../../core/domain/cipher/errors/system-prompt-error.js';
6
+ import { PromptCache } from '../prompt-cache.js';
7
+ import { PromptConfigSchema } from '../schemas.js';
8
+ /**
9
+ * Agent prompt contributor that loads agent-specific prompts from YAML files.
10
+ *
11
+ * This contributor reads the agent's prompt configuration from the agent registry
12
+ * and loads the corresponding YAML prompt file. It supports:
13
+ * - Loading prompts from the agent's `promptFile` configuration
14
+ * - Falling back to inline `prompt` if no promptFile is specified
15
+ * - Caching loaded prompts for performance
16
+ *
17
+ * The agent name is typically passed via the ContributorContext.
18
+ */
19
+ export class AgentPromptContributor {
20
+ id;
21
+ priority;
22
+ basePath;
23
+ cache;
24
+ useCache;
25
+ /**
26
+ * Creates a new agent prompt contributor.
27
+ *
28
+ * @param id - Unique identifier for this contributor
29
+ * @param priority - Execution priority (lower = first)
30
+ * @param options - Configuration options
31
+ */
32
+ constructor(id, priority, options = {}) {
33
+ this.id = id;
34
+ this.priority = priority;
35
+ this.basePath = options.basePath ?? '';
36
+ this.useCache = options.cache ?? true;
37
+ this.cache = new PromptCache({
38
+ maxSize: 20,
39
+ validateMtime: true,
40
+ });
41
+ }
42
+ /**
43
+ * Loads and returns the agent-specific prompt content.
44
+ *
45
+ * The agent name should be provided in the context. If no agent name
46
+ * is specified, or the agent has no prompt configured, returns an empty string.
47
+ *
48
+ * @param context - Contributor context with agent name
49
+ * @returns Agent prompt content string
50
+ */
51
+ async getContent(context) {
52
+ // Get agent name from context (extended property)
53
+ const { agentName } = context;
54
+ if (!agentName) {
55
+ // No agent specified, return empty
56
+ return '';
57
+ }
58
+ // Get agent from registry
59
+ const registry = getAgentRegistry();
60
+ const agent = registry.get(agentName);
61
+ if (!agent) {
62
+ // Unknown agent, return empty
63
+ return '';
64
+ }
65
+ // Check for inline prompt first (takes precedence if promptFile is not specified)
66
+ if (agent.prompt && !agent.promptFile) {
67
+ return agent.prompt;
68
+ }
69
+ // Load from promptFile if specified
70
+ if (agent.promptFile) {
71
+ return this.loadPromptFile(agent.promptFile);
72
+ }
73
+ // No prompt configured for this agent
74
+ return '';
75
+ }
76
+ /**
77
+ * Invalidate the cache for a specific file.
78
+ *
79
+ * @param filepath - Path to the file to invalidate
80
+ */
81
+ invalidateCache(filepath) {
82
+ if (filepath) {
83
+ const fullPath = this.basePath ? path.join(this.basePath, filepath) : filepath;
84
+ this.cache.invalidate(fullPath);
85
+ }
86
+ }
87
+ /**
88
+ * Load prompt content from a YAML file.
89
+ *
90
+ * @param filepath - Path to the YAML prompt file
91
+ * @returns Prompt content string
92
+ */
93
+ loadPromptFile(filepath) {
94
+ const fullPath = this.basePath ? path.join(this.basePath, filepath) : filepath;
95
+ // Check cache first
96
+ if (this.useCache) {
97
+ const cached = this.cache.get(fullPath);
98
+ if (cached?.prompt) {
99
+ return cached.prompt;
100
+ }
101
+ }
102
+ // Load from file
103
+ if (!fs.existsSync(fullPath)) {
104
+ throw SystemPromptError.fileNotFound(fullPath);
105
+ }
106
+ let yamlContent;
107
+ try {
108
+ yamlContent = fs.readFileSync(fullPath, 'utf8');
109
+ }
110
+ catch (error) {
111
+ const reason = error instanceof Error ? error.message : String(error);
112
+ throw SystemPromptError.fileReadFailed(fullPath, reason);
113
+ }
114
+ const rawConfig = loadYaml(yamlContent);
115
+ // Validate with Zod schema
116
+ const parseResult = PromptConfigSchema.safeParse(rawConfig);
117
+ if (!parseResult.success) {
118
+ const errorMessages = parseResult.error.errors.map((err) => `${err.path.join('.')}: ${err.message}`).join('; ');
119
+ throw SystemPromptError.configInvalid(errorMessages, parseResult.error.errors);
120
+ }
121
+ const config = parseResult.data;
122
+ if (!config.prompt) {
123
+ throw SystemPromptError.configMissingField('prompt', fullPath);
124
+ }
125
+ // Cache the config
126
+ if (this.useCache) {
127
+ this.cache.set(fullPath, config);
128
+ }
129
+ return config.prompt;
130
+ }
131
+ }
@@ -0,0 +1,54 @@
1
+ import type { ContributorContext, SystemPromptContributor } from '../../../../core/domain/cipher/system-prompt/types.js';
2
+ /**
3
+ * Options for companion contributor configuration.
4
+ */
5
+ export interface CompanionContributorOptions {
6
+ /** Base path for resolving relative file paths */
7
+ basePath?: string;
8
+ }
9
+ /**
10
+ * Companion contributor that discovers and loads companion prompts.
11
+ *
12
+ * Discovers files matching the pattern `{commandType}-*.yml` and
13
+ * loads their prompt content.
14
+ *
15
+ * Features:
16
+ * - Automatic discovery of companion prompts by commandType
17
+ * - Loads and concatenates multiple companion files
18
+ * - Graceful handling of missing files
19
+ */
20
+ export declare class CompanionContributor implements SystemPromptContributor {
21
+ readonly id: string;
22
+ readonly priority: number;
23
+ private readonly basePath;
24
+ /**
25
+ * Creates a new companion contributor.
26
+ *
27
+ * @param id - Unique identifier for this contributor
28
+ * @param priority - Execution priority (lower = first)
29
+ * @param options - Configuration options
30
+ */
31
+ constructor(id: string, priority: number, options?: CompanionContributorOptions);
32
+ /**
33
+ * Discovers and loads companion prompts based on commandType.
34
+ *
35
+ * @param context - Contributor context with commandType
36
+ * @returns Concatenated companion prompt content
37
+ */
38
+ getContent(context: ContributorContext): Promise<string>;
39
+ /**
40
+ * Discover companion prompt files for a given commandType.
41
+ * Looks for files matching the pattern: {commandType}-*.yml
42
+ *
43
+ * @param commandType - The command type (e.g., 'query', 'curate')
44
+ * @returns Array of filenames matching the pattern
45
+ */
46
+ private discoverCompanionPrompts;
47
+ /**
48
+ * Load and parse a prompt YAML file.
49
+ *
50
+ * @param filename - Filename to load
51
+ * @returns Prompt content or null if not found
52
+ */
53
+ private loadPromptFile;
54
+ }
@@ -0,0 +1,107 @@
1
+ import { load as loadYaml } from 'js-yaml';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { SystemPromptError } from '../../../../core/domain/cipher/errors/system-prompt-error.js';
6
+ /**
7
+ * Companion contributor that discovers and loads companion prompts.
8
+ *
9
+ * Discovers files matching the pattern `{commandType}-*.yml` and
10
+ * loads their prompt content.
11
+ *
12
+ * Features:
13
+ * - Automatic discovery of companion prompts by commandType
14
+ * - Loads and concatenates multiple companion files
15
+ * - Graceful handling of missing files
16
+ */
17
+ export class CompanionContributor {
18
+ id;
19
+ priority;
20
+ basePath;
21
+ /**
22
+ * Creates a new companion contributor.
23
+ *
24
+ * @param id - Unique identifier for this contributor
25
+ * @param priority - Execution priority (lower = first)
26
+ * @param options - Configuration options
27
+ */
28
+ constructor(id, priority, options = {}) {
29
+ this.id = id;
30
+ this.priority = priority;
31
+ // Default to resources/prompts directory
32
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
33
+ this.basePath = options.basePath ?? path.join(currentDir, '../../../../resources/prompts');
34
+ }
35
+ /**
36
+ * Discovers and loads companion prompts based on commandType.
37
+ *
38
+ * @param context - Contributor context with commandType
39
+ * @returns Concatenated companion prompt content
40
+ */
41
+ async getContent(context) {
42
+ if (!context.commandType) {
43
+ return '';
44
+ }
45
+ const companionFiles = this.discoverCompanionPrompts(context.commandType);
46
+ if (companionFiles.length === 0) {
47
+ return '';
48
+ }
49
+ const contents = [];
50
+ for (const filename of companionFiles) {
51
+ try {
52
+ const content = this.loadPromptFile(filename);
53
+ if (content) {
54
+ contents.push(content);
55
+ }
56
+ }
57
+ catch {
58
+ // Silently skip files that fail to load
59
+ }
60
+ }
61
+ return contents.join('\n\n');
62
+ }
63
+ /**
64
+ * Discover companion prompt files for a given commandType.
65
+ * Looks for files matching the pattern: {commandType}-*.yml
66
+ *
67
+ * @param commandType - The command type (e.g., 'query', 'curate')
68
+ * @returns Array of filenames matching the pattern
69
+ */
70
+ discoverCompanionPrompts(commandType) {
71
+ const companionPrompts = [];
72
+ try {
73
+ const files = fs.readdirSync(this.basePath);
74
+ const pattern = new RegExp(`^${commandType}-.*\\.yml$`);
75
+ const matchingFiles = files.filter((file) => pattern.test(file));
76
+ for (const file of matchingFiles) {
77
+ companionPrompts.push(file);
78
+ }
79
+ }
80
+ catch {
81
+ // Return empty array if directory doesn't exist or can't be read
82
+ }
83
+ return companionPrompts.sort();
84
+ }
85
+ /**
86
+ * Load and parse a prompt YAML file.
87
+ *
88
+ * @param filename - Filename to load
89
+ * @returns Prompt content or null if not found
90
+ */
91
+ loadPromptFile(filename) {
92
+ const fullPath = path.join(this.basePath, filename);
93
+ if (!fs.existsSync(fullPath)) {
94
+ return null;
95
+ }
96
+ let yamlContent;
97
+ try {
98
+ yamlContent = fs.readFileSync(fullPath, 'utf8');
99
+ }
100
+ catch (error) {
101
+ const reason = error instanceof Error ? error.message : String(error);
102
+ throw SystemPromptError.fileReadFailed(fullPath, reason);
103
+ }
104
+ const config = loadYaml(yamlContent);
105
+ return config.prompt ?? null;
106
+ }
107
+ }
@@ -0,0 +1,68 @@
1
+ import type { ContributorContext, SystemPromptContributor } from '../../../../core/domain/cipher/system-prompt/types.js';
2
+ /**
3
+ * Options for context tree structure contributor.
4
+ */
5
+ export interface ContextTreeStructureContributorOptions {
6
+ /** Maximum depth for traversing the context tree (default: 5) */
7
+ maxDepth?: number;
8
+ /** Maximum number of entries to include (default: 200) */
9
+ maxEntries?: number;
10
+ /** Working directory path (default: process.cwd()) */
11
+ workingDirectory?: string;
12
+ }
13
+ /**
14
+ * Context tree structure contributor that injects the .brv/context-tree structure
15
+ * into the system prompt for query and curate commands.
16
+ *
17
+ * This gives the plan agent and sub-agents immediate awareness of available
18
+ * context files before performing any search operations.
19
+ *
20
+ * Based on Anthropic's best practices for context engineering:
21
+ * - Pre-injecting structural context reduces search iterations
22
+ * - Agents can make better decisions about where to look
23
+ * - Reduces token waste from exploratory searches
24
+ */
25
+ export declare class ContextTreeStructureContributor implements SystemPromptContributor {
26
+ readonly id: string;
27
+ readonly priority: number;
28
+ private readonly maxDepth;
29
+ private readonly maxEntries;
30
+ private readonly workingDirectory;
31
+ /**
32
+ * Creates a new context tree structure contributor.
33
+ *
34
+ * @param id - Unique identifier for this contributor
35
+ * @param priority - Execution priority (lower = first)
36
+ * @param options - Configuration options
37
+ */
38
+ constructor(id: string, priority: number, options?: ContextTreeStructureContributorOptions);
39
+ /**
40
+ * Generates the context tree structure content.
41
+ *
42
+ * Only generates content for query and curate commands where
43
+ * context tree awareness is important for the agent's operation.
44
+ *
45
+ * @param context - Contributor context with command type
46
+ * @returns Formatted context tree structure, or empty string if not applicable
47
+ */
48
+ getContent(context: ContributorContext): Promise<string>;
49
+ /**
50
+ * Builds the context tree structure as a formatted string.
51
+ *
52
+ * @param contextTreePath - Path to the context tree directory
53
+ * @returns Formatted context tree structure
54
+ */
55
+ private buildContextTreeStructure;
56
+ /**
57
+ * Builds a message when the context tree is empty.
58
+ */
59
+ private buildEmptyContextTreeMessage;
60
+ /**
61
+ * Builds a message when no context tree exists.
62
+ */
63
+ private buildNoContextTreeMessage;
64
+ /**
65
+ * Recursively traverses the context tree and builds the structure lines.
66
+ */
67
+ private traverseContextTree;
68
+ }
@@ -0,0 +1,179 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ /**
4
+ * Context tree structure contributor that injects the .brv/context-tree structure
5
+ * into the system prompt for query and curate commands.
6
+ *
7
+ * This gives the plan agent and sub-agents immediate awareness of available
8
+ * context files before performing any search operations.
9
+ *
10
+ * Based on Anthropic's best practices for context engineering:
11
+ * - Pre-injecting structural context reduces search iterations
12
+ * - Agents can make better decisions about where to look
13
+ * - Reduces token waste from exploratory searches
14
+ */
15
+ export class ContextTreeStructureContributor {
16
+ id;
17
+ priority;
18
+ maxDepth;
19
+ maxEntries;
20
+ workingDirectory;
21
+ /**
22
+ * Creates a new context tree structure contributor.
23
+ *
24
+ * @param id - Unique identifier for this contributor
25
+ * @param priority - Execution priority (lower = first)
26
+ * @param options - Configuration options
27
+ */
28
+ constructor(id, priority, options = {}) {
29
+ this.id = id;
30
+ this.priority = priority;
31
+ this.maxDepth = options.maxDepth ?? 5;
32
+ this.maxEntries = options.maxEntries ?? 200;
33
+ this.workingDirectory = options.workingDirectory ?? process.cwd();
34
+ }
35
+ /**
36
+ * Generates the context tree structure content.
37
+ *
38
+ * Only generates content for query and curate commands where
39
+ * context tree awareness is important for the agent's operation.
40
+ *
41
+ * @param context - Contributor context with command type
42
+ * @returns Formatted context tree structure, or empty string if not applicable
43
+ */
44
+ async getContent(context) {
45
+ // Only inject for query and curate commands
46
+ if (context.commandType !== 'query' && context.commandType !== 'curate') {
47
+ return '';
48
+ }
49
+ const contextTreePath = path.join(this.workingDirectory, '.brv', 'context-tree');
50
+ // Check if context tree exists
51
+ if (!fs.existsSync(contextTreePath)) {
52
+ return this.buildNoContextTreeMessage();
53
+ }
54
+ return this.buildContextTreeStructure(contextTreePath);
55
+ }
56
+ /**
57
+ * Builds the context tree structure as a formatted string.
58
+ *
59
+ * @param contextTreePath - Path to the context tree directory
60
+ * @returns Formatted context tree structure
61
+ */
62
+ buildContextTreeStructure(contextTreePath) {
63
+ const entriesCount = { value: 0 };
64
+ const truncatedCount = { value: 0 };
65
+ const lines = [];
66
+ // Build the tree
67
+ this.traverseContextTree({
68
+ currentDepth: 0,
69
+ dir: contextTreePath,
70
+ entriesCount,
71
+ lines,
72
+ maxDepth: this.maxDepth,
73
+ maxEntries: this.maxEntries,
74
+ relativePath: '',
75
+ truncatedCount,
76
+ });
77
+ if (lines.length === 0) {
78
+ return this.buildEmptyContextTreeMessage();
79
+ }
80
+ // Build the final output
81
+ const parts = [
82
+ '<context-tree-structure>',
83
+ '## Current Context Tree Structure',
84
+ '',
85
+ 'The following is the current hierarchy of curated knowledge in `.brv/context-tree/`:',
86
+ '',
87
+ '```',
88
+ '.brv/context-tree/',
89
+ ...lines,
90
+ '```',
91
+ ];
92
+ if (truncatedCount.value > 0) {
93
+ parts.push('', `[${truncatedCount.value} additional entries not shown]`);
94
+ }
95
+ parts.push('', '## Structure Guide', '- Each top-level folder is a **domain** (e.g., `code_style/`, `design/`, `structure/`)', '- Inside domains are **topics** as `.md` files or subfolders with `context.md`', '- `context.md` files contain the curated knowledge content', '', '## Usage', '- **Query commands**: Search ONLY within this context tree structure', '- **Curate commands**: Check existing content here before creating new topics', '</context-tree-structure>');
96
+ return parts.join('\n');
97
+ }
98
+ /**
99
+ * Builds a message when the context tree is empty.
100
+ */
101
+ buildEmptyContextTreeMessage() {
102
+ return [
103
+ '<context-tree-structure>',
104
+ '## Context Tree Status: Empty',
105
+ '',
106
+ 'The context tree at `.brv/context-tree/` exists but contains no curated content yet.',
107
+ '',
108
+ '**For curate commands**: You can create new knowledge topics in any domain.',
109
+ '**For query commands**: No context is available to search.',
110
+ '</context-tree-structure>',
111
+ ].join('\n');
112
+ }
113
+ /**
114
+ * Builds a message when no context tree exists.
115
+ */
116
+ buildNoContextTreeMessage() {
117
+ return [
118
+ '<context-tree-structure>',
119
+ '## Context Tree Status: Not Initialized',
120
+ '',
121
+ 'The `.brv/context-tree/` directory does not exist.',
122
+ 'Run `/init` to initialize the ByteRover project and create the context tree.',
123
+ '</context-tree-structure>',
124
+ ].join('\n');
125
+ }
126
+ /**
127
+ * Recursively traverses the context tree and builds the structure lines.
128
+ */
129
+ traverseContextTree(options) {
130
+ const { currentDepth, dir, entriesCount, lines, maxDepth, maxEntries, relativePath, truncatedCount } = options;
131
+ if (currentDepth >= maxDepth) {
132
+ return;
133
+ }
134
+ let entries;
135
+ try {
136
+ entries = fs.readdirSync(dir, { withFileTypes: true });
137
+ }
138
+ catch {
139
+ return;
140
+ }
141
+ // Filter and sort: directories first, then alphabetically
142
+ const filteredEntries = entries
143
+ .filter((entry) => !entry.name.startsWith('.'))
144
+ .sort((a, b) => {
145
+ if (a.isDirectory() && !b.isDirectory())
146
+ return -1;
147
+ if (!a.isDirectory() && b.isDirectory())
148
+ return 1;
149
+ return a.name.localeCompare(b.name);
150
+ });
151
+ const indent = ' '.repeat(currentDepth + 1);
152
+ for (const entry of filteredEntries) {
153
+ if (entriesCount.value >= maxEntries) {
154
+ truncatedCount.value += filteredEntries.length - filteredEntries.indexOf(entry);
155
+ break;
156
+ }
157
+ entriesCount.value++;
158
+ const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
159
+ if (entry.isDirectory()) {
160
+ lines.push(`${indent}${entry.name}/`);
161
+ this.traverseContextTree({
162
+ currentDepth: currentDepth + 1,
163
+ dir: path.join(dir, entry.name),
164
+ entriesCount,
165
+ lines,
166
+ maxDepth,
167
+ maxEntries,
168
+ relativePath: entryRelativePath,
169
+ truncatedCount,
170
+ });
171
+ }
172
+ else {
173
+ // Add annotation for context.md files
174
+ const annotation = entry.name === 'context.md' ? ' (knowledge content)' : '';
175
+ lines.push(`${indent}${entry.name}${annotation}`);
176
+ }
177
+ }
178
+ }
179
+ }