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,52 @@
1
+ import { z } from 'zod';
2
+ import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
3
+ /**
4
+ * Input schema for list directory tool.
5
+ */
6
+ const ListDirectoryInputSchema = z
7
+ .object({
8
+ ignore: z
9
+ .array(z.string())
10
+ .optional()
11
+ .describe('Additional glob patterns to ignore (e.g., ["*.log", "temp/"])'),
12
+ maxResults: z
13
+ .number()
14
+ .int()
15
+ .positive()
16
+ .optional()
17
+ .default(100)
18
+ .describe('Maximum number of files to return (default: 100)'),
19
+ path: z
20
+ .string()
21
+ .optional()
22
+ .describe('The absolute path to the directory to list (defaults to working directory)'),
23
+ })
24
+ .strict();
25
+ /**
26
+ * Creates the list directory tool.
27
+ *
28
+ * Lists files and directories in a tree structure.
29
+ * Automatically ignores common build artifacts and caches.
30
+ *
31
+ * @param fileSystemService - File system service dependency
32
+ * @returns Configured list directory tool
33
+ */
34
+ export function createListDirectoryTool(fileSystemService) {
35
+ return {
36
+ description: 'Lists files and directories in a tree structure. Automatically ignores common build artifacts (node_modules, dist, .git, etc.).',
37
+ async execute(input, _context) {
38
+ const { ignore, maxResults, path } = input;
39
+ const result = await fileSystemService.listDirectory(path ?? '.', {
40
+ ignore,
41
+ maxResults,
42
+ });
43
+ return {
44
+ count: result.count,
45
+ tree: result.tree,
46
+ truncated: result.truncated,
47
+ };
48
+ },
49
+ id: ToolName.LIST_DIRECTORY,
50
+ inputSchema: ListDirectoryInputSchema,
51
+ };
52
+ }
@@ -4,7 +4,14 @@ import type { IFileSystem } from '../../../../core/interfaces/cipher/i-file-syst
4
4
  * Creates the read file tool.
5
5
  *
6
6
  * Reads the contents of a file with optional pagination support.
7
- * Supports offset (starting line) and limit (max lines) for large files.
7
+ *
8
+ * Features:
9
+ * - Accepts both absolute and relative paths
10
+ * - Image/PDF files returned as base64 attachments for multimodal LLMs
11
+ * - Binary file detection with clear error messages
12
+ * - .env file blocking with whitelist for example files
13
+ * - XML-wrapped output for clearer LLM parsing
14
+ * - Preview metadata for UI display
8
15
  *
9
16
  * @param fileSystemService - File system service dependency
10
17
  * @returns Configured read file tool
@@ -5,13 +5,13 @@ import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
5
5
  */
6
6
  const ReadFileInputSchema = z
