byterover-cli 0.2.1 → 0.3.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 (490) hide show
  1. package/README.md +56 -56
  2. package/bin/dev.js +1 -1
  3. package/dist/commands/cipher-agent/run.d.ts +111 -0
  4. package/dist/commands/cipher-agent/run.js +493 -0
  5. package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
  6. package/dist/commands/cipher-agent/set-prompt.js +53 -0
  7. package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
  8. package/dist/commands/cipher-agent/show-prompt.js +48 -0
  9. package/dist/commands/clear.d.ts +6 -0
  10. package/dist/commands/clear.js +36 -15
  11. package/dist/commands/curate.d.ts +74 -0
  12. package/dist/commands/curate.js +396 -0
  13. package/dist/commands/foo.d.ts +12 -0
  14. package/dist/commands/foo.js +61 -0
  15. package/dist/commands/gen-rules.d.ts +3 -0
  16. package/dist/commands/gen-rules.js +39 -20
  17. package/dist/commands/init.d.ts +48 -3
  18. package/dist/commands/init.js +242 -70
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/pull.d.ts +33 -0
  21. package/dist/commands/pull.js +115 -0
  22. package/dist/commands/push.d.ts +13 -13
  23. package/dist/commands/push.js +81 -101
  24. package/dist/commands/query.d.ts +63 -0
  25. package/dist/commands/query.js +349 -0
  26. package/dist/commands/space/list.d.ts +5 -2
  27. package/dist/commands/space/list.js +60 -56
  28. package/dist/commands/space/switch.d.ts +16 -0
  29. package/dist/commands/space/switch.js +102 -53
  30. package/dist/commands/status.d.ts +5 -2
  31. package/dist/commands/status.js +43 -33
  32. package/dist/commands/watch.d.ts +23 -0
  33. package/dist/commands/watch.js +171 -0
  34. package/dist/config/auth.config.js +14 -2
  35. package/dist/config/context-tree-domains.d.ts +12 -0
  36. package/dist/config/context-tree-domains.js +29 -0
  37. package/dist/config/environment.d.ts +6 -0
  38. package/dist/config/environment.js +9 -2
  39. package/dist/constants.d.ts +5 -0
  40. package/dist/constants.js +6 -0
  41. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  42. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  43. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  44. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  45. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  46. package/dist/core/domain/cipher/agent/index.js +7 -0
  47. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  48. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  50. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  51. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  52. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  53. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  54. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  55. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  56. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  57. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  58. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  59. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  60. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  61. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  62. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  63. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  64. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  65. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  66. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  67. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  68. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  69. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  70. package/dist/core/domain/cipher/memory/types.js +4 -0
  71. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  72. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  73. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  74. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  75. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  76. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  77. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  78. package/dist/core/domain/cipher/todos/index.js +4 -0
  79. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  80. package/dist/core/domain/cipher/todos/types.js +5 -0
  81. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  82. package/dist/core/domain/cipher/tools/constants.js +24 -0
  83. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  84. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  85. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  86. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  87. package/dist/core/domain/entities/brv-config.js +115 -17
  88. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  89. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  90. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  91. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  92. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  93. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  94. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  95. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  96. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  97. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  98. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  99. package/dist/core/domain/entities/context-tree-index.js +27 -0
  100. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  101. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  102. package/dist/core/domain/entities/event.d.ts +1 -1
  103. package/dist/core/domain/entities/event.js +3 -1
  104. package/dist/core/domain/entities/parser.d.ts +567 -0
  105. package/dist/core/domain/entities/parser.js +10 -0
  106. package/dist/core/domain/entities/playbook.d.ts +2 -23
  107. package/dist/core/domain/entities/playbook.js +2 -70
  108. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  109. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  110. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  111. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  112. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  113. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  114. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  115. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  116. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  117. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  118. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  119. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  120. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  121. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  122. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  123. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  124. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  125. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  128. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  129. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  130. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  131. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  132. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  133. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  134. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  135. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  136. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  137. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  139. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  140. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  141. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  142. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  143. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  144. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  145. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  146. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  147. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  148. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  149. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  150. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  151. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  153. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  155. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  156. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  157. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  158. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  159. package/dist/core/interfaces/cipher/message-types.js +5 -0
  160. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  161. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  162. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  163. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  164. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  165. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  166. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  167. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  168. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  169. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  171. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  173. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  174. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  175. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  176. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  177. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  178. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  179. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  180. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  181. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  182. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  183. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  184. package/dist/hooks/error/clean-errors.d.ts +7 -0
  185. package/dist/hooks/error/clean-errors.js +50 -0
  186. package/dist/hooks/init/welcome.js +72 -1
  187. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  188. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  189. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  190. package/dist/infra/cipher/agent-service-factory.js +212 -0
  191. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  192. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  193. package/dist/infra/cipher/blob/index.d.ts +10 -0
  194. package/dist/infra/cipher/blob/index.js +12 -0
  195. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  196. package/dist/infra/cipher/blob/migrations.js +148 -0
  197. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  198. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  199. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  200. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  201. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  202. package/dist/infra/cipher/cipher-agent.js +317 -0
  203. package/dist/infra/cipher/command-parser.d.ts +23 -0
  204. package/dist/infra/cipher/command-parser.js +85 -0
  205. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  206. package/dist/infra/cipher/display/todo-display.js +129 -0
  207. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  208. package/dist/infra/cipher/events/event-emitter.js +158 -0
  209. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  210. package/dist/infra/cipher/exit-codes.js +58 -0
  211. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  212. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  213. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  214. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  215. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  216. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  217. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  218. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  219. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  220. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  221. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  222. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  223. package/dist/infra/cipher/interactive-commands.js +198 -0
  224. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  225. package/dist/infra/cipher/interactive-loop.js +352 -0
  226. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  227. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  228. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  229. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  230. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  231. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  232. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  233. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  234. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  235. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  236. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  237. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  238. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  239. package/dist/infra/cipher/llm/context/index.js +2 -0
  240. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  241. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  242. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  243. package/dist/infra/cipher/llm/context/utils.js +89 -0
  244. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  245. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  246. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  247. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  248. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  249. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  250. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  251. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  252. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  253. package/dist/infra/cipher/llm/generators/index.js +13 -0
  254. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  255. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  256. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  257. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  258. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  259. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  260. package/dist/infra/cipher/llm/index.d.ts +9 -0
  261. package/dist/infra/cipher/llm/index.js +13 -0
  262. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  263. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  264. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  265. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  266. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  267. package/dist/infra/cipher/llm/response-validator.js +157 -0
  268. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  269. package/dist/infra/cipher/llm/retry/index.js +10 -0
  270. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  271. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  272. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  273. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  274. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  275. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  276. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  277. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  278. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  279. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  280. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  281. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  282. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  283. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  284. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  285. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  286. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  287. package/dist/infra/cipher/logger/console-logger.js +63 -0
  288. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  289. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  290. package/dist/infra/cipher/memory/index.d.ts +6 -0
  291. package/dist/infra/cipher/memory/index.js +7 -0
  292. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  293. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  294. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  295. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  296. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  297. package/dist/infra/cipher/process/command-validator.js +266 -0
  298. package/dist/infra/cipher/process/index.d.ts +8 -0
  299. package/dist/infra/cipher/process/index.js +8 -0
  300. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  301. package/dist/infra/cipher/process/process-service.js +439 -0
  302. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  303. package/dist/infra/cipher/session/chat-session.js +165 -0
  304. package/dist/infra/cipher/session/index.d.ts +6 -0
  305. package/dist/infra/cipher/session/index.js +5 -0
  306. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  307. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  308. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  309. package/dist/infra/cipher/session/session-manager.js +172 -0
  310. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  311. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  312. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  313. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  314. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  315. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  316. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  317. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  318. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  319. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  320. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  321. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  322. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  323. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  324. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  326. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  327. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  328. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  329. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  330. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  331. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  332. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  333. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  334. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  335. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  336. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  337. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  338. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  339. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  340. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  342. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  344. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  346. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  347. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  348. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  350. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  351. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  352. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  353. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  354. package/dist/infra/cipher/tools/index.d.ts +18 -0
  355. package/dist/infra/cipher/tools/index.js +19 -0
  356. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  357. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  358. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  359. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  360. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  361. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  362. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  363. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  364. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  365. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  366. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  367. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  368. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  369. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  370. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  371. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  372. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  373. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  374. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  375. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  376. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  377. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  378. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  379. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  380. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  381. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  382. package/dist/infra/config/file-config-store.js +9 -3
  383. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  384. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  385. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  386. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  387. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  388. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  389. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  390. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  391. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  392. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  393. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  394. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  395. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  396. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  397. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  398. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  399. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  400. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  401. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  402. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  403. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  404. package/dist/infra/parsers/clean/shared.js +273 -0
  405. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  406. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  407. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  408. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  409. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  410. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  411. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  412. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  413. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  414. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  415. package/dist/infra/space/http-space-service.js +2 -1
  416. package/dist/infra/team/http-team-service.js +2 -1
  417. package/dist/infra/user/http-user-service.js +2 -1
  418. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  419. package/dist/infra/watcher/file-watcher-service.js +81 -0
  420. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  421. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  422. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  423. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  424. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  425. package/dist/resources/prompts/reflection.yml +27 -0
  426. package/dist/resources/prompts/system-prompt.yml +82 -0
  427. package/dist/resources/prompts/tool-outputs.yml +30 -0
  428. package/dist/templates/README.md +6 -7
  429. package/dist/templates/sections/command-reference.md +40 -111
  430. package/dist/templates/sections/workflow.md +3 -30
  431. package/dist/utils/emoji-helpers.d.ts +38 -0
  432. package/dist/utils/emoji-helpers.js +42 -0
  433. package/dist/utils/error-handler.d.ts +51 -0
  434. package/dist/utils/error-handler.js +169 -0
  435. package/dist/utils/error-helpers.d.ts +30 -0
  436. package/dist/utils/error-helpers.js +47 -0
  437. package/dist/utils/file-helpers.d.ts +15 -0
  438. package/dist/utils/file-helpers.js +44 -0
  439. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  440. package/dist/utils/oclif-error-helpers.js +46 -0
  441. package/dist/utils/tool-display-formatter.d.ts +53 -0
  442. package/dist/utils/tool-display-formatter.js +257 -0
  443. package/oclif.manifest.json +381 -141
  444. package/package.json +27 -6
  445. package/dist/commands/add.d.ts +0 -49
  446. package/dist/commands/add.js +0 -192
  447. package/dist/commands/complete.d.ts +0 -108
  448. package/dist/commands/complete.js +0 -340
  449. package/dist/commands/retrieve.d.ts +0 -26
  450. package/dist/commands/retrieve.js +0 -101
  451. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  452. package/dist/core/domain/entities/curator-output.js +0 -23
  453. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  454. package/dist/core/domain/entities/delta-batch.js +0 -52
  455. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  456. package/dist/core/domain/entities/delta-operation.js +0 -50
  457. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  458. package/dist/core/domain/entities/executor-output.js +0 -33
  459. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  460. package/dist/core/domain/entities/reflector-output.js +0 -44
  461. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  462. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  463. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  464. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  465. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  466. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  467. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  468. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  469. package/dist/infra/ace/ace-file-utils.js +0 -83
  470. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  471. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  472. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  473. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  474. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  475. package/dist/infra/ace/file-delta-store.js +0 -26
  476. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  477. package/dist/infra/ace/file-executor-output-store.js +0 -26
  478. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  479. package/dist/infra/ace/file-playbook-store.js +0 -107
  480. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  481. package/dist/infra/ace/file-reflection-store.js +0 -55
  482. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  483. package/dist/infra/playbook/file-playbook-service.js +0 -132
  484. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  485. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  486. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  487. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  488. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  489. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  490. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,523 @@
