byterover-cli 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/README.md +1 -9
  2. package/dist/commands/curate.d.ts +1 -3
  3. package/dist/commands/curate.js +14 -51
  4. package/dist/commands/main.d.ts +8 -0
  5. package/dist/commands/main.js +29 -8
  6. package/dist/commands/query.d.ts +1 -3
  7. package/dist/commands/query.js +8 -35
  8. package/dist/config/context-tree-domains.d.ts +5 -0
  9. package/dist/config/context-tree-domains.js +6 -1
  10. package/dist/config/environment.js +9 -9
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.js +18 -0
  13. package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
  14. package/dist/core/domain/cipher/agent/agent-info.js +143 -0
  15. package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
  16. package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
  17. package/dist/core/domain/cipher/agent/index.d.ts +4 -1
  18. package/dist/core/domain/cipher/agent/index.js +7 -1
  19. package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
  20. package/dist/core/domain/cipher/agent-events/types.js +11 -0
  21. package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
  22. package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
  23. package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
  24. package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
  25. package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
  26. package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
  27. package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
  28. package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
  29. package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
  30. package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
  31. package/dist/core/domain/cipher/llm/error-codes.js +51 -0
  32. package/dist/core/domain/cipher/llm/index.d.ts +9 -0
  33. package/dist/core/domain/cipher/llm/index.js +13 -0
  34. package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
  35. package/dist/core/domain/cipher/llm/registry.js +244 -0
  36. package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
  37. package/dist/core/domain/cipher/llm/schemas.js +151 -0
  38. package/dist/core/domain/cipher/llm/types.d.ts +121 -0
  39. package/dist/core/domain/cipher/llm/types.js +60 -0
  40. package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
  41. package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
  42. package/dist/core/domain/cipher/streaming/types.js +16 -0
  43. package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
  44. package/dist/core/domain/cipher/todos/types.d.ts +34 -0
  45. package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
  46. package/dist/core/domain/cipher/tools/constants.js +5 -2
  47. package/dist/core/domain/cipher/tools/types.d.ts +31 -0
  48. package/dist/core/domain/entities/event.d.ts +1 -1
  49. package/dist/core/domain/entities/event.js +3 -1
  50. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  51. package/dist/core/domain/errors/connection-error.js +54 -0
  52. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  53. package/dist/core/domain/errors/core-process-error.js +43 -0
  54. package/dist/core/domain/errors/task-error.d.ts +64 -0
  55. package/dist/core/domain/errors/task-error.js +116 -0
  56. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  57. package/dist/core/domain/errors/transport-error.js +114 -0
  58. package/dist/core/domain/instance/index.d.ts +1 -0
  59. package/dist/core/domain/instance/index.js +1 -0
  60. package/dist/core/domain/instance/types.d.ts +57 -0
  61. package/dist/core/domain/instance/types.js +72 -0
  62. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  63. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  64. package/dist/core/domain/transport/index.d.ts +2 -0
  65. package/dist/core/domain/transport/index.js +2 -0
  66. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  67. package/dist/core/domain/transport/schemas.js +554 -0
  68. package/dist/core/domain/transport/types.d.ts +67 -0
  69. package/dist/core/domain/transport/types.js +7 -0
  70. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  71. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  72. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  73. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  74. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  75. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  76. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  77. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  79. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  80. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  81. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  82. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  83. package/dist/core/interfaces/cipher/index.js +11 -0
  84. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  85. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  86. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  87. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  88. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  89. package/dist/core/interfaces/cipher/message-types.js +6 -0
  90. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  91. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  92. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  93. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  94. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  95. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  96. package/dist/core/interfaces/executor/index.d.ts +2 -0
  97. package/dist/core/interfaces/executor/index.js +2 -0
  98. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  99. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  100. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  101. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  102. package/dist/core/interfaces/instance/index.d.ts +2 -0
  103. package/dist/core/interfaces/instance/index.js +2 -0
  104. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  105. package/dist/core/interfaces/noop-implementations.js +62 -0
  106. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  107. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  108. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  109. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  110. package/dist/core/interfaces/transport/index.d.ts +2 -0
  111. package/dist/core/interfaces/transport/index.js +2 -0
  112. package/dist/hooks/init/welcome.js +9 -24
  113. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  114. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  115. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  116. package/dist/infra/cipher/agent/agent-error.js +79 -0
  117. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  118. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  119. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  120. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  121. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  122. package/dist/infra/cipher/agent/base-agent.js +240 -0
  123. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  124. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  125. package/dist/infra/cipher/agent/index.d.ts +22 -0
  126. package/dist/infra/cipher/agent/index.js +24 -0
  127. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  128. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  129. package/dist/infra/cipher/agent/types.d.ts +35 -0
  130. package/dist/infra/cipher/agent/types.js +1 -0
  131. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  132. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  133. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  134. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  135. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  136. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  137. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  138. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  139. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  140. package/dist/infra/cipher/consumer/index.js +2 -1
  141. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  142. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  143. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  144. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  145. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  146. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  147. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  148. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  149. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  150. package/dist/infra/cipher/interactive-loop.js +41 -33
  151. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  152. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  153. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  154. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  155. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  156. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  157. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  158. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  159. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  160. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  161. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  162. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  163. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  164. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  165. package/dist/infra/cipher/llm/context/utils.js +17 -4
  166. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  167. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  168. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  169. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  170. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  171. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  172. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  173. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  174. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  175. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  176. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  177. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  178. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  179. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  180. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  181. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  182. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  183. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  184. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  185. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  186. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  187. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  188. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  189. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  190. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  191. package/dist/infra/cipher/process/command-validator.js +75 -0
  192. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  193. package/dist/infra/cipher/process/path-utils.js +94 -0
  194. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  195. package/dist/infra/cipher/process/process-service.js +98 -17
  196. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  197. package/dist/infra/cipher/session/chat-session.js +163 -13
  198. package/dist/infra/cipher/session/index.d.ts +1 -0
  199. package/dist/infra/cipher/session/index.js +2 -0
  200. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  201. package/dist/infra/cipher/session/message-queue.js +90 -0
  202. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  203. package/dist/infra/cipher/session/session-manager.js +254 -7
  204. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  205. package/dist/infra/cipher/session/session-status.js +184 -0
  206. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  207. package/dist/infra/cipher/session/title-generator.js +31 -0
  208. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  209. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  210. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  211. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  212. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  213. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  214. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  215. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  216. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  217. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  218. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  219. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  220. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  221. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  222. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  223. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  224. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  225. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  226. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  227. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  228. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  229. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  230. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  231. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  232. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  233. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  234. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  235. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  236. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  237. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  238. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  239. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  240. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  241. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  242. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  243. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  244. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  245. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  246. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  247. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  249. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  250. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  251. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  252. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  253. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  254. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  255. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  256. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  257. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  258. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  259. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  260. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  261. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  262. package/dist/infra/cipher/tools/index.d.ts +1 -1
  263. package/dist/infra/cipher/tools/index.js +1 -1
  264. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  265. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  266. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  267. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  268. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  269. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  270. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  271. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  272. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  273. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  274. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  275. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  276. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  277. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  278. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  279. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  280. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  281. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  282. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  283. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  284. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  285. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  286. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  287. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  288. package/dist/infra/context-tree/path-utils.js +7 -0
  289. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  290. package/dist/infra/core/executors/curate-executor.js +123 -0
  291. package/dist/infra/core/executors/index.d.ts +2 -0
  292. package/dist/infra/core/executors/index.js +2 -0
  293. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  294. package/dist/infra/core/executors/query-executor.js +51 -0
  295. package/dist/infra/core/task-processor.d.ts +81 -0
  296. package/dist/infra/core/task-processor.js +115 -0
  297. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  298. package/dist/infra/instance/file-instance-discovery.js +84 -0
  299. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  300. package/dist/infra/instance/file-instance-manager.js +123 -0
  301. package/dist/infra/instance/index.d.ts +3 -0
  302. package/dist/infra/instance/index.js +3 -0
  303. package/dist/infra/instance/process-utils.d.ts +14 -0
  304. package/dist/infra/instance/process-utils.js +39 -0
  305. package/dist/infra/process/agent-worker.d.ts +20 -0
  306. package/dist/infra/process/agent-worker.js +602 -0
  307. package/dist/infra/process/index.d.ts +12 -0
  308. package/dist/infra/process/index.js +11 -0
  309. package/dist/infra/process/ipc-types.d.ts +55 -0
  310. package/dist/infra/process/ipc-types.js +12 -0
  311. package/dist/infra/process/process-manager.d.ts +154 -0
  312. package/dist/infra/process/process-manager.js +471 -0
  313. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  314. package/dist/infra/process/task-queue-manager.js +226 -0
  315. package/dist/infra/process/transport-handlers.d.ts +124 -0
  316. package/dist/infra/process/transport-handlers.js +348 -0
  317. package/dist/infra/process/transport-worker.d.ts +20 -0
  318. package/dist/infra/process/transport-worker.js +168 -0
  319. package/dist/infra/repl/commands/curate-command.js +0 -5
  320. package/dist/infra/repl/commands/query-command.js +0 -3
  321. package/dist/infra/repl/repl-startup.d.ts +4 -0
  322. package/dist/infra/repl/repl-startup.js +10 -1
  323. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  324. package/dist/infra/repl/transport-client-helper.js +96 -0
  325. package/dist/infra/transport/index.d.ts +4 -0
  326. package/dist/infra/transport/index.js +4 -0
  327. package/dist/infra/transport/port-utils.d.ts +42 -0
  328. package/dist/infra/transport/port-utils.js +84 -0
  329. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  330. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  331. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  332. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  333. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  334. package/dist/infra/transport/transport-client-factory.js +168 -0
  335. package/dist/infra/transport/transport-factory.d.ts +33 -0
  336. package/dist/infra/transport/transport-factory.js +59 -0
  337. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  338. package/dist/infra/usecase/curate-use-case.js +73 -259
  339. package/dist/infra/usecase/init-use-case.js +19 -8
  340. package/dist/infra/usecase/login-use-case.js +9 -3
  341. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  342. package/dist/infra/usecase/query-use-case.js +251 -326
  343. package/dist/infra/usecase/status-use-case.js +1 -1
  344. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  345. package/dist/resources/prompts/explore.yml +78 -0
  346. package/dist/resources/prompts/plan.yml +114 -0
  347. package/dist/resources/prompts/reflection.yml +1 -1
  348. package/dist/resources/prompts/system-prompt.yml +15 -8
  349. package/dist/resources/prompts/tool-outputs.yml +0 -5
  350. package/dist/resources/tools/bash_exec.txt +98 -0
  351. package/dist/resources/tools/bash_output.txt +40 -0
  352. package/dist/resources/tools/batch.txt +28 -0
  353. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  354. package/dist/resources/tools/curate.txt +22 -0
  355. package/dist/resources/tools/delete_memory.txt +1 -0
  356. package/dist/resources/tools/detect_domains.txt +11 -0
  357. package/dist/resources/tools/edit_file.txt +1 -0
  358. package/dist/resources/tools/edit_memory.txt +1 -0
  359. package/dist/resources/tools/glob_files.txt +20 -0
  360. package/dist/resources/tools/grep_content.txt +18 -0
  361. package/dist/resources/tools/kill_process.txt +16 -0
  362. package/dist/resources/tools/list_directory.txt +16 -0
  363. package/dist/resources/tools/list_memories.txt +1 -0
  364. package/dist/resources/tools/read_file.txt +31 -0
  365. package/dist/resources/tools/read_memory.txt +1 -0
  366. package/dist/resources/tools/read_todos.txt +17 -0
  367. package/dist/resources/tools/search_history.txt +1 -0
  368. package/dist/resources/tools/task.txt +23 -0
  369. package/dist/resources/tools/write_file.txt +1 -0
  370. package/dist/resources/tools/write_memory.txt +1 -0
  371. package/dist/resources/tools/write_todos.txt +29 -0
  372. package/dist/tui/app.js +9 -13
  373. package/dist/tui/components/command-details.d.ts +14 -0
  374. package/dist/tui/components/command-details.js +35 -0
  375. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  376. package/dist/tui/components/execution/execution-changes.js +19 -4
  377. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  378. package/dist/tui/components/execution/execution-content.js +26 -13
  379. package/dist/tui/components/execution/execution-input.js +3 -3
  380. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  381. package/dist/tui/components/execution/execution-progress.js +8 -6
  382. package/dist/tui/components/execution/log-item.d.ts +3 -4
  383. package/dist/tui/components/execution/log-item.js +2 -5
  384. package/dist/tui/components/footer.js +9 -4
  385. package/dist/tui/components/header.d.ts +3 -3
  386. package/dist/tui/components/header.js +5 -3
  387. package/dist/tui/components/index.d.ts +1 -0
  388. package/dist/tui/components/index.js +1 -0
  389. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  390. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  391. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  392. package/dist/tui/components/scrollable-list.js +12 -10
  393. package/dist/tui/components/suggestions.js +39 -41
  394. package/dist/tui/components/tab-bar.d.ts +2 -1
  395. package/dist/tui/components/tab-bar.js +3 -4
  396. package/dist/tui/constants.d.ts +0 -5
  397. package/dist/tui/constants.js +0 -5
  398. package/dist/tui/contexts/auth-context.js +9 -2
  399. package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
  400. package/dist/tui/contexts/index.d.ts +6 -1
  401. package/dist/tui/contexts/index.js +6 -1
  402. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  403. package/dist/tui/contexts/onboarding-context.js +9 -9
  404. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  405. package/dist/tui/contexts/tasks-context.js +218 -0
  406. package/dist/tui/contexts/transport-context.d.ts +29 -0
  407. package/dist/tui/contexts/transport-context.js +82 -0
  408. package/dist/tui/hooks/index.d.ts +10 -6
  409. package/dist/tui/hooks/index.js +7 -6
  410. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  411. package/dist/tui/hooks/use-activity-logs.js +87 -34
  412. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  413. package/dist/tui/hooks/use-auth-polling.js +104 -0
  414. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  415. package/dist/tui/hooks/use-slash-completion.js +1 -1
  416. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  417. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  418. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  419. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  420. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  421. package/dist/tui/hooks/use-ui-heights.js +88 -0
  422. package/dist/tui/providers/app-providers.js +2 -6
  423. package/dist/tui/types/commands.d.ts +0 -26
  424. package/dist/tui/types/index.d.ts +1 -1
  425. package/dist/tui/types/ui.d.ts +9 -4
  426. package/dist/tui/utils/line.d.ts +11 -0
  427. package/dist/tui/utils/line.js +16 -0
  428. package/dist/tui/utils/log.d.ts +27 -0
  429. package/dist/tui/utils/log.js +114 -0
  430. package/dist/tui/views/command-view.d.ts +7 -0
  431. package/dist/tui/views/command-view.js +103 -80
  432. package/dist/tui/views/login-view.js +7 -4
  433. package/dist/tui/views/logs-view.d.ts +13 -0
  434. package/dist/tui/views/logs-view.js +27 -52
  435. package/dist/utils/connection-error-handler.d.ts +16 -0
  436. package/dist/utils/connection-error-handler.js +49 -0
  437. package/dist/utils/crash-log.d.ts +14 -0
  438. package/dist/utils/crash-log.js +19 -0
  439. package/dist/utils/file-helpers.d.ts +14 -0
  440. package/dist/utils/file-helpers.js +21 -0
  441. package/dist/utils/global-logs-path.d.ts +11 -0
  442. package/dist/utils/global-logs-path.js +37 -0
  443. package/dist/utils/process-logger.d.ts +53 -0
  444. package/dist/utils/process-logger.js +253 -0
  445. package/dist/utils/sandbox-detector.d.ts +31 -0
  446. package/dist/utils/sandbox-detector.js +122 -0
  447. package/oclif.manifest.json +10 -198
  448. package/package.json +5 -1
  449. package/dist/commands/cipher-agent/run.d.ts +0 -142
  450. package/dist/commands/cipher-agent/run.js +0 -555
  451. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  452. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  453. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  454. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  455. package/dist/commands/foo.d.ts +0 -14
  456. package/dist/commands/foo.js +0 -66
  457. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  458. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  459. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  460. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  461. package/dist/infra/cipher/cipher-agent.js +0 -317
  462. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  463. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  464. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  465. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  466. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  467. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  468. package/dist/tui/contexts/consumer.d.ts +0 -31
  469. package/dist/tui/contexts/consumer.js +0 -56
  470. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  471. package/dist/tui/hooks/use-consumer.js +0 -50
  472. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  473. package/dist/tui/hooks/use-queue-polling.js +0 -90
  474. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  475. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  476. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  477. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  478. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -1,7 +1,8 @@