7
7
  .object({
8
- filePath: z.string().describe('Absolute path to the file to read'),
8
+ filePath: z.string().describe('Path to the file to read (absolute or relative to working directory)'),
9
9
  limit: z
10
10
  .number()
11
11
  .int()
12
12
  .positive()
13
13
  .optional()
14
- .describe('Maximum number of lines to read (optional)'),
14
+ .describe('Maximum number of lines to read (optional, default: 2000)'),
15
15
  offset: z
16
16
  .number()
17
17
  .int()
@@ -24,14 +24,21 @@ const ReadFileInputSchema = z
24
24
  * Creates the read file tool.
25
25
  *
26
26
  * Reads the contents of a file with optional pagination support.
27
- * Supports offset (starting line) and limit (max lines) for large files.
27
+ *
28
+ * Features:
29
+ * - Accepts both absolute and relative paths
30
+ * - Image/PDF files returned as base64 attachments for multimodal LLMs
31
+ * - Binary file detection with clear error messages
32
+ * - .env file blocking with whitelist for example files
33
+ * - XML-wrapped output for clearer LLM parsing
34
+ * - Preview metadata for UI display
28
35
  *
29
36
  * @param fileSystemService - File system service dependency
30
37
  * @returns Configured read file tool
31
38
  */
32
39
  export function createReadFileTool(fileSystemService) {
33
40
  return {
34
- description: 'Read the contents of a file. Supports pagination with offset (1-based line number) and limit (max lines).',
41
+ description: 'Read the contents of a file. Supports relative/absolute paths, pagination, and returns images/PDFs as base64 attachments.',
35
42
  async execute(input, _context) {
36
43
  const { filePath, limit, offset } = input;
37
44
  // Call file system service
@@ -39,12 +46,15 @@ export function createReadFileTool(fileSystemService) {
39
46
  limit,
40
47
  offset,
41
48
  });
42
- // Return formatted result
49
+ // Return formatted result with all metadata
43
50
  return {
44
- content: result.content,
45
- encoding: result.encoding,
51
+ attachment: result.attachment,
52
+ content: result.formattedContent,
46
53
  lines: result.lines,
54
+ message: result.message,
55
+ preview: result.preview,
47
56
  size: result.size,
57
+ totalLines: result.totalLines,
48
58
  truncated: result.truncated,
49
59
  };
50
60
  },
@@ -0,0 +1,11 @@
1
+ import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
2
+ import type { ITodoStorage } from '../../../../core/interfaces/cipher/i-todo-storage.js';
3
+ /**
4
+ * Creates the read todos tool.
5
+ *
6
+ * Reads the current todo list from session storage.
7
+ *
8
+ * @param todoStorage - Storage service for retrieving todos
9
+ * @returns Configured read todos tool
10
+ */
11
+ export declare function createReadTodosTool(todoStorage: ITodoStorage): Tool;
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
3
+ /**
4
+ * Input schema for read todos tool.
5
+ * No parameters required - reads todos for current session.
6
+ */
7
+ const ReadTodosInputSchema = z.object({}).strict();
8
+ /**
9
+ * Tool description for read todos.
10
+ */
11
+ const TOOL_DESCRIPTION = `Read the current todo list for this session.
12
+
13
+ Use this tool to check the current state of your task list before making updates.
14
+ Returns all todo items with their id, content, activeForm, and status.`;
15
+ /**
16
+ * Creates the read todos tool.
17
+ *
18
+ * Reads the current todo list from session storage.
19
+ *
20
+ * @param todoStorage - Storage service for retrieving todos
21
+ * @returns Configured read todos tool
22
+ */
23
+ export function createReadTodosTool(todoStorage) {
24
+ return {
25
+ description: TOOL_DESCRIPTION,
26
+ async execute(_input, context) {
27
+ const sessionId = context?.sessionId ?? 'default';
28
+ const todos = await todoStorage.get(sessionId);
29
+ const incompleteCount = todos.filter((t) => t.status !== 'completed').length;
30
+ return {
31
+ content: JSON.stringify(todos, null, 2),
32
+ metadata: { todos },
33
+ title: `${incompleteCount} todos`,
34
+ };
35
+ },
36
+ id: ToolName.READ_TODOS,
37
+ inputSchema: ReadTodosInputSchema,
38
+ };
39
+ }
@@ -4,4 +4,4 @@ import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
4
4
  *
5
5
  * @returns Configured detect domains tool
6
6
  */
7
- export declare function createDetectDomainsTool(): Tool;
7
+ export declare function createSpecAnalyzeTool(): Tool;
@@ -1,17 +1,17 @@
1
1
  import { z } from 'zod';
2
- import { CONTEXT_TREE_DOMAINS } from '../../../../config/context-tree-domains.js';
2
+ import { DEFAULT_CONTEXT_TREE_DOMAINS } from '../../../../config/context-tree-domains.js';
3
3
  import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
4
4
  /**
5
5
  * Predefined domain category names for validation reference
6
6
  */
7
- const PREDEFINED_DOMAIN_NAMES = CONTEXT_TREE_DOMAINS.map((domain) => domain.name);
7
+ const PREDEFINED_DOMAIN_NAMES = DEFAULT_CONTEXT_TREE_DOMAINS.map((domain) => domain.name);
8
8
  /**
9
9
  * Domain category for knowledge classification.
10
10
  */
11
11
  const DomainCategory = z
12
12
  .string()
13
13
  .min(1)
14
- .describe(`Domain category name. Must be one of the predefined categories: ${PREDEFINED_DOMAIN_NAMES.join(', ')}`);
14
+ .describe(`Domain category name. Prefer using predefined domains: ${PREDEFINED_DOMAIN_NAMES.join(', ')}. Custom domains are allowed but limited to 3 maximum.`);
15
15
  /**
16
16
  * Text segment schema - represents a portion of the input data related to a domain
17
17
  */
@@ -49,8 +49,8 @@ async function executeDetectDomains(input, _context) {
49
49
  *
50
50
  * @returns Configured detect domains tool
51
51
  */
52
- export function createDetectDomainsTool() {
53
- const domainDescriptions = CONTEXT_TREE_DOMAINS.map((domain) => ` - ${domain.name}: ${domain.description}`).join('\n');
52
+ export function createSpecAnalyzeTool() {
53
+ const domainDescriptions = DEFAULT_CONTEXT_TREE_DOMAINS.map((domain) => ` - ${domain.name}: ${domain.description}`).join('\n');
54
54
  return {
55
55
  description: `Use this tool to analyze input data and detect which predefined knowledge domains are present. For each detected domain, you must also extract the specific text segments from the input data that relate to that domain.
56
56
 
@@ -60,14 +60,16 @@ Predefined domain categories:
60
60
  ${domainDescriptions}
61
61
 
62
62
  For each domain you detect:
63
- 1. Identify the domain category (must be one of the predefined categories above)
63
+ 1. Identify the domain category from the predefined list above. Only create a custom domain if the content clearly does not fit any predefined domain (max 3 custom domains allowed)
64
64
  2. Extract relevant text segments from the input data that demonstrate why this domain is relevant
65
65
  3. Each text segment should be a meaningful excerpt (not just keywords) that shows the connection to the domain
66
66
  4. Only include domains that are actually present in the data - do not include domains just because they exist in the predefined list
67
67
 
68
+ **Important:** Always prefer predefined domains over custom ones to maintain query quality and ease of maintenance.
69
+
68
70
  The text segments will be used later to create organized knowledge topics, so they should be substantial enough to provide context.`,
69
71
  execute: executeDetectDomains,
70
- id: ToolName.DETECT_DOMAINS,
72
+ id: ToolName.SPEC_ANALYZE,
71
73
  inputSchema: DetectDomainsInputSchema,
72
74
  };
73
75
  }
@@ -0,0 +1,34 @@
1
+ import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
2
+ import type { SessionManager } from '../../session/session-manager.js';
3
+ /**
4
+ * Tool name constant for task tool.
5
+ */
6
+ export declare const TASK_TOOL_NAME: "task";
7
+ /**
8
+ * Lazy getter for session manager (avoids circular dependency).
9
+ */
10
+ export type SessionManagerGetter = () => SessionManager | undefined;
11
+ /**
12
+ * Dependencies for creating the task tool.
13
+ */
14
+ export interface TaskToolDependencies {
15
+ /**
16
+ * Lazy getter for session manager.
17
+ * SessionManager is created after ToolProvider, so we need a getter.
18
+ */
19
+ getSessionManager: SessionManagerGetter;
20
+ }
21
+ /**
22
+ * Create task tool.
23
+ *
24
+ * Delegates work to specialized subagents for complex tasks.
25
+ * Each subagent runs in its own session with agent-specific prompts and tool restrictions.
26
+ *
27
+ * Available subagents:
28
+ * - query: Search and retrieve information from the context tree
29
+ * - curate: Create or update knowledge topics in the context tree
30
+ *
31
+ * @param dependencies - Session manager and system prompt manager
32
+ * @returns task tool instance
33
+ */
34
+ export declare function createTaskTool(dependencies: TaskToolDependencies): Tool;
@@ -0,0 +1,207 @@
1
+ import { z } from 'zod';
2
+ import { getAgentRegistry } from '../../../../core/domain/cipher/agent/agent-registry.js';
3
+ import { createContextTreeFileSystem } from '../../file-system/context-tree-file-system-factory.js';
4
+ /**
5
+ * Tool name constant for task tool.
6
+ */
7
+ export const TASK_TOOL_NAME = 'task';
8
+ /**
9
+ * Input schema for task tool.
10
+ */
11
+ const TaskInputSchema = z
12
+ .object({
13
+ /**
14
+ * If true, restricts file operations to .brv/context-tree/ only.
15
+ * Use this for query commands to search only curated knowledge.
16
+ */
17
+ contextTreeOnly: z
18
+ .boolean()
19
+ .optional()
20
+ .default(false)
21
+ .describe('If true, restricts file operations to .brv/context-tree/ only'),
22
+ /**
23
+ * Short description of the task (3-5 words).
24
+ * Used for display and tracking purposes.
25
+ */
26
+ description: z.string().min(1).max(100).describe('Short description of the task (3-5 words)'),
27
+ /**
28
+ * Detailed prompt/instructions for the subagent.
29
+ * Should include all context needed to complete the task.
30
+ */
31
+ prompt: z.string().min(1).describe('Detailed instructions for the subagent'),
32
+ /**
33
+ * Optional session ID to continue an existing subagent session.
34
+ * If not provided, a new session will be created.
35
+ */
36
+ sessionId: z.string().optional().describe('Optional: continue existing subagent session'),
37
+ /**
38
+ * The type of subagent to use.
39
+ * Must be a registered subagent name (e.g., "query", "curate").
40
+ */
41
+ subagentType: z.string().min(1).describe('Which subagent to use (e.g., "explore", "curate")'),
42
+ })
43
+ .strict();
44
+ /**
45
+ * Create task tool.
46
+ *
47
+ * Delegates work to specialized subagents for complex tasks.
48
+ * Each subagent runs in its own session with agent-specific prompts and tool restrictions.
49
+ *
50
+ * Available subagents:
51
+ * - query: Search and retrieve information from the context tree
52
+ * - curate: Create or update knowledge topics in the context tree
53
+ *
54
+ * @param dependencies - Session manager and system prompt manager
55
+ * @returns task tool instance
56
+ */
57
+ export function createTaskTool(dependencies) {
58
+ const { getSessionManager } = dependencies;
59
+ const registry = getAgentRegistry();
60
+ return {
61
+ description: buildTaskToolDescription(registry),
62
+ async execute(input, context) {
63
+ const params = input;
64
+ const { contextTreeOnly, description, prompt, sessionId, subagentType } = params;
65
+ // Get session manager (lazy loaded)
66
+ const sessionManager = getSessionManager();
67
+ if (!sessionManager) {
68
+ return {
69
+ agent: subagentType,
70
+ description,
71
+ error: 'SessionManager is not available. Task tool requires an active agent session.',
72
+ output: '',
73
+ sessionId: '',
74
+ success: false,
75
+ };
76
+ }
77
+ // Validate subagent exists
78
+ const agent = registry.get(subagentType);
79
+ if (!agent) {
80
+ const availableAgents = registry
81
+ .listSubagents()
82
+ .map((a) => a.name)
83
+ .join(', ');
84
+ return {
85
+ agent: subagentType,
86
+ description,
87
+ error: `Unknown subagent type '${subagentType}'. Available subagents: ${availableAgents}`,
88
+ output: '',
89
+ sessionId: '',
90
+ success: false,
91
+ };
92
+ }
93
+ // Validate agent can be used as subagent
94
+ if (agent.mode === 'primary') {
95
+ return {
96
+ agent: subagentType,
97
+ description,
98
+ error: `Agent '${subagentType}' is a primary agent and cannot be used as a subagent.`,
99
+ output: '',
100
+ sessionId: '',
101
+ success: false,
102
+ };
103
+ }
104
+ // Generate session ID for the subagent
105
+ const subagentSessionId = sessionId ?? `${subagentType}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
106
+ try {
107
+ // Get or create session for the subagent
108
+ // If contextTreeOnly is true, create a session with restricted file system
109
+ let session;
110
+ if (contextTreeOnly) {
111
+ // Create a restricted FileSystemService for context-tree only access
112
+ const restrictedFs = createContextTreeFileSystem(process.cwd());
113
+ await restrictedFs.initialize();
114
+ // Create session with restricted file system
115
+ session = await sessionManager.createChildSessionWithOverrides(context?.sessionId ?? 'parent', agent.name, subagentSessionId, { fileSystemService: restrictedFs });
116
+ }
117
+ else {
118
+ session = await sessionManager.createSession(subagentSessionId);
119
+ }
120
+ // Build the system prompt for the subagent
121
+ // The agent's promptFile will be used by the SystemPromptManager
122
+ const agentPromptSection = agent.promptFile
123
+ ? `\n\n[Agent: ${agent.name}]\nUsing prompt from: ${agent.promptFile}`
124
+ : agent.prompt
125
+ ? `\n\n[Agent: ${agent.name}]\n${agent.prompt}`
126
+ : '';
127
+ // Construct the full message for the subagent
128
+ const fullPrompt = `${agentPromptSection}\n\n## Task\n${prompt}`;
129
+ // Stream progress update
130
+ if (context?.metadata) {
131
+ context.metadata({
132
+ description: `Running ${agent.name} subagent`,
133
+ output: `Task: ${description}`,
134
+ progress: 10,
135
+ });
136
+ }
137
+ // Execute the subagent session with parent's taskId for billing tracking
138
+ const response = await session.run(fullPrompt, { taskId: context?.taskId });
139
+ // Stream completion update
140
+ if (context?.metadata) {
141
+ context.metadata({
142
+ description: `${agent.name} subagent completed`,
143
+ output: response.slice(0, 200) + (response.length > 200 ? '...' : ''),
144
+ progress: 100,
145
+ });
146
+ }
147
+ return {
148
+ agent: agent.name,
149
+ description,
150
+ output: response,
151
+ sessionId: subagentSessionId,
152
+ success: true,
153
+ };
154
+ }
155
+ catch (error) {
156
+ const errorMessage = error instanceof Error ? error.message : String(error);
157
+ // Stream error update
158
+ if (context?.metadata) {
159
+ context.metadata({
160
+ description: `${agent.name} subagent failed`,
161
+ output: errorMessage,
162
+ progress: 100,
163
+ });
164
+ }
165
+ return {
166
+ agent: agent.name,
167
+ description,
168
+ error: errorMessage,
169
+ output: '',
170
+ sessionId: subagentSessionId,
171
+ success: false,
172
+ };
173
+ }
174
+ },
175
+ id: TASK_TOOL_NAME,
176
+ inputSchema: TaskInputSchema,
177
+ };
178
+ }
179
+ /**
180
+ * Build the task tool description dynamically based on available subagents.
181
+ *
182
+ * @param registry - Agent registry to get subagent descriptions
183
+ * @returns Tool description string
184
+ */
185
+ function buildTaskToolDescription(registry) {
186
+ const subagents = registry.listSubagents();
187
+ const subagentList = subagents.map((agent) => `- ${agent.name}: ${agent.description || 'No description'}`).join('\n');
188
+ return `Delegate work to a specialized subagent for complex tasks.
189
+
190
+ Available subagents:
191
+ ${subagentList}
192
+
193
+ Use this tool when you need to:
194
+ - Search the context tree for existing information (use 'explore' subagent with contextTreeOnly=true)
195
+ - Search the codebase for information (use 'explore' subagent without contextTreeOnly)
196
+ - Create or update knowledge topics (use 'curate' subagent)
197
+
198
+ Each subagent runs with its own specialized configuration and tool access.
199
+ The subagent will execute and return its results to you.
200
+
201
+ Parameters:
202
+ - subagent_type: Which subagent to use (e.g., "explore", "curate")
203
+ - description: Short description of the task (3-5 words)
204
+ - prompt: Detailed instructions for the subagent
205
+ - context_tree_only: (Optional) If true, restricts file operations to .brv/context-tree/ only. Use this for query commands.
206
+ - session_id: (Optional) Continue an existing subagent session`;
207
+ }
@@ -1,10 +1,13 @@
1
1
  import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
2
+ import type { ITodoStorage } from '../../../../core/interfaces/cipher/i-todo-storage.js';
2
3
  /**
3
4
  * Creates the write todos tool.
4
5
  *
5
6
  * Manages a structured task list for planning-based execution.
6
7
  * Validates that only one task is in_progress at any time.
8
+ * Stores todos in session-based storage.
7
9
  *
10
+ * @param todoStorage - Storage service for persisting todos
8
11
  * @returns Configured write todos tool
9
12
  */
10
- export declare function createWriteTodosTool(): Tool;
13
+ export declare function createWriteTodosTool(todoStorage: ITodoStorage): Tool;
@@ -10,6 +10,7 @@ const TodoSchema = z.object({
10
10
  .min(1)
11
11
  .describe('Present continuous form shown during execution (e.g., "Running tests")'),
12
12
  content: z.string().min(1).describe('Imperative description of the task (e.g., "Run tests")'),
13
+ id: z.string().min(1).describe('Unique identifier for the todo item'),
13
14
  status: z
14
15
  .enum(TODO_STATUSES)
15
16
  .describe('Task status: pending, in_progress (only ONE at a time), completed, or cancelled'),
@@ -26,38 +27,7 @@ const WriteTodosInputSchema = z
26
27
  * Tool description with detailed usage guidance.
27
28
  * This helps the LLM understand when to use the tool and how.
28
29
  */
29
- const TOOL_DESCRIPTION = `Use this tool to create and manage a structured task list for the current session. This helps track progress, organize complex tasks, and demonstrate thoroughness to the user.
30
-
31
- ## When to Use This Tool
32
- Use this tool proactively in these scenarios:
33
-
34
- 1. **Complex multi-step tasks** - When a task requires 3 or more distinct steps
35
- 2. **Non-trivial and complex tasks** - Tasks that require careful planning or multiple operations
36
- 3. **User explicitly requests todo list** - When the user directly asks to use the todo list
37
- 4. **User provides multiple tasks** - When users provide a list of things to be done
38
- 5. **After receiving new instructions** - Immediately capture user requirements as todos
39
- 6. **When you start working on a task** - Mark it as in_progress BEFORE beginning work
40
- 7. **After completing a task** - Mark it as completed and add any follow-up tasks
41
-
42
- ## When NOT to Use This Tool
43
- Skip using this tool when:
44
- 1. There is only a single, straightforward task
45
- 2. The task is trivial and tracking provides no organizational benefit
46
- 3. The task can be completed in less than 3 trivial steps
47
- 4. The task is purely conversational or informational
48
-
49
- ## Task States
50
- - **pending**: Task not yet started
51
- - **in_progress**: Currently working on (limit to ONE task at a time)
52
- - **completed**: Task finished successfully
53
- - **cancelled**: Task no longer needed
54
-
55
- ## Important Rules
56
- - ONLY ONE task can be "in_progress" at any time
57
- - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)
58
- - Task descriptions need both forms:
59
- - content: Imperative form (e.g., "Run tests")
60
- - activeForm: Present continuous form (e.g., "Running tests")`;
30
+ const TOOL_DESCRIPTION = `Use this tool to create and manage a structured task list for the current session.`;
61
31
  /**
62
32
  * Validates that only one todo is in_progress.
63
33
  *
@@ -73,6 +43,7 @@ function validateSingleInProgress(todos) {
73
43
  }
74
44
  /**
75
45
  * Formats the todo list for LLM response.
46
+ * Uses opencode-style status icons: [✓] for completed, [ ] for others.
76
47
  *
77
48
  * @param todos - Array of todos
78
49
  * @returns Formatted string representation
@@ -80,14 +51,12 @@ function validateSingleInProgress(todos) {
80
51
  function formatTodosForLLM(todos) {
81
52
  const lines = ['Todo list updated:'];
82
53
  for (const todo of todos) {
83
- const statusIcon = getStatusIcon(todo.status);
84
- lines.push(`${statusIcon} [${todo.status}] ${todo.content}`);
54
+ const checkbox = todo.status === 'completed' ? '[✓]' : '[ ]';
55
+ const statusLabel = todo.status === 'in_progress' ? ' (in_progress)' : '';
56
+ lines.push(`${checkbox} ${todo.content}${statusLabel}`);
85
57
  }
86
58
  const stats = getTodoStats(todos);
87
- const progressLines = [
88
- '',
89
- `Progress: ${stats.completed}/${stats.total} completed`,
90
- ];
59
+ const progressLines = ['', `Progress: ${stats.completed}/${stats.total} completed`];
91
60
  if (stats.inProgress > 0) {
92
61
  const currentTask = todos.find((t) => t.status === 'in_progress');
93
62
  if (currentTask) {
@@ -96,28 +65,6 @@ function formatTodosForLLM(todos) {
96
65
  }
97
66
  return [...lines, ...progressLines].join('\n');
98
67
  }
99
- /**
100
- * Gets icon for todo status.
101
- *
102
- * @param status - Todo status
103
- * @returns Status icon
104
- */
105
- function getStatusIcon(status) {
106
- switch (status) {
107
- case 'cancelled': {
108
- return '⊘';
109
- }
110
- case 'completed': {
111
- return '✓';
112
- }
113
- case 'in_progress': {
114
- return '→';
115
- }
116
- case 'pending': {
117
- return '○';
118
- }
119
- }
120
- }
121
68
  /**
122
69
  * Gets statistics about the todo list.
123
70
  *
@@ -138,25 +85,34 @@ function getTodoStats(todos) {
138
85
  *
139
86
  * Manages a structured task list for planning-based execution.
140
87
  * Validates that only one task is in_progress at any time.
88
+ * Stores todos in session-based storage.
141
89
  *
90
+ * @param todoStorage - Storage service for persisting todos
142
91
  * @returns Configured write todos tool
143
92
  */
144
- export function createWriteTodosTool() {
93
+ export function createWriteTodosTool(todoStorage) {
145
94
  return {
146
95
  description: TOOL_DESCRIPTION,
147
- async execute(input, _context) {
96
+ async execute(input, context) {
148
97
  const { todos } = input;
149
98
  // Validate only one in_progress
150
99
  const validationError = validateSingleInProgress(todos);
151
100
  if (validationError) {
152
101
  return validationError;
153
102
  }
103
+ // Store todos in session storage
104
+ const sessionId = context?.sessionId ?? 'default';
105
+ await todoStorage.update(sessionId, todos);
154
106
  // Format response for LLM
155
107
  const llmContent = formatTodosForLLM(todos);
156
- // Return both LLM content and display content
108
+ // Calculate incomplete count for smart title
109
+ const incompleteCount = todos.filter((t) => t.status !== 'completed').length;
110
+ // Return both LLM content and display content with metadata
157
111
  return {
158
112
  llmContent,
113
+ metadata: { todos },
159
114
  returnDisplay: { todos },
115
+ title: `${incompleteCount} todos`,
160
116
  };
161
117
  },
162
118
  id: ToolName.WRITE_TODOS,
@@ -4,12 +4,12 @@ export type { KnownTool } from '../../../core/domain/cipher/tools/constants.js';
4
4
  export type { JSONSchema7, Tool, ToolExecutionContext, ToolSet } from '../../../core/domain/cipher/tools/types.js';
5
5
  export type { IToolProvider } from '../../../core/interfaces/cipher/i-tool-provider.js';
6
6
  export { createCreateKnowledgeTopicTool } from './implementations/create-knowledge-topic-tool.js';
7
- export { createDetectDomainsTool } from './implementations/detect-domains-tool.js';
8
7
  export { createEditFileTool } from './implementations/edit-file-tool.js';
9
8
  export { createGlobFilesTool } from './implementations/glob-files-tool.js';
10
9
  export { createGrepContentTool } from './implementations/grep-content-tool.js';
11
10
  export { createReadFileTool } from './implementations/read-file-tool.js';
12
11
  export { createSearchHistoryTool } from './implementations/search-history-tool.js';
12
+ export { createSpecAnalyzeTool } from './implementations/spec-analyze-tool.js';
13
13
  export { createWriteFileTool } from './implementations/write-file-tool.js';
14
14
  export { ToolManager } from './tool-manager.js';
15
15
  export { ToolProvider } from './tool-provider.js';
@@ -4,12 +4,12 @@ export { ToolError, ToolExecutionError, ToolNotFoundError, ToolProviderNotInitia
4
4
  export { ToolName } from '../../../core/domain/cipher/tools/constants.js';
5
5
  // Tool implementations (for direct access if needed)
6
6
  export { createCreateKnowledgeTopicTool } from './implementations/create-knowledge-topic-tool.js';
7
- export { createDetectDomainsTool } from './implementations/detect-domains-tool.js';
8
7
  export { createEditFileTool } from './implementations/edit-file-tool.js';
9
8
  export { createGlobFilesTool } from './implementations/glob-files-tool.js';
10
9
  export { createGrepContentTool } from './implementations/grep-content-tool.js';
11
10
  export { createReadFileTool } from './implementations/read-file-tool.js';
12
11
  export { createSearchHistoryTool } from './implementations/search-history-tool.js';
12
+ export { createSpecAnalyzeTool } from './implementations/spec-analyze-tool.js';
13
13
  export { createWriteFileTool } from './implementations/write-file-tool.js';
14
14
  // Registry and provider
15
15
  export { ToolManager } from './tool-manager.js';