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,37 @@
1
+ import type { AgentEventBus, SessionEventBus } from '../events/event-emitter.js';
2
+ /**
3
+ * Session Event Forwarder
4
+ *
5
+ * Automatically forwards session-level events to the agent-level event bus
6
+ * by adding the sessionId to each event payload.
7
+ *
8
+ * This allows external listeners to subscribe to AgentEventBus and receive
9
+ * all events from all sessions with proper session identification.
10
+ *
11
+ * Pattern mirrors Dexto's event forwarding implementation.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const agentBus = new AgentEventBus();
16
+ * const sessionBus = new SessionEventBus();
17
+ *
18
+ * setupEventForwarding(sessionBus, agentBus, 'session-123');
19
+ *
20
+ * // Session event...
21
+ * sessionBus.emit('llmservice:thinking');
22
+ *
23
+ * // ...is automatically forwarded to agent bus with sessionId:
24
+ * // agentBus receives: { sessionId: 'session-123' }
25
+ * ```
26
+ */
27
+ /**
28
+ * Setup event forwarding from SessionEventBus to AgentEventBus.
29
+ *
30
+ * Creates listeners on the session bus that automatically forward events
31
+ * to the agent bus with sessionId added to the payload.
32
+ *
33
+ * @param sessionEventBus - Session-scoped event bus to listen to
34
+ * @param agentEventBus - Agent-wide event bus to forward events to
35
+ * @param sessionId - Unique session identifier to add to forwarded events
36
+ */
37
+ export declare function setupEventForwarding(sessionEventBus: SessionEventBus, agentEventBus: AgentEventBus, sessionId: string): void;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Session Event Forwarder
3
+ *
4
+ * Automatically forwards session-level events to the agent-level event bus
5
+ * by adding the sessionId to each event payload.
6
+ *
7
+ * This allows external listeners to subscribe to AgentEventBus and receive
8
+ * all events from all sessions with proper session identification.
9
+ *
10
+ * Pattern mirrors Dexto's event forwarding implementation.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const agentBus = new AgentEventBus();
15
+ * const sessionBus = new SessionEventBus();
16
+ *
17
+ * setupEventForwarding(sessionBus, agentBus, 'session-123');
18
+ *
19
+ * // Session event...
20
+ * sessionBus.emit('llmservice:thinking');
21
+ *
22
+ * // ...is automatically forwarded to agent bus with sessionId:
23
+ * // agentBus receives: { sessionId: 'session-123' }
24
+ * ```
25
+ */
26
+ /**
27
+ * Setup event forwarding from SessionEventBus to AgentEventBus.
28
+ *
29
+ * Creates listeners on the session bus that automatically forward events
30
+ * to the agent bus with sessionId added to the payload.
31
+ *
32
+ * @param sessionEventBus - Session-scoped event bus to listen to
33
+ * @param agentEventBus - Agent-wide event bus to forward events to
34
+ * @param sessionId - Unique session identifier to add to forwarded events
35
+ */
36
+ export function setupEventForwarding(sessionEventBus, agentEventBus, sessionId) {
37
+ // Forward llmservice:thinking (void payload)
38
+ sessionEventBus.on('llmservice:thinking', () => {
39
+ agentEventBus.emit('llmservice:thinking', { sessionId });
40
+ });
41
+ // Forward llmservice:chunk
42
+ sessionEventBus.on('llmservice:chunk', (payload) => {
43
+ agentEventBus.emit('llmservice:chunk', {
44
+ ...payload,
45
+ sessionId,
46
+ });
47
+ });
48
+ // Forward llmservice:response
49
+ sessionEventBus.on('llmservice:response', (payload) => {
50
+ agentEventBus.emit('llmservice:response', {
51
+ ...payload,
52
+ sessionId,
53
+ });
54
+ });
55
+ // Forward llmservice:toolCall
56
+ sessionEventBus.on('llmservice:toolCall', (payload) => {
57
+ agentEventBus.emit('llmservice:toolCall', {
58
+ ...payload,
59
+ sessionId,
60
+ });
61
+ });
62
+ // Forward llmservice:toolResult
63
+ sessionEventBus.on('llmservice:toolResult', (payload) => {
64
+ agentEventBus.emit('llmservice:toolResult', {
65
+ ...payload,
66
+ sessionId,
67
+ });
68
+ });
69
+ // Forward llmservice:error
70
+ sessionEventBus.on('llmservice:error', (payload) => {
71
+ agentEventBus.emit('llmservice:error', {
72
+ ...payload,
73
+ sessionId,
74
+ });
75
+ });
76
+ // Forward llmservice:unsupportedInput
77
+ sessionEventBus.on('llmservice:unsupportedInput', (payload) => {
78
+ agentEventBus.emit('llmservice:unsupportedInput', {
79
+ ...payload,
80
+ sessionId,
81
+ });
82
+ });
83
+ }
@@ -0,0 +1,109 @@
1
+ import type { CipherAgentServices, SessionManagerConfig } from '../../../core/interfaces/cipher/cipher-services.js';
2
+ import type { IChatSession } from '../../../core/interfaces/cipher/i-chat-session.js';
3
+ import type { ByteRoverGrpcConfig } from '../agent-service-factory.js';
4
+ /**
5
+ * Options for SessionManager constructor
6
+ */
7
+ export interface SessionManagerOptions {
8
+ config?: SessionManagerConfig;
9
+ }
10
+ /**
11
+ * Session manager.
12
+ *
13
+ * Manages multiple chat sessions with creation, retrieval, and deletion.
14
+ * Each session gets its own LLM service instance with isolated context.
15
+ *
16
+ * Following Dexto's pattern: SessionManager uses shared services from the agent
17
+ * and creates session-specific services (LLM, EventBus) per conversation.
18
+ */
19
+ export declare class SessionManager {
20
+ private readonly config;
21
+ private readonly grpcConfig;
22
+ private readonly llmConfig;
23
+ private pendingCreations;
24
+ private readonly sessions;
25
+ private readonly sharedServices;
26
+ /**
27
+ * Creates a new session manager
28
+ *
29
+ * @param sharedServices - Shared services from CipherAgent (ToolManager, SystemPromptManager, etc.)
30
+ * @param grpcConfig - gRPC client configuration
31
+ * @param llmConfig - LLM service configuration
32
+ * @param llmConfig.openRouterApiKey - Optional OpenRouter API key for direct service
33
+ * @param llmConfig.httpReferer - Optional HTTP Referer for OpenRouter rankings
34
+ * @param llmConfig.siteName - Optional site name for OpenRouter rankings
35
+ * @param llmConfig.maxIterations - Maximum iterations for agentic loop
36
+ * @param llmConfig.maxTokens - Maximum output tokens
37
+ * @param llmConfig.model - LLM model identifier
38
+ * @param llmConfig.temperature - Temperature for generation
39
+ * @param options - Optional session manager options
40
+ * @param options.config - Session manager configuration
41
+ */
42
+ constructor(sharedServices: CipherAgentServices, grpcConfig: ByteRoverGrpcConfig, llmConfig: {
43
+ httpReferer?: string;
44
+ maxIterations?: number;
45
+ maxTokens?: number;
46
+ model: string;
47
+ openRouterApiKey?: string;
48
+ siteName?: string;
49
+ temperature?: number;
50
+ }, options?: SessionManagerOptions);
51
+ /**
52
+ * Create a new chat session.
53
+ *
54
+ * Each session gets its own LLM service instance for isolated conversation context.
55
+ * Following Dexto's pattern with race condition protection via pendingCreations tracker.
56
+ *
57
+ * @param sessionId - Optional session ID (generates UUID if not provided)
58
+ * @returns New or existing chat session instance
59
+ */
60
+ createSession(sessionId?: string): Promise<IChatSession>;
61
+ /**
62
+ * Delete a session completely (memory + history).
63
+ *
64
+ * @param id - Session ID to delete
65
+ * @returns True if session existed and was deleted
66
+ */
67
+ deleteSession(id: string): Promise<boolean>;
68
+ /**
69
+ * End a session (remove from memory, preserve history for future restoration).
70
+ * Currently same as deleteSession since we don't have persistent storage yet.
71
+ *
72
+ * @param id - Session ID to end
73
+ * @returns True if session existed and was ended
74
+ */
75
+ endSession(id: string): Promise<boolean>;
76
+ /**
77
+ * Get a session by ID.
78
+ *
79
+ * @param id - Session ID
80
+ * @returns Session instance or undefined if not found
81
+ */
82
+ getSession(id: string): IChatSession | undefined;
83
+ /**
84
+ * Get the number of active sessions.
85
+ *
86
+ * @returns Session count
87
+ */
88
+ getSessionCount(): number;
89
+ /**
90
+ * Check if a session exists.
91
+ *
92
+ * @param id - Session ID to check
93
+ * @returns True if session exists
94
+ */
95
+ hasSession(id: string): boolean;
96
+ /**
97
+ * List all session IDs.
98
+ *
99
+ * @returns Array of session IDs
100
+ */
101
+ listSessions(): string[];
102
+ /**
103
+ * Internal session creation logic.
104
+ *
105
+ * @param id - Session ID
106
+ * @returns New chat session instance
107
+ */
108
+ private createSessionInternal;
109
+ }
@@ -0,0 +1,172 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createSessionServices } from '../agent-service-factory.js';
3
+ import { ChatSession } from './chat-session.js';
4
+ /**
5
+ * Session manager.
6
+ *
7
+ * Manages multiple chat sessions with creation, retrieval, and deletion.
8
+ * Each session gets its own LLM service instance with isolated context.
9
+ *
10
+ * Following Dexto's pattern: SessionManager uses shared services from the agent
11
+ * and creates session-specific services (LLM, EventBus) per conversation.
12
+ */
13
+ export class SessionManager {
14
+ config;
15
+ grpcConfig;
16
+ llmConfig;
17
+ pendingCreations = new Map();
18
+ sessions = new Map();
19
+ sharedServices;
20
+ /**
21
+ * Creates a new session manager
22
+ *
23
+ * @param sharedServices - Shared services from CipherAgent (ToolManager, SystemPromptManager, etc.)
24
+ * @param grpcConfig - gRPC client configuration
25
+ * @param llmConfig - LLM service configuration
26
+ * @param llmConfig.openRouterApiKey - Optional OpenRouter API key for direct service
27
+ * @param llmConfig.httpReferer - Optional HTTP Referer for OpenRouter rankings
28
+ * @param llmConfig.siteName - Optional site name for OpenRouter rankings
29
+ * @param llmConfig.maxIterations - Maximum iterations for agentic loop
30
+ * @param llmConfig.maxTokens - Maximum output tokens
31
+ * @param llmConfig.model - LLM model identifier
32
+ * @param llmConfig.temperature - Temperature for generation
33
+ * @param options - Optional session manager options
34
+ * @param options.config - Session manager configuration
35
+ */
36
+ constructor(sharedServices, grpcConfig, llmConfig, options) {
37
+ this.sharedServices = sharedServices;
38
+ this.grpcConfig = grpcConfig;
39
+ this.llmConfig = llmConfig;
40
+ this.config = {
41
+ maxSessions: options?.config?.maxSessions ?? 100,
42
+ sessionTTL: options?.config?.sessionTTL ?? 3_600_000, // 1 hour
43
+ };
44
+ }
45
+ /**
46
+ * Create a new chat session.
47
+ *
48
+ * Each session gets its own LLM service instance for isolated conversation context.
49
+ * Following Dexto's pattern with race condition protection via pendingCreations tracker.
50
+ *
51
+ * @param sessionId - Optional session ID (generates UUID if not provided)
52
+ * @returns New or existing chat session instance
53
+ */
54
+ async createSession(sessionId) {
55
+ const id = sessionId ?? randomUUID();
56
+ // Check pending operations (race condition protection)
57
+ if (this.pendingCreations.has(id)) {
58
+ const pending = this.pendingCreations.get(id);
59
+ if (!pending) {
60
+ throw new Error(`Pending session ${id} not found. This is a bug.`);
61
+ }
62
+ return pending;
63
+ }
64
+ // Check in-memory cache
65
+ if (this.sessions.has(id)) {
66
+ const existing = this.sessions.get(id);
67
+ if (!existing) {
68
+ throw new Error(`Session ${id} not found in cache. This is a bug.`);
69
+ }
70
+ return existing;
71
+ }
72
+ // Check max sessions limit
73
+ if (this.sessions.size >= this.config.maxSessions) {
74
+ throw new Error(`Maximum sessions (${this.config.maxSessions}) reached. Delete unused sessions or increase maxSessions limit.`);
75
+ }
76
+ // Create with pending tracker
77
+ const creationPromise = this.createSessionInternal(id);
78
+ this.pendingCreations.set(id, creationPromise);
79
+ try {
80
+ return await creationPromise;
81
+ }
82
+ finally {
83
+ this.pendingCreations.delete(id);
84
+ }
85
+ }
86
+ /**
87
+ * Delete a session completely (memory + history).
88
+ *
89
+ * @param id - Session ID to delete
90
+ * @returns True if session existed and was deleted
91
+ */
92
+ async deleteSession(id) {
93
+ const session = this.sessions.get(id);
94
+ if (!session) {
95
+ return false;
96
+ }
97
+ // Clear session history
98
+ session.reset();
99
+ // Remove from memory
100
+ return this.sessions.delete(id);
101
+ }
102
+ /**
103
+ * End a session (remove from memory, preserve history for future restoration).
104
+ * Currently same as deleteSession since we don't have persistent storage yet.
105
+ *
106
+ * @param id - Session ID to end
107
+ * @returns True if session existed and was ended
108
+ */
109
+ async endSession(id) {
110
+ const session = this.sessions.get(id);
111
+ if (!session) {
112
+ return false;
113
+ }
114
+ // In the future, this would preserve history in storage
115
+ // For now, just remove from memory
116
+ return this.sessions.delete(id);
117
+ }
118
+ /**
119
+ * Get a session by ID.
120
+ *
121
+ * @param id - Session ID
122
+ * @returns Session instance or undefined if not found
123
+ */
124
+ getSession(id) {
125
+ return this.sessions.get(id);
126
+ }
127
+ /**
128
+ * Get the number of active sessions.
129
+ *
130
+ * @returns Session count
131
+ */
132
+ getSessionCount() {
133
+ return this.sessions.size;
134
+ }
135
+ /**
136
+ * Check if a session exists.
137
+ *
138
+ * @param id - Session ID to check
139
+ * @returns True if session exists
140
+ */
141
+ hasSession(id) {
142
+ return this.sessions.has(id);
143
+ }
144
+ /**
145
+ * List all session IDs.
146
+ *
147
+ * @returns Array of session IDs
148
+ */
149
+ listSessions() {
150
+ return [...this.sessions.keys()];
151
+ }
152
+ /**
153
+ * Internal session creation logic.
154
+ *
155
+ * @param id - Session ID
156
+ * @returns New chat session instance
157
+ */
158
+ async createSessionInternal(id) {
159
+ // Create session-specific services using factory
160
+ const sessionServices = createSessionServices(id, this.sharedServices, this.grpcConfig, this.llmConfig);
161
+ // Create session with both shared and session services
162
+ const session = new ChatSession(id, this.sharedServices, sessionServices);
163
+ // Initialize LLM service to load persisted history from blob storage
164
+ // Only call initialize() if the service has the method (ByteRoverLLMService has it, GeminiLLMService doesn't)
165
+ if ('initialize' in sessionServices.llmService && typeof sessionServices.llmService.initialize === 'function') {
166
+ await sessionServices.llmService.initialize();
167
+ // Debug logging removed for cleaner user experience
168
+ }
169
+ this.sessions.set(id, session);
170
+ return session;
171
+ }
172
+ }
@@ -0,0 +1,76 @@
1
+ import type { SessionMetadata } from '../../../core/domain/cipher/storage/history-types.js';
2
+ import type { IBlobStorage } from '../../../core/interfaces/cipher/i-blob-storage.js';
3
+ import type { IHistoryStorage } from '../../../core/interfaces/cipher/i-history-storage.js';
4
+ import type { InternalMessage } from '../../../core/interfaces/cipher/message-types.js';
5
+ /**
6
+ * Blob-based implementation of history storage.
7
+ *
8
+ * Stores conversation history as JSON blobs in the file system.
9
+ * Each session gets its own blob file at `.brv/blobs/session-{sessionId}.blob`.
10
+ *
11
+ * Follows the same pattern as MemoryManager for consistency.
12
+ */
13
+ export declare class BlobHistoryStorage implements IHistoryStorage {
14
+ private readonly blobStorage;
15
+ private static readonly SESSION_KEY_PREFIX;
16
+ /**
17
+ * Creates a new blob history storage instance.
18
+ *
19
+ * @param blobStorage - The blob storage backend to use
20
+ */
21
+ constructor(blobStorage: IBlobStorage);
22
+ /**
23
+ * Delete all history for a specific session.
24
+ *
25
+ * @param sessionId - Unique session identifier
26
+ */
27
+ deleteHistory(sessionId: string): Promise<void>;
28
+ /**
29
+ * Check if history exists for a specific session.
30
+ *
31
+ * @param sessionId - Unique session identifier
32
+ * @returns True if history exists
33
+ */
34
+ exists(sessionId: string): Promise<boolean>;
35
+ /**
36
+ * Get metadata for a specific session without loading full history.
37
+ *
38
+ * @param sessionId - Unique session identifier
39
+ * @returns Session metadata or undefined if not found
40
+ */
41
+ getSessionMetadata(sessionId: string): Promise<SessionMetadata | undefined>;
42
+ /**
43
+ * List all session IDs that have persisted history.
44
+ *
45
+ * @returns Array of session IDs
46
+ */
47
+ listSessions(): Promise<string[]>;
48
+ /**
49
+ * Load conversation history for a specific session.
50
+ *
51
+ * @param sessionId - Unique session identifier
52
+ * @returns Array of messages, or undefined if session not found
53
+ */
54
+ loadHistory(sessionId: string): Promise<InternalMessage[] | undefined>;
55
+ /**
56
+ * Save conversation history for a specific session.
57
+ *
58
+ * @param sessionId - Unique session identifier
59
+ * @param messages - Array of messages to persist
60
+ */
61
+ saveHistory(sessionId: string, messages: InternalMessage[]): Promise<void>;
62
+ /**
63
+ * Extract session ID from storage key.
64
+ *
65
+ * @param key - Storage key (e.g., "session-abc123")
66
+ * @returns Session ID (e.g., "abc123") or undefined if invalid key
67
+ */
68
+ private extractSessionId;
69
+ /**
70
+ * Get storage key for a session.
71
+ *
72
+ * @param sessionId - Unique session identifier
73
+ * @returns Storage key (e.g., "session-abc123")
74
+ */
75
+ private getSessionKey;
76
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Blob-based implementation of history storage.
3
+ *
4
+ * Stores conversation history as JSON blobs in the file system.
5
+ * Each session gets its own blob file at `.brv/blobs/session-{sessionId}.blob`.
6
+ *
7
+ * Follows the same pattern as MemoryManager for consistency.
8
+ */
9
+ export class BlobHistoryStorage {
10
+ blobStorage;
11
+ static SESSION_KEY_PREFIX = 'session-';
12
+ /**
13
+ * Creates a new blob history storage instance.
14
+ *
15
+ * @param blobStorage - The blob storage backend to use
16
+ */
17
+ constructor(blobStorage) {
18
+ this.blobStorage = blobStorage;
19
+ }
20
+ /**
21
+ * Delete all history for a specific session.
22
+ *
23
+ * @param sessionId - Unique session identifier
24
+ */
25
+ async deleteHistory(sessionId) {
26
+ const key = this.getSessionKey(sessionId);
27
+ try {
28
+ await this.blobStorage.delete(key);
29
+ }
30
+ catch (error) {
31
+ // Log error but don't throw - graceful degradation
32
+ console.error(`[BlobHistoryStorage] Failed to delete history for session ${sessionId}:`, error);
33
+ }
34
+ }
35
+ /**
36
+ * Check if history exists for a specific session.
37
+ *
38
+ * @param sessionId - Unique session identifier
39
+ * @returns True if history exists
40
+ */
41
+ async exists(sessionId) {
42
+ const key = this.getSessionKey(sessionId);
43
+ try {
44
+ return await this.blobStorage.exists(key);
45
+ }
46
+ catch (error) {
47
+ console.error(`[BlobHistoryStorage] Error checking existence for session ${sessionId}:`, error);
48
+ return false;
49
+ }
50
+ }
51
+ /**
52
+ * Get metadata for a specific session without loading full history.
53
+ *
54
+ * @param sessionId - Unique session identifier
55
+ * @returns Session metadata or undefined if not found
56
+ */
57
+ async getSessionMetadata(sessionId) {
58
+ const key = this.getSessionKey(sessionId);
59
+ try {
60
+ const blob = await this.blobStorage.retrieve(key);
61
+ if (!blob) {
62
+ return undefined;
63
+ }
64
+ // Parse JSON content to extract metadata
65
+ const historyData = JSON.parse(blob.content.toString('utf8'));
66
+ return {
67
+ createdAt: historyData.createdAt,
68
+ lastActivity: historyData.updatedAt,
69
+ messageCount: historyData.messageCount,
70
+ sessionId: historyData.sessionId,
71
+ title: historyData.metadata?.title,
72
+ };
73
+ }
74
+ catch (error) {
75
+ console.error(`[BlobHistoryStorage] Failed to get metadata for session ${sessionId}:`, error);
76
+ return undefined;
77
+ }
78
+ }
79
+ /**
80
+ * List all session IDs that have persisted history.
81
+ *
82
+ * @returns Array of session IDs
83
+ */
84
+ async listSessions() {
85
+ try {
86
+ const keys = await this.blobStorage.list(BlobHistoryStorage.SESSION_KEY_PREFIX);
87
+ // Extract session IDs from keys (remove prefix)
88
+ return keys.map(key => this.extractSessionId(key)).filter((id) => id !== undefined);
89
+ }
90
+ catch (error) {
91
+ console.error('[BlobHistoryStorage] Failed to list sessions:', error);
92
+ return [];
93
+ }
94
+ }
95
+ /**
96
+ * Load conversation history for a specific session.
97
+ *
98
+ * @param sessionId - Unique session identifier
99
+ * @returns Array of messages, or undefined if session not found
100
+ */
101
+ async loadHistory(sessionId) {
102
+ const key = this.getSessionKey(sessionId);
103
+ try {
104
+ const blob = await this.blobStorage.retrieve(key);
105
+ if (!blob) {
106
+ return undefined;
107
+ }
108
+ // Parse JSON content
109
+ const historyData = JSON.parse(blob.content.toString('utf8'));
110
+ // Removed verbose console.log for cleaner interactive UX
111
+ // console.log(`[BlobHistoryStorage] Loaded ${historyData.messages.length} messages for session ${sessionId}`)
112
+ return historyData.messages;
113
+ }
114
+ catch (error) {
115
+ console.error(`[BlobHistoryStorage] Failed to load history for session ${sessionId}:`, error);
116
+ return undefined;
117
+ }
118
+ }
119
+ /**
120
+ * Save conversation history for a specific session.
121
+ *
122
+ * @param sessionId - Unique session identifier
123
+ * @param messages - Array of messages to persist
124
+ */
125
+ async saveHistory(sessionId, messages) {
126
+ const key = this.getSessionKey(sessionId);
127
+ // Check if session already exists to preserve createdAt timestamp
128
+ const existingMetadata = await this.getSessionMetadata(sessionId);
129
+ // Build history data structure
130
+ const now = Date.now();
131
+ const historyData = {
132
+ createdAt: existingMetadata?.createdAt ?? now, // Preserve original creation time
133
+ messageCount: messages.length,
134
+ messages,
135
+ sessionId,
136
+ updatedAt: now,
137
+ };
138
+ try {
139
+ // Serialize to JSON with pretty-printing for inspectability
140
+ const content = JSON.stringify(historyData, null, 2);
141
+ // Store in blob storage
142
+ await this.blobStorage.store(key, content, {
143
+ contentType: 'application/json',
144
+ tags: {
145
+ sessionId,
146
+ type: 'chat-history',
147
+ },
148
+ });
149
+ // Removed verbose console.log for cleaner interactive UX
150
+ // console.log(`[BlobHistoryStorage] Saved ${messages.length} messages for session ${sessionId}`)
151
+ }
152
+ catch (error) {
153
+ // Log error but don't throw - graceful degradation
154
+ console.error(`[BlobHistoryStorage] Failed to save history for session ${sessionId}:`, error);
155
+ }
156
+ }
157
+ /**
158
+ * Extract session ID from storage key.
159
+ *
160
+ * @param key - Storage key (e.g., "session-abc123")
161
+ * @returns Session ID (e.g., "abc123") or undefined if invalid key
162
+ */
163
+ extractSessionId(key) {
164
+ if (!key.startsWith(BlobHistoryStorage.SESSION_KEY_PREFIX)) {
165
+ return undefined;
166
+ }
167
+ return key.slice(BlobHistoryStorage.SESSION_KEY_PREFIX.length);
168
+ }
169
+ /**
170
+ * Get storage key for a session.
171
+ *
172
+ * @param sessionId - Unique session identifier
173
+ * @returns Storage key (e.g., "session-abc123")
174
+ */
175
+ getSessionKey(sessionId) {
176
+ return `${BlobHistoryStorage.SESSION_KEY_PREFIX}${sessionId}`;
177
+ }
178
+ }