1
+ import { nanoid } from 'nanoid';
2
+ import { z } from 'zod';
3
+ import { MemoryError, MemoryErrorCode } from '../../../core/domain/cipher/errors/memory-error.js';
4
+ import { NoOpLogger } from '../../../core/interfaces/cipher/i-logger.js';
5
+ /**
6
+ * Validation constants
7
+ */
8
+ const MAX_CONTENT_LENGTH = 10_000; // 10k characters max per memory
9
+ const MAX_TAG_LENGTH = 50;
10
+ const MAX_TAGS = 10;
11
+ /**
12
+ * Embedded Zod schemas for runtime validation
13
+ * Following cipher pattern: schemas are co-located with implementation
14
+ */
15
+ const MemorySourceSchema = z.enum(['agent', 'system', 'user']).describe('Source of the memory');
16
+ const AttachmentSchema = z
17
+ .object({
18
+ blobKey: z.string().min(1).describe('Reference to blob in BlobStorage'),
19
+ createdAt: z.number().int().positive().describe('Timestamp when attached (Unix ms)'),
20
+ name: z.string().optional().describe('Original filename'),
21
+ size: z.number().int().nonnegative().describe('Size in bytes'),
22
+ type: z.string().min(1).describe('MIME type'),
23
+ })
24
+ .strict()
25
+ .describe('Blob attachment metadata');
26
+ const MemoryMetadataSchema = z
27
+ .object({
28
+ attachments: z.array(AttachmentSchema).optional().describe('Blob attachments'),
29
+ pinned: z.boolean().optional().describe('Whether this memory is pinned for auto-loading'),
30
+ source: MemorySourceSchema.optional().describe('Source of the memory'),
31
+ })
32
+ .passthrough() // Allow additional custom fields
33
+ .describe('Memory metadata');
34
+ const MemorySchema = z
35
+ .object({
36
+ content: z
37
+ .string()
38
+ .min(1, 'Memory content cannot be empty')
39
+ .max(MAX_CONTENT_LENGTH, `Memory content cannot exceed ${MAX_CONTENT_LENGTH} characters`)
40
+ .describe('The actual memory content'),
41
+ createdAt: z.number().int().positive().describe('Creation timestamp (Unix ms)'),
42
+ id: z.string().min(1).describe('Unique identifier for the memory'),
43
+ metadata: MemoryMetadataSchema.optional().describe('Additional metadata'),
44
+ tags: z
45
+ .array(z.string().min(1).max(MAX_TAG_LENGTH))
46
+ .max(MAX_TAGS)
47
+ .optional()
48
+ .describe('Optional tags for categorization'),
49
+ updatedAt: z.number().int().positive().describe('Last update timestamp (Unix ms)'),
50
+ })
51
+ .strict()
52
+ .describe('Memory item stored in the system');
53
+ const CreateMemoryInputSchema = z
54
+ .object({
55
+ content: z
56
+ .string()
57
+ .min(1, 'Memory content cannot be empty')
58
+ .max(MAX_CONTENT_LENGTH, `Memory content cannot exceed ${MAX_CONTENT_LENGTH} characters`)
59
+ .describe('The memory content'),
60
+ metadata: MemoryMetadataSchema.optional().describe('Optional metadata'),
61
+ tags: z
62
+ .array(z.string().min(1).max(MAX_TAG_LENGTH))
63
+ .max(MAX_TAGS)
64
+ .optional()
65
+ .describe('Optional tags for categorization'),
66
+ })
67
+ .strict()
68
+ .describe('Input for creating a new memory');
69
+ const UpdateMemoryInputSchema = z
70
+ .object({
71
+ content: z
72
+ .string()
73
+ .min(1, 'Memory content cannot be empty')
74
+ .max(MAX_CONTENT_LENGTH, `Memory content cannot exceed ${MAX_CONTENT_LENGTH} characters`)
75
+ .optional()
76
+ .describe('Updated content'),
77
+ metadata: MemoryMetadataSchema.optional().describe('Updated metadata (merges with existing)'),
78
+ })
79
+ .strict()
80
+ .describe('Input for updating an existing memory');
81
+ const ListMemoriesOptionsSchema = z
82
+ .object({
83
+ limit: z.number().int().positive().optional().describe('Limit number of results'),
84
+ offset: z.number().int().nonnegative().optional().describe('Skip first N results'),
85
+ pinned: z.boolean().optional().describe('Filter by pinned status'),
86
+ source: MemorySourceSchema.optional().describe('Filter by source'),
87
+ })
88
+ .strict()
89
+ .describe('Options for listing memories');
90
+ /**
91
+ * MemoryManager handles CRUD operations for cipher agent memories
92
+ *
93
+ * Responsibilities:
94
+ * - Store and retrieve memories using BlobStorage
95
+ * - Validate memory data using embedded Zod schemas
96
+ * - Generate unique IDs for memories
97
+ * - Filter and search memories by source and pinned status
98
+ * - Sort memories by recency (updatedAt descending)
99
+ * - Manage blob attachments
100
+ *
101
+ * Storage:
102
+ * - Memories are stored as JSON blobs with key pattern: memory-{id}
103
+ * - Attachments are stored as blobs with key pattern: memory-{id}-{suffix}
104
+ * - All persistence operations use BlobStorage
105
+ */
106
+ export class MemoryManager {
107
+ blobStorage;
108
+ static MEMORY_KEY_PREFIX = 'memory-';
109
+ logger;
110
+ constructor(blobStorage, logger) {
111
+ this.blobStorage = blobStorage;
112
+ this.logger = logger ?? new NoOpLogger();
113
+ this.logger.info('Memory manager initialized');
114
+ }
115
+ /**
116
+ * Attach a blob to an existing memory
117
+ * @param memoryId - Memory ID to attach blob to
118
+ * @param content - Blob content (Buffer or string)
119
+ * @param metadata - Blob metadata
120
+ * @param metadata.name - Optional filename
121
+ * @param metadata.type - Optional MIME type
122
+ * @returns Attachment metadata
123
+ * @throws MemoryError if memory not found or attachment fails
124
+ */
125
+ async attachBlob(memoryId, content, metadata = {}) {
126
+ // Get existing memory
127
+ const memory = await this.get(memoryId);
128
+ // Generate unique blob key
129
+ const blobKey = `memory-${memoryId}-${nanoid(8)}`;
130
+ // Store blob
131
+ try {
132
+ const storedBlob = await this.blobStorage.store(blobKey, content, {
133
+ contentType: metadata.type,
134
+ originalName: metadata.name,
135
+ tags: { memoryId },
136
+ });
137
+ // Create attachment metadata
138
+ const attachment = {
139
+ blobKey,
140
+ createdAt: Date.now(),
141
+ name: metadata.name,
142
+ size: storedBlob.metadata.size,
143
+ type: storedBlob.metadata.contentType || 'application/octet-stream',
144
+ };
145
+ // Validate attachment
146
+ const validatedAttachment = AttachmentSchema.parse(attachment);
147
+ // Update memory metadata
148
+ const updatedMemory = {
149
+ ...memory,
150
+ metadata: {
151
+ ...memory.metadata,
152
+ attachments: [
153
+ ...(memory.metadata?.attachments && Array.isArray(memory.metadata.attachments)
154
+ ? memory.metadata.attachments
155
+ : []),
156
+ validatedAttachment,
157
+ ],
158
+ },
159
+ updatedAt: Date.now(),
160
+ };
161
+ // Save updated memory
162
+ await this.saveMemory(updatedMemory);
163
+ this.logger.debug('Attached blob to memory', { blobKey, memoryId });
164
+ return validatedAttachment;
165
+ }
166
+ catch (error) {
167
+ // Cleanup: try to delete the blob if attachment failed
168
+ try {
169
+ await this.blobStorage.delete(blobKey);
170
+ }
171
+ catch {
172
+ // Ignore cleanup errors
173
+ }
174
+ throw MemoryError.storageError(`Failed to attach blob: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
175
+ }
176
+ }
177
+ /**
178
+ * Get count of total memories matching the filter criteria
179
+ * @param options - Query options for filtering
180
+ * @returns Number of memories matching the criteria
181
+ */
182
+ async count(options = {}) {
183
+ const memories = await this.list(options);
184
+ return memories.length;
185
+ }
186
+ /**
187
+ * Create a new memory
188
+ * @param input - Memory creation input
189
+ * @returns Created memory with generated ID and timestamps
190
+ */
191
+ async create(input) {
192
+ // Validate input
193
+ const validatedInput = CreateMemoryInputSchema.parse(input);
194
+ // Generate unique ID (12 characters)
195
+ const id = nanoid(12);
196
+ const now = Date.now();
197
+ const memory = {
198
+ content: validatedInput.content,
199
+ createdAt: now,
200
+ id,
201
+ metadata: validatedInput.metadata,
202
+ tags: validatedInput.tags,
203
+ updatedAt: now,
204
+ };
205
+ // Validate the complete memory object
206
+ const validatedMemory = MemorySchema.parse(memory);
207
+ try {
208
+ await this.saveMemory(validatedMemory);
209
+ this.logger.debug('Created memory', { id });
210
+ return validatedMemory;
211
+ }
212
+ catch (error) {
213
+ throw MemoryError.storageError(`Failed to store memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
214
+ }
215
+ }
216
+ /**
217
+ * Delete a memory by ID
218
+ * Also deletes all associated blob attachments
219
+ * @param id - Memory ID to delete
220
+ * @throws MemoryError if ID is invalid or memory not found
221
+ */
222
+ async delete(id) {
223
+ if (!id || typeof id !== 'string') {
224
+ throw MemoryError.invalidId(id);
225
+ }
226
+ // Get memory to find attachments
227
+ const memory = await this.get(id);
228
+ // Delete all blob attachments
229
+ if (memory.metadata?.attachments && Array.isArray(memory.metadata.attachments)) {
230
+ await Promise.allSettled(memory.metadata.attachments.map((att) => this.blobStorage.delete(att.blobKey).catch((error) => {
231
+ this.logger.warn('Failed to delete blob', { blobKey: att.blobKey, error: error.message });
232
+ })));
233
+ }
234
+ // Delete the memory itself
235
+ try {
236
+ await this.deleteMemory(id);
237
+ this.logger.debug('Deleted memory', { id });
238
+ }
239
+ catch (error) {
240
+ throw MemoryError.deleteError(`Failed to delete memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
241
+ }
242
+ }
243
+ /**
244
+ * Detach (remove) a blob from a memory
245
+ * @param memoryId - Memory ID to detach blob from
246
+ * @param blobKey - Blob key to remove
247
+ * @throws MemoryError if memory not found or detachment fails
248
+ */
249
+ async detachBlob(memoryId, blobKey) {
250
+ // Get memory
251
+ const memory = await this.get(memoryId);
252
+ // Find attachment
253
+ const attachments = memory.metadata?.attachments && Array.isArray(memory.metadata.attachments) ? memory.metadata.attachments : [];
254
+ const attachment = attachments.find((a) => a.blobKey === blobKey);
255
+ if (!attachment) {
256
+ throw MemoryError.storageError(`Attachment not found: ${blobKey}`);
257
+ }
258
+ // Delete blob from storage
259
+ try {
260
+ await this.blobStorage.delete(blobKey);
261
+ }
262
+ catch (error) {
263
+ this.logger.warn('Failed to delete blob', {
264
+ blobKey,
265
+ error: error instanceof Error ? error.message : String(error),
266
+ });
267
+ }
268
+ // Update memory metadata (remove attachment)
269
+ const updatedMemory = {
270
+ ...memory,
271
+ metadata: {
272
+ ...memory.metadata,
273
+ attachments: attachments.filter((a) => a.blobKey !== blobKey),
274
+ },
275
+ updatedAt: Date.now(),
276
+ };
277
+ // Save updated memory
278
+ try {
279
+ await this.saveMemory(updatedMemory);
280
+ this.logger.debug('Detached blob from memory', { blobKey, memoryId });
281
+ }
282
+ catch (error) {
283
+ throw MemoryError.storageError(`Failed to update memory after detaching blob: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
284
+ }
285
+ }
286
+ /**
287
+ * Get a memory by ID
288
+ * @param id - Memory ID to retrieve
289
+ * @returns Memory object
290
+ * @throws MemoryError if ID is invalid or memory not found
291
+ */
292
+ async get(id) {
293
+ if (!id || typeof id !== 'string') {
294
+ throw MemoryError.invalidId(id);
295
+ }
296
+ try {
297
+ const memory = await this.loadMemory(id);
298
+ if (!memory) {
299
+ throw MemoryError.notFound(id);
300
+ }
301
+ return memory;
302
+ }
303
+ catch (error) {
304
+ if (error instanceof MemoryError && error.code === MemoryErrorCode.MEMORY_NOT_FOUND) {
305
+ throw error;
306
+ }
307
+ throw MemoryError.retrievalError(`Failed to retrieve memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
308
+ }
309
+ }
310
+ /**
311
+ * Get a blob attachment from a memory
312
+ * @param memoryId - Memory ID
313
+ * @param blobKey - Blob key to retrieve
314
+ * @returns Stored blob with content and metadata
315
+ * @throws MemoryError if memory not found or blob not found
316
+ */
317
+ async getAttachment(memoryId, blobKey) {
318
+ // Get memory to verify attachment exists
319
+ const memory = await this.get(memoryId);
320
+ const attachments = memory.metadata?.attachments && Array.isArray(memory.metadata.attachments) ? memory.metadata.attachments : [];
321
+ const attachment = attachments.find((a) => a.blobKey === blobKey);
322
+ if (!attachment) {
323
+ throw MemoryError.storageError(`Attachment not found: ${blobKey}`);
324
+ }
325
+ // Retrieve blob
326
+ try {
327
+ const blob = await this.blobStorage.retrieve(blobKey);
328
+ if (!blob) {
329
+ throw MemoryError.retrievalError(`Failed to retrieve attachment: Blob ${blobKey} not found in storage`);
330
+ }
331
+ return blob;
332
+ }
333
+ catch (error) {
334
+ if (error instanceof MemoryError) {
335
+ throw error;
336
+ }
337
+ throw MemoryError.retrievalError(`Failed to retrieve attachment: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
338
+ }
339
+ }
340
+ /**
341
+ * Check if a memory exists
342
+ * @param id - Memory ID to check
343
+ * @returns true if memory exists, false otherwise
344
+ */
345
+ async has(id) {
346
+ try {
347
+ await this.get(id);
348
+ return true;
349
+ }
350
+ catch (error) {
351
+ if (error instanceof MemoryError && error.code === MemoryErrorCode.MEMORY_NOT_FOUND) {
352
+ return false;
353
+ }
354
+ throw error;
355
+ }
356
+ }
357
+ /**
358
+ * List all memories with optional filtering, sorting, and pagination
359
+ * @param options - Query options for filtering and pagination
360
+ * @returns Array of memories matching the criteria
361
+ */
362
+ async list(options = {}) {
363
+ // Validate and parse options
364
+ const validatedOptions = ListMemoriesOptionsSchema.parse(options);
365
+ try {
366
+ // Load all memories from blob storage
367
+ const memories = await this.loadAllMemories();
368
+ // Apply filters
369
+ let filtered = memories;
370
+ // Filter by source
371
+ if (validatedOptions.source) {
372
+ filtered = filtered.filter((m) => m.metadata?.source === validatedOptions.source);
373
+ }
374
+ // Filter by pinned status
375
+ if (validatedOptions.pinned !== undefined) {
376
+ filtered = filtered.filter((m) => m.metadata?.pinned === validatedOptions.pinned);
377
+ }
378
+ // Sort by updatedAt descending (most recent first)
379
+ filtered.sort((a, b) => b.updatedAt - a.updatedAt);
380
+ // Apply pagination
381
+ if (validatedOptions.offset !== undefined || validatedOptions.limit !== undefined) {
382
+ const start = validatedOptions.offset ?? 0;
383
+ const end = validatedOptions.limit ? start + validatedOptions.limit : undefined;
384
+ filtered = filtered.slice(start, end);
385
+ }
386
+ return filtered;
387
+ }
388
+ catch (error) {
389
+ throw MemoryError.retrievalError(`Failed to list memories: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
390
+ }
391
+ }
392
+ /**
393
+ * List all attachments for a memory
394
+ * @param memoryId - Memory ID
395
+ * @returns Array of attachment metadata
396
+ * @throws MemoryError if memory not found
397
+ */
398
+ async listAttachments(memoryId) {
399
+ const memory = await this.get(memoryId);
400
+ const attachments = memory.metadata?.attachments;
401
+ if (!attachments || !Array.isArray(attachments)) {
402
+ return [];
403
+ }
404
+ return attachments;
405
+ }
406
+ /**
407
+ * Update an existing memory
408
+ * @param id - Memory ID to update
409
+ * @param input - Update input (partial)
410
+ * @returns Updated memory
411
+ * @throws MemoryError if ID is invalid or memory not found
412
+ */
413
+ async update(id, input) {
414
+ if (!id || typeof id !== 'string') {
415
+ throw MemoryError.invalidId(id);
416
+ }
417
+ // Validate input
418
+ const validatedInput = UpdateMemoryInputSchema.parse(input);
419
+ // Get existing memory
420
+ const existing = await this.get(id);
421
+ // Merge updates
422
+ const updated = {
423
+ ...existing,
424
+ content: validatedInput.content === undefined ? existing.content : validatedInput.content,
425
+ updatedAt: Date.now(),
426
+ };
427
+ // Merge metadata if provided
428
+ if (validatedInput.metadata) {
429
+ updated.metadata = {
430
+ ...existing.metadata,
431
+ ...validatedInput.metadata,
432
+ };
433
+ }
434
+ // Validate the updated memory
435
+ const validatedMemory = MemorySchema.parse(updated);
436
+ try {
437
+ await this.saveMemory(validatedMemory);
438
+ this.logger.debug('Updated memory', { id });
439
+ return validatedMemory;
440
+ }
441
+ catch (error) {
442
+ throw MemoryError.storageError(`Failed to update memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
443
+ }
444
+ }
445
+ /**
446
+ * Delete a memory from blob storage
447
+ */
448
+ async deleteMemory(id) {
449
+ const key = this.getMemoryKey(id);
450
+ await this.blobStorage.delete(key);
451
+ }
452
+ /**
453
+ * Extract memory ID from blob key
454
+ */
455
+ extractMemoryId(key) {
456
+ return key.replace(MemoryManager.MEMORY_KEY_PREFIX, '');
457
+ }
458
+ /**
459
+ * Get the blob key for a memory
460
+ */
461
+ getMemoryKey(id) {
462
+ return `${MemoryManager.MEMORY_KEY_PREFIX}${id}`;
463
+ }
464
+ /**
465
+ * Check if a blob key is a memory key (not an attachment)
466
+ */
467
+ isMemoryKey(key) {
468
+ if (!key.startsWith(MemoryManager.MEMORY_KEY_PREFIX)) {
469
+ return false;
470
+ }
471
+ // Memory keys have format: memory-{id}
472
+ // Attachment keys have format: memory-{id}-{suffix}
473
+ // Count dashes: memory keys have 1 dash, attachments have 2+
474
+ const dashCount = (key.match(/-/g) || []).length;
475
+ return dashCount === 1;
476
+ }
477
+ /**
478
+ * Load all memories from blob storage
479
+ */
480
+ async loadAllMemories() {
481
+ const keys = await this.blobStorage.list(MemoryManager.MEMORY_KEY_PREFIX);
482
+ // Filter to only memory keys (exclude attachments)
483
+ const memoryKeys = keys.filter((key) => this.isMemoryKey(key));
484
+ // Load all memories in parallel
485
+ const memories = await Promise.all(memoryKeys.map(async (key) => {
486
+ const id = this.extractMemoryId(key);
487
+ return this.loadMemory(id);
488
+ }));
489
+ // Filter out undefined values
490
+ return memories.filter((m) => m !== undefined);
491
+ }
492
+ /**
493
+ * Load a memory from blob storage
494
+ */
495
+ async loadMemory(id) {
496
+ const key = this.getMemoryKey(id);
497
+ const blob = await this.blobStorage.retrieve(key);
498
+ if (!blob) {
499
+ return undefined;
500
+ }
501
+ try {
502
+ const memory = JSON.parse(blob.content.toString('utf8'));
503
+ return memory;
504
+ }
505
+ catch (error) {
506
+ throw MemoryError.retrievalError(`Failed to parse memory ${id}: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
507
+ }
508
+ }
509
+ /**
510
+ * Save a memory to blob storage
511
+ */
512
+ async saveMemory(memory) {
513
+ const key = this.getMemoryKey(memory.id);
514
+ const content = JSON.stringify(memory, null, 2);
515
+ await this.blobStorage.store(key, content, {
516
+ contentType: 'application/json',
517
+ tags: {
518
+ memoryId: memory.id,
519
+ source: memory.metadata?.source || 'unknown',
520
+ },
521
+ });
522
+ }
523
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Coding Agent Log Parser
3
+ * Parses coding agent log files using the existing raw/clean parser pipeline
4
+ * Follows the same logic as the 'brv watch' command's triggerParsing method
5
+ */
6
+ import type { CleanSession } from '../../../core/domain/entities/parser.js';
7
+ import type { ICodingAgentLogParser } from '../../../core/interfaces/cipher/i-coding-agent-log-parser.js';
8
+ import { Agent } from '../../../core/domain/entities/agent.js';
9
+ /**
10
+ * Coding Agent Log Parser
11
+ *
12
+ * Reuses the existing raw/clean parser infrastructure to parse coding agent log files.
13
+ * This implementation follows the same two-phase pipeline as the 'brv watch' command:
14
+ *
15
+ * 1. Raw Phase: Parse IDE-specific files from chatLogPath directory, write to .brv/logs/{ide}/raw/
16
+ * 2. Clean Phase: Read from .brv/logs/{ide}/raw/, normalize to CleanSession format
17
+ *
18
+ * Note: This parser processes entire directories (not individual files) for consistency
19
+ * with the existing parser architecture. When a single file changes, all files in the
20
+ * directory will be re-parsed. This is inefficient but safe, and can be optimized later.
21
+ */
22
+ export declare class CodingAgentLogParser implements ICodingAgentLogParser {
23
+ parse(chatLogPath: string, ide: Agent): Promise<readonly CleanSession[]>;
24
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Coding Agent Log Parser
3
+ * Parses coding agent log files using the existing raw/clean parser pipeline
4
+ * Follows the same logic as the 'brv watch' command's triggerParsing method
5
+ */
6
+ import { CleanParserServiceFactory } from '../../parsers/clean/clean-parser-service-factory.js';
7
+ import { RawParserServiceFactory } from '../../parsers/raw/raw-parser-service-factory.js';
8
+ /**
9
+ * Coding Agent Log Parser
10
+ *
11
+ * Reuses the existing raw/clean parser infrastructure to parse coding agent log files.
12
+ * This implementation follows the same two-phase pipeline as the 'brv watch' command:
13
+ *
14
+ * 1. Raw Phase: Parse IDE-specific files from chatLogPath directory, write to .brv/logs/{ide}/raw/
15
+ * 2. Clean Phase: Read from .brv/logs/{ide}/raw/, normalize to CleanSession format
16
+ *
17
+ * Note: This parser processes entire directories (not individual files) for consistency
18
+ * with the existing parser architecture. When a single file changes, all files in the
19
+ * directory will be re-parsed. This is inefficient but safe, and can be optimized later.
20
+ */
21
+ export class CodingAgentLogParser {
22
+ async parse(chatLogPath, ide) {
23
+ if (!RawParserServiceFactory.isSupported(ide)) {
24
+ throw new Error(`Unsupported IDE: ${ide}`);
25
+ }
26
+ if (!chatLogPath || chatLogPath.trim().length === 0) {
27
+ throw new Error('Chat log path cannot be empty');
28
+ }
29
+ let isRawSuccess = false;
30
+ try {
31
+ isRawSuccess = await RawParserServiceFactory.parseConversations(ide, chatLogPath);
32
+ }
33
+ catch (error) {
34
+ throw new Error(`Raw parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`);
35
+ }
36
+ if (isRawSuccess) {
37
+ try {
38
+ const rawOutputDir = `${process.cwd()}/.brv/logs/${ide}/raw`;
39
+ const cleanSessions = await CleanParserServiceFactory.parseConversations(ide, rawOutputDir);
40
+ if (cleanSessions.length > 0) {
41
+ return Object.freeze(cleanSessions);
42
+ }
43
+ throw new Error('Clean parsing returned no sessions');
44
+ }
45
+ catch (error) {
46
+ throw new Error(`Clean parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`);
47
+ }
48
+ }
49
+ throw new Error('Raw parsing failed');
50
+ }
51
+ }
@@ -0,0 +1,59 @@
1
+ import type { CommandValidation, ProcessConfig } from '../../../core/domain/cipher/process/types.js';
2
+ /**
3
+ * Command validator for security and safety checks.
4
+ *
5
+ * Validates commands against dangerous patterns, injection attacks,
6
+ * and approval requirements based on security level.
7
+ */
8
+ export declare class CommandValidator {
9
+ private readonly config;
10
+ /**
11
+ * Creates a new command validator.
12
+ *
13
+ * @param config - Process configuration for security settings
14
+ */
15
+ constructor(config: Pick<ProcessConfig, 'allowedCommands' | 'blockedCommands' | 'securityLevel'>);
16
+ /**
17
+ * Get the list of allowed commands.
18
+ *
19
+ * @returns Array of allowed command patterns
20
+ */
21
+ getAllowedCommands(): string[];
22
+ /**
23
+ * Get the list of blocked commands.
24
+ *
25
+ * @returns Array of blocked command patterns
26
+ */
27
+ getBlockedCommands(): string[];
28
+ /**
29
+ * Get the current security level.
30
+ *
31
+ * @returns Security level setting
32
+ */
33
+ getSecurityLevel(): string;
34
+ /**
35
+ * Validate a command for security and safety.
36
+ *
37
+ * Performs multiple checks:
38
+ * 1. Empty command check
39
+ * 2. Length limit check
40
+ * 3. Dangerous pattern detection
41
+ * 4. Injection detection
42
+ * 5. Blocked/allowed command list checks
43
+ * 6. Approval requirement determination
44
+ *
45
+ * @param command - Command string to validate
46
+ * @returns Validation result with approval requirement
47
+ */
48
+ validateCommand(command: string): CommandValidation;
49
+ /**
50
+ * Detect command injection patterns.
51
+ *
52
+ * Checks for unsafe command chaining, substitution, and other
53
+ * injection attack vectors.
54
+ *
55
+ * @param command - Command to check
56
+ * @returns Validation result
57
+ */
58
+ private detectInjection;
59
+ }