1
+ // TODO(v0.5.0): Remove this file. ExecutionConsumer is replaced by TaskProcessor.
1
2
  import { randomUUID } from 'node:crypto';
2
3
  import { getCurrentConfig } from '../../../config/environment.js';
3
4
  import { PROJECT } from '../../../constants.js';
4
- import { CipherAgent } from '../cipher-agent.js';
5
+ import { CipherAgent } from '../agent/index.js';
5
6
  import { closeAgentStorage, getAgentStorage, getAgentStorageSync } from '../storage/agent-storage.js';
6
7
  // Heartbeat interval for consumer liveness detection (10 seconds)
7
8
  const HEARTBEAT_INTERVAL_MS = 1000;
@@ -176,17 +177,23 @@ export class ExecutionConsumer {
176
177
  // console.log(`[Consumer] Stopped (${this.consumerId.slice(0, 8)})`)
177
178
  }
178
179
  /**
179
- * Execute a curate job
180
+ * Execute a curate job using the Plan Agent for orchestration.
181
+ *
182
+ * The Plan Agent orchestrates the curation workflow by:
183
+ * 1. Analyzing the user's request
184
+ * 2. Delegating to Query subagent to find existing context
185
+ * 3. Delegating to Curate subagent to create/update topics
180
186
  */
181
187
  async executeCurate(execution) {
182
188
  const storage = getAgentStorageSync();
183
- // Parse input
189
+ // Parse input - support both JSON format (legacy/v2) and plain text
184
190
  let input;
185
191
  try {
186
192
  input = JSON.parse(execution.input);
187
193
  }
188
194
  catch {
189
- throw new Error('Invalid curate input: failed to parse JSON');
195
+ // Plain text format - wrap in CurateInput
196
+ input = { content: execution.input };
190
197
  }
191
198
  if (!input.content) {
192
199
  throw new Error('Invalid curate input: missing content');
@@ -195,45 +202,76 @@ export class ExecutionConsumer {
195
202
  if (!this.authToken) {
196
203
  throw new Error('No auth token available. Consumer needs authentication.');
197
204
  }
198
- // Create LLM config
205
+ // Create LLM config with Plan Agent settings
206
+ // Plan Agent has read-only permissions and orchestrates via TaskTool
199
207
  const model = input.flags?.model ?? (input.flags?.apiKey ? 'google/gemini-2.5-pro' : 'gemini-2.5-pro');
200
208
  const envConfig = getCurrentConfig();
201
209
  const llmConfig = {
202
210
  accessToken: this.authToken.accessToken,
203
211
  apiBaseUrl: envConfig.llmApiBaseUrl,
204
- fileSystemConfig: { workingDirectory: process.cwd() },
205
- maxIterations: 10,
206
- maxTokens: 8192,
212
+ fileSystem: { workingDirectory: process.cwd() },
213
+ llm: {
214
+ // Plan Agent uses more iterations to coordinate subagents
215
+ maxIterations: 15,
216
+ maxTokens: 8192,
217
+ temperature: 0.7,
218
+ verbose: input.flags?.verbose ?? false,
219
+ },
207
220
  model,
208
221
  openRouterApiKey: input.flags?.apiKey,
209
222
  projectId: PROJECT,
210
223
  sessionKey: this.authToken.sessionKey,
211
224
  teamId: this.brvConfig?.teamId ?? '',
212
- temperature: 0.7,
213
- verbose: input.flags?.verbose ?? false,
214
225
  };
215
226
  // Create and start CipherAgent
227
+ // Agent creates its default session during start() (Single-Session pattern)
228
+ // Create and start CipherAgent (will use Plan Agent's tools and prompt)
216
229
  const agent = new CipherAgent(llmConfig, this.brvConfig);
217
230
  await agent.start();
218
231
  try {
219
- const sessionId = randomUUID();
220
232
  // Setup event listeners for tool call tracking
221
233
  this.setupToolCallTracking(agent, execution.id);
222
- // Execute with autonomous mode
223
- const prompt = `Add the following context to the context tree:\n\n${input.content}`;
224
- const response = await agent.execute(prompt, sessionId, {
234
+ // Build the prompt for the Plan Agent
235
+ // The Plan Agent will orchestrate Query and Curate subagents via TaskTool
236
+ const fileReferenceSection = input.fileReferenceInstructions ? `\n${input.fileReferenceInstructions}` : '';
237
+ const prompt = `You are the Plan Agent orchestrating a context curation workflow.
238
+
239
+ The user wants to add the following context to the context tree:
240
+
241
+ ---
242
+ ${input.content}
243
+ ---
244
+ ${fileReferenceSection}
245
+
246
+ ## Your Workflow
247
+
248
+ 1. **Query Phase**: Use the \`task\` tool with subagent_type="query" to search for existing related knowledge topics in the context tree. This helps avoid duplicates and understand the current context structure.
249
+
250
+ 2. **Curate Phase**: Based on the query results, use the \`task\` tool with subagent_type="curate" to create or update knowledge topics with the user's context.
251
+
252
+ ## Important Guidelines
253
+
254
+ - Always query first to understand existing context before curating
255
+ - Provide clear, detailed prompts when delegating to subagents
256
+ - Summarize the results of each phase before proceeding to the next
257
+
258
+ ## Response Format
259
+
260
+ IMPORTANT: Your final response must be a brief summary (1-2 sentences) of what was done. Do NOT include any file paths, directory paths, or specific location details in your response. The system will automatically display the created/updated file paths separately.`;
261
+ const response = await agent.execute(prompt, {
225
262
  executionContext: {
263
+ // Use 'plan' command type to get Plan Agent's tool set
226
264
  commandType: 'curate',
227
265
  fileReferenceInstructions: input.fileReferenceInstructions,
228
266
  },
229
- mode: 'autonomous',
230
267
  });
231
268
  // Mark completed
232
269
  storage.updateExecutionStatus(execution.id, 'completed', response);
233
270
  console.log(`[Consumer] Execution ${execution.id} completed`);
234
271
  }
235
272
  finally {
236
- // Agent cleanup (if needed in future)
273
+ // Stop agent to cleanup resources
274
+ await agent.stop();
237
275
  }
238
276
  }
239
277
  /**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Consumer Module - Public API for queue processing and UI monitoring
3
3
  *
4
- * Architecture:
4
+ * Architecture (legacy):
5
5
  * - ConsumerService: Singleton background worker (start once in main)
6
6
  * - QueuePollingService: UI subscribes here for real-time updates
7
7
  * - Both communicate via AgentStorage (SQLite DB)
@@ -1,7 +1,8 @@
1
+ // TODO(v0.5.0): Remove this entire module. Replaced by CoreProcess + TaskProcessor + Transport events.
1
2
  /**
2
3
  * Consumer Module - Public API for queue processing and UI monitoring
3
4
  *
4
- * Architecture:
5
+ * Architecture (legacy):
5
6
  * - ConsumerService: Singleton background worker (start once in main)
6
7
  * - QueuePollingService: UI subscribes here for real-time updates
7
8
  * - Both communicate via AgentStorage (SQLite DB)
@@ -1,3 +1,4 @@
1
+ // TODO(v0.5.0): Remove this file. QueuePollingService is replaced by Transport events.
1
2
  import { EventEmitter } from 'node:events';
2
3
  import { closeAgentStorage, getAgentStorage, getAgentStorageSync } from '../storage/agent-storage.js';
3
4
  // ==================== SERVICE ====================
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Checks if a file is binary based on extension and content analysis.
3
+ *
4
+ * Detection strategy:
5
+ * 1. Fast path: Check against known binary extensions
6
+ * 2. Check for null bytes (definitive binary indicator)
7
+ * 3. Heuristic: If >30% non-printable characters, consider binary
8
+ *
9
+ * @param filePath - Path to the file (used for extension check)
10
+ * @param buffer - Buffer containing first N bytes of the file
11
+ * @returns true if the file is binary, false otherwise
12
+ */
13
+ export declare function isBinaryFile(filePath: string, buffer: Buffer): boolean;
14
+ /**
15
+ * Checks if a file is an image based on its extension.
16
+ * SVG files are excluded as they are text-based.
17
+ *
18
+ * @param filePath - Path to the file
19
+ * @returns true if the file is an image (excluding SVG)
20
+ */
21
+ export declare function isImageFile(filePath: string): boolean;
22
+ /**
23
+ * Checks if a file is a PDF based on its extension.
24
+ *
25
+ * @param filePath - Path to the file
26
+ * @returns true if the file is a PDF
27
+ */
28
+ export declare function isPdfFile(filePath: string): boolean;
29
+ /**
30
+ * Gets the MIME type for an image or PDF file.
31
+ *
32
+ * @param filePath - Path to the file
33
+ * @returns MIME type string, or null if not a recognized image/PDF
34
+ */
35
+ export declare function getMimeType(filePath: string): null | string;
36
+ /**
37
+ * Checks if a file is a media file (image or PDF) that should be
38
+ * returned as a base64 attachment instead of text content.
39
+ *
40
+ * @param filePath - Path to the file
41
+ * @returns true if the file should be returned as an attachment
42
+ */
43
+ export declare function isMediaFile(filePath: string): boolean;
@@ -0,0 +1,164 @@
1
+ import path from 'node:path';
2
+ /**
3
+ * Known binary file extensions for fast-path detection.
4
+ * These files are always treated as binary without content inspection.
5
+ * Sorted alphabetically as required by linter.
6
+ */
7
+ const BINARY_EXTENSIONS = new Set([
8
+ '.7z',
9
+ '.a',
10
+ '.bin',
11
+ '.bz2',
12
+ '.class',
13
+ '.com',
14
+ '.dat',
15
+ '.db',
16
+ '.dll',
17
+ '.doc',
18
+ '.docx',
19
+ '.dylib',
20
+ '.exe',
21
+ '.gz',
22
+ '.jar',
23
+ '.lib',
24
+ '.o',
25
+ '.obj',
26
+ '.odp',
27
+ '.ods',
28
+ '.odt',
29
+ '.ppt',
30
+ '.pptx',
31
+ '.pyc',
32
+ '.pyo',
33
+ '.rar',
34
+ '.so',
35
+ '.sqlite',
36
+ '.sqlite3',
37
+ '.tar',
38
+ '.war',
39
+ '.wasm',
40
+ '.xls',
41
+ '.xlsx',
42
+ '.xz',
43
+ '.zip',
44
+ ]);
45
+ /**
46
+ * Image file extensions that should be handled specially (base64 encoding).
47
+ * Sorted alphabetically as required by linter.
48
+ */
49
+ const IMAGE_EXTENSIONS = new Set(['.bmp', '.gif', '.ico', '.jpeg', '.jpg', '.png', '.tif', '.tiff', '.webp']);
50
+ /**
51
+ * PDF extension for special handling.
52
+ */
53
+ const PDF_EXTENSION = '.pdf';
54
+ /**
55
+ * SVG extension - treat as text, not image.
56
+ */
57
+ const SVG_EXTENSION = '.svg';
58
+ /**
59
+ * MIME type mappings for image and PDF files.
60
+ */
61
+ const MIME_TYPES = {
62
+ '.bmp': 'image/bmp',
63
+ '.gif': 'image/gif',
64
+ '.ico': 'image/x-icon',
65
+ '.jpeg': 'image/jpeg',
66
+ '.jpg': 'image/jpeg',
67
+ '.pdf': 'application/pdf',
68
+ '.png': 'image/png',
69
+ '.tif': 'image/tiff',
70
+ '.tiff': 'image/tiff',
71
+ '.webp': 'image/webp',
72
+ };
73
+ /**
74
+ * Threshold for non-printable character ratio to consider a file binary.
75
+ * If more than 30% of sampled bytes are non-printable, the file is binary.
76
+ */
77
+ const NON_PRINTABLE_THRESHOLD = 0.3;
78
+ /**
79
+ * Checks if a file is binary based on extension and content analysis.
80
+ *
81
+ * Detection strategy:
82
+ * 1. Fast path: Check against known binary extensions
83
+ * 2. Check for null bytes (definitive binary indicator)
84
+ * 3. Heuristic: If >30% non-printable characters, consider binary
85
+ *
86
+ * @param filePath - Path to the file (used for extension check)
87
+ * @param buffer - Buffer containing first N bytes of the file
88
+ * @returns true if the file is binary, false otherwise
89
+ */
90
+ export function isBinaryFile(filePath, buffer) {
91
+ const ext = path.extname(filePath).toLowerCase();
92
+ // Fast path: known binary extensions
93
+ if (BINARY_EXTENSIONS.has(ext)) {
94
+ return true;
95
+ }
96
+ // Skip content check for known text-based formats
97
+ if (isImageFile(filePath) || isPdfFile(filePath)) {
98
+ // Images and PDFs are binary but handled specially
99
+ return true;
100
+ }
101
+ // Empty files are not binary
102
+ if (buffer.length === 0) {
103
+ return false;
104
+ }
105
+ // Content-based detection
106
+ let nonPrintableCount = 0;
107
+ for (const byte of buffer) {
108
+ // Null byte is a definitive binary indicator
109
+ if (byte === 0) {
110
+ return true;
111
+ }
112
+ // Count non-printable characters
113
+ // Printable range: tab (9), newline (10), carriage return (13), space (32) to tilde (126)
114
+ if (byte < 9 || (byte > 13 && byte < 32) || byte > 126) {
115
+ nonPrintableCount++;
116
+ }
117
+ }
118
+ // If more than 30% non-printable, consider binary
119
+ return nonPrintableCount / buffer.length > NON_PRINTABLE_THRESHOLD;
120
+ }
121
+ /**
122
+ * Checks if a file is an image based on its extension.
123
+ * SVG files are excluded as they are text-based.
124
+ *
125
+ * @param filePath - Path to the file
126
+ * @returns true if the file is an image (excluding SVG)
127
+ */
128
+ export function isImageFile(filePath) {
129
+ const ext = path.extname(filePath).toLowerCase();
130
+ // SVG is text-based, not a binary image
131
+ if (ext === SVG_EXTENSION) {
132
+ return false;
133
+ }
134
+ return IMAGE_EXTENSIONS.has(ext);
135
+ }
136
+ /**
137
+ * Checks if a file is a PDF based on its extension.
138
+ *
139
+ * @param filePath - Path to the file
140
+ * @returns true if the file is a PDF
141
+ */
142
+ export function isPdfFile(filePath) {
143
+ return path.extname(filePath).toLowerCase() === PDF_EXTENSION;
144
+ }
145
+ /**
146
+ * Gets the MIME type for an image or PDF file.
147
+ *
148
+ * @param filePath - Path to the file
149
+ * @returns MIME type string, or null if not a recognized image/PDF
150
+ */
151
+ export function getMimeType(filePath) {
152
+ const ext = path.extname(filePath).toLowerCase();
153
+ return MIME_TYPES[ext] ?? null;
154
+ }
155
+ /**
156
+ * Checks if a file is a media file (image or PDF) that should be
157
+ * returned as a base64 attachment instead of text content.
158
+ *
159
+ * @param filePath - Path to the file
160
+ * @returns true if the file should be returned as an attachment
161
+ */
162
+ export function isMediaFile(filePath) {
163
+ return isImageFile(filePath) || isPdfFile(filePath);
164
+ }
@@ -0,0 +1,9 @@
1
+ import { FileSystemService } from './file-system-service.js';
2
+ /**
3
+ * Creates a FileSystemService restricted to the context tree directory.
4
+ * All file operations will be confined to .brv/context-tree/.
5
+ *
6
+ * @param baseWorkingDirectory - The project root directory
7
+ * @returns FileSystemService instance restricted to context-tree
8
+ */
9
+ export declare function createContextTreeFileSystem(baseWorkingDirectory: string): FileSystemService;
@@ -0,0 +1,24 @@
1
+ import path from 'node:path';
2
+ import { FileSystemService } from './file-system-service.js';
3
+ /**
4
+ * Creates a FileSystemService restricted to the context tree directory.
5
+ * All file operations will be confined to .brv/context-tree/.
6
+ *
7
+ * @param baseWorkingDirectory - The project root directory
8
+ * @returns FileSystemService instance restricted to context-tree
9
+ */
10
+ export function createContextTreeFileSystem(baseWorkingDirectory) {
11
+ const contextTreePath = path.join(baseWorkingDirectory, '.brv', 'context-tree');
12
+ return new FileSystemService({
13
+ // Only allow paths within context tree (relative to working directory)
14
+ allowedPaths: ['.'],
15
+ // Use default blocked extensions
16
+ blockedExtensions: ['.exe', '.dll', '.so', '.dylib'],
17
+ // Block any attempt to escape via parent directory traversal
18
+ blockedPaths: ['..', '../'],
19
+ // Reasonable file size limit
20
+ maxFileSize: 10 * 1024 * 1024, // 10MB
21
+ // Restrict working directory to context tree
22
+ workingDirectory: contextTreePath,
23
+ });
24
+ }
@@ -1,4 +1,4 @@
1
- import type { EditFileOptions, EditOperation, EditResult, FileContent, FileSystemConfig, GlobOptions, GlobResult, ReadFileOptions, SearchOptions, SearchResult, WriteFileOptions, WriteResult } from '../../../core/domain/cipher/file-system/types.js';
1
+ import type { EditFileOptions, EditOperation, EditResult, FileContent, FileSystemConfig, GlobOptions, GlobResult, ListDirectoryOptions, ListDirectoryResult, ReadFileOptions, SearchOptions, SearchResult, WriteFileOptions, WriteResult } from '../../../core/domain/cipher/file-system/types.js';
2
2
  import type { IFileSystem } from '../../../core/interfaces/cipher/i-file-system.js';
3
3
  /**
4
4
  * File system service implementation.
@@ -32,8 +32,20 @@ export declare class FileSystemService implements IFileSystem {
32
32
  * Initialize the file system service.
33
33
  */
34
34
  initialize(): Promise<void>;
35
+ /**
36
+ * List files and directories in a path.
37
+ */
38
+ listDirectory(dirPath: string, options?: ListDirectoryOptions): Promise<ListDirectoryResult>;
35
39
  /**
36
40
  * Read the contents of a file.
41
+ *
42
+ * Features:
43
+ * - Relative path support (resolved against working directory)
44
+ * - Image/PDF files returned as base64 attachments
45
+ * - Binary file detection and rejection
46
+ * - .env file blocking with whitelist for example files
47
+ * - XML-wrapped output for clearer LLM parsing
48
+ * - Preview metadata (first 20 lines)
37
49
  */
38
50
  readFile(filePath: string, options?: ReadFileOptions): Promise<FileContent>;
39
51
  /**
@@ -81,6 +93,10 @@ export declare class FileSystemService implements IFileSystem {
81
93
  * Parses output from grep-like commands (filepath:lineNumber:content format).
82
94
  */
83
95
  private parseGrepOutput;
96
+ /**
97
+ * Renders a directory tree as a string.
98
+ */
99
+ private renderDirectoryTree;
84
100
  /**
85
101
  * JavaScript-based content search implementation.
86
102
  * Used as fallback when native grep commands are unavailable or when context lines are needed.