byterover-cli 0.2.0 → 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 (498) 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 +53 -2
  18. package/dist/commands/init.js +279 -66
  19. package/dist/commands/login.js +9 -4
  20. package/dist/commands/logout.d.ts +16 -0
  21. package/dist/commands/logout.js +61 -0
  22. package/dist/commands/pull.d.ts +33 -0
  23. package/dist/commands/pull.js +115 -0
  24. package/dist/commands/push.d.ts +13 -13
  25. package/dist/commands/push.js +81 -101
  26. package/dist/commands/query.d.ts +63 -0
  27. package/dist/commands/query.js +349 -0
  28. package/dist/commands/space/list.d.ts +5 -2
  29. package/dist/commands/space/list.js +60 -56
  30. package/dist/commands/space/switch.d.ts +16 -0
  31. package/dist/commands/space/switch.js +102 -53
  32. package/dist/commands/status.d.ts +5 -2
  33. package/dist/commands/status.js +43 -33
  34. package/dist/commands/watch.d.ts +23 -0
  35. package/dist/commands/watch.js +171 -0
  36. package/dist/config/auth.config.js +14 -2
  37. package/dist/config/context-tree-domains.d.ts +12 -0
  38. package/dist/config/context-tree-domains.js +29 -0
  39. package/dist/config/environment.d.ts +6 -0
  40. package/dist/config/environment.js +9 -2
  41. package/dist/constants.d.ts +5 -0
  42. package/dist/constants.js +6 -0
  43. package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
  44. package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
  45. package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
  46. package/dist/core/domain/cipher/agent/agent-state.js +59 -0
  47. package/dist/core/domain/cipher/agent/index.d.ts +7 -0
  48. package/dist/core/domain/cipher/agent/index.js +7 -0
  49. package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
  50. package/dist/core/domain/cipher/agent-events/index.js +7 -0
  51. package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
  52. package/dist/core/domain/cipher/agent-events/types.js +42 -0
  53. package/dist/core/domain/cipher/blob/types.d.ts +108 -0
  54. package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
  55. package/dist/core/domain/cipher/errors/blob-error.js +68 -0
  56. package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
  57. package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
  58. package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
  59. package/dist/core/domain/cipher/errors/llm-error.js +161 -0
  60. package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
  61. package/dist/core/domain/cipher/errors/memory-error.js +62 -0
  62. package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
  63. package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
  64. package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
  65. package/dist/core/domain/cipher/errors/process-error.js +173 -0
  66. package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
  67. package/dist/core/domain/cipher/errors/session-error.js +74 -0
  68. package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
  69. package/dist/core/domain/cipher/errors/tool-error.js +81 -0
  70. package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
  71. package/dist/core/domain/cipher/memory/types.d.ts +102 -0
  72. package/dist/core/domain/cipher/memory/types.js +4 -0
  73. package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
  74. package/dist/core/domain/cipher/parsed-interaction.js +25 -0
  75. package/dist/core/domain/cipher/process/types.d.ts +286 -0
  76. package/dist/core/domain/cipher/session/types.d.ts +54 -0
  77. package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
  78. package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
  79. package/dist/core/domain/cipher/todos/index.d.ts +4 -0
  80. package/dist/core/domain/cipher/todos/index.js +4 -0
  81. package/dist/core/domain/cipher/todos/types.d.ts +57 -0
  82. package/dist/core/domain/cipher/todos/types.js +5 -0
  83. package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
  84. package/dist/core/domain/cipher/tools/constants.js +24 -0
  85. package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
  86. package/dist/core/domain/cipher/tools/tool-error.js +246 -0
  87. package/dist/core/domain/cipher/tools/types.d.ts +145 -0
  88. package/dist/core/domain/entities/brv-config.d.ts +42 -6
  89. package/dist/core/domain/entities/brv-config.js +115 -17
  90. package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
  91. package/dist/core/domain/entities/cogit-push-context.js +91 -0
  92. package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
  93. package/dist/core/domain/entities/cogit-push-response.js +31 -0
  94. package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
  95. package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
  96. package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
  97. package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
  98. package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
  99. package/dist/core/domain/entities/cogit-snapshot.js +58 -0
  100. package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
  101. package/dist/core/domain/entities/context-tree-index.js +27 -0
  102. package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
  103. package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
  104. package/dist/core/domain/entities/event.d.ts +1 -1
  105. package/dist/core/domain/entities/event.js +4 -1
  106. package/dist/core/domain/entities/parser.d.ts +567 -0
  107. package/dist/core/domain/entities/parser.js +10 -0
  108. package/dist/core/domain/entities/playbook.d.ts +2 -23
  109. package/dist/core/domain/entities/playbook.js +2 -70
  110. package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
  111. package/dist/core/domain/errors/brv-config-version-error.js +21 -0
  112. package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
  113. package/dist/core/domain/knowledge/directory-manager.js +145 -0
  114. package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
  115. package/dist/core/domain/knowledge/markdown-writer.js +18 -0
  116. package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
  117. package/dist/core/domain/knowledge/relation-parser.js +131 -0
  118. package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
  119. package/dist/core/interfaces/cipher/cipher-services.js +1 -0
  120. package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
  121. package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
  122. package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
  123. package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
  124. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
  125. package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
  126. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
  127. package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
  128. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
  129. package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
  130. package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
  131. package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
  132. package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
  133. package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
  134. package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
  135. package/dist/core/interfaces/cipher/i-file-system.js +1 -0
  136. package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
  137. package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
  138. package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
  139. package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
  140. package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
  141. package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
  142. package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
  143. package/dist/core/interfaces/cipher/i-logger.js +28 -0
  144. package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
  145. package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
  146. package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
  147. package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
  148. package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
  149. package/dist/core/interfaces/cipher/i-process-service.js +1 -0
  150. package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
  151. package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
  152. package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
  153. package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
  154. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
  155. package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
  156. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
  157. package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
  158. package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
  159. package/dist/core/interfaces/cipher/llm-types.js +5 -0
  160. package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
  161. package/dist/core/interfaces/cipher/message-types.js +5 -0
  162. package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
  163. package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
  164. package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
  165. package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
  166. package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
  167. package/dist/core/interfaces/i-cogit-push-service.js +1 -0
  168. package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
  169. package/dist/core/interfaces/i-context-file-reader.js +1 -0
  170. package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
  171. package/dist/core/interfaces/i-context-tree-service.js +1 -0
  172. package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
  173. package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
  174. package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
  175. package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
  176. package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
  177. package/dist/core/interfaces/i-file-watcher-service.js +1 -0
  178. package/dist/core/interfaces/i-rule-template-service.d.ts +0 -4
  179. package/dist/core/interfaces/i-rule-template-service.js +1 -4
  180. package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
  181. package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
  182. package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
  183. package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
  184. package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
  185. package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
  186. package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
  187. package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
  188. package/dist/hooks/error/clean-errors.d.ts +7 -0
  189. package/dist/hooks/error/clean-errors.js +50 -0
  190. package/dist/hooks/init/welcome.js +72 -1
  191. package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
  192. package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
  193. package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
  194. package/dist/infra/cipher/agent-service-factory.js +212 -0
  195. package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
  196. package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
  197. package/dist/infra/cipher/blob/index.d.ts +10 -0
  198. package/dist/infra/cipher/blob/index.js +12 -0
  199. package/dist/infra/cipher/blob/migrations.d.ts +63 -0
  200. package/dist/infra/cipher/blob/migrations.js +148 -0
  201. package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
  202. package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
  203. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
  204. package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
  205. package/dist/infra/cipher/cipher-agent.d.ts +182 -0
  206. package/dist/infra/cipher/cipher-agent.js +317 -0
  207. package/dist/infra/cipher/command-parser.d.ts +23 -0
  208. package/dist/infra/cipher/command-parser.js +85 -0
  209. package/dist/infra/cipher/display/todo-display.d.ts +23 -0
  210. package/dist/infra/cipher/display/todo-display.js +129 -0
  211. package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
  212. package/dist/infra/cipher/events/event-emitter.js +158 -0
  213. package/dist/infra/cipher/exit-codes.d.ts +44 -0
  214. package/dist/infra/cipher/exit-codes.js +58 -0
  215. package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
  216. package/dist/infra/cipher/file-system/file-system-service.js +641 -0
  217. package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
  218. package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
  219. package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
  220. package/dist/infra/cipher/file-system/glob-utils.js +120 -0
  221. package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
  222. package/dist/infra/cipher/file-system/path-validator.js +184 -0
  223. package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
  224. package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
  225. package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
  226. package/dist/infra/cipher/interactive-commands.d.ts +16 -0
  227. package/dist/infra/cipher/interactive-commands.js +198 -0
  228. package/dist/infra/cipher/interactive-loop.d.ts +24 -0
  229. package/dist/infra/cipher/interactive-loop.js +352 -0
  230. package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
  231. package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
  232. package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
  233. package/dist/infra/cipher/llm/context/compression/index.js +5 -0
  234. package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
  235. package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
  236. package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
  237. package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
  238. package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
  239. package/dist/infra/cipher/llm/context/compression/types.js +1 -0
  240. package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
  241. package/dist/infra/cipher/llm/context/context-manager.js +419 -0
  242. package/dist/infra/cipher/llm/context/index.d.ts +2 -0
  243. package/dist/infra/cipher/llm/context/index.js +2 -0
  244. package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
  245. package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
  246. package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
  247. package/dist/infra/cipher/llm/context/utils.js +89 -0
  248. package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
  249. package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
  250. package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
  251. package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
  252. package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
  253. package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
  254. package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
  255. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
  256. package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
  257. package/dist/infra/cipher/llm/generators/index.js +13 -0
  258. package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
  259. package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
  260. package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
  261. package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
  262. package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
  263. package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
  264. package/dist/infra/cipher/llm/index.d.ts +9 -0
  265. package/dist/infra/cipher/llm/index.js +13 -0
  266. package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
  267. package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
  268. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
  269. package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
  270. package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
  271. package/dist/infra/cipher/llm/response-validator.js +157 -0
  272. package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
  273. package/dist/infra/cipher/llm/retry/index.js +10 -0
  274. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
  275. package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
  276. package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
  277. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
  278. package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
  279. package/dist/infra/cipher/llm/thought-parser.js +190 -0
  280. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
  281. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
  282. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
  283. package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
  284. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
  285. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
  286. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
  287. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
  288. package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
  289. package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
  290. package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
  291. package/dist/infra/cipher/logger/console-logger.js +63 -0
  292. package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
  293. package/dist/infra/cipher/logger/event-based-logger.js +92 -0
  294. package/dist/infra/cipher/memory/index.d.ts +6 -0
  295. package/dist/infra/cipher/memory/index.js +7 -0
  296. package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
  297. package/dist/infra/cipher/memory/memory-manager.js +523 -0
  298. package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
  299. package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
  300. package/dist/infra/cipher/process/command-validator.d.ts +59 -0
  301. package/dist/infra/cipher/process/command-validator.js +266 -0
  302. package/dist/infra/cipher/process/index.d.ts +8 -0
  303. package/dist/infra/cipher/process/index.js +8 -0
  304. package/dist/infra/cipher/process/process-service.d.ts +95 -0
  305. package/dist/infra/cipher/process/process-service.js +439 -0
  306. package/dist/infra/cipher/session/chat-session.d.ts +80 -0
  307. package/dist/infra/cipher/session/chat-session.js +165 -0
  308. package/dist/infra/cipher/session/index.d.ts +6 -0
  309. package/dist/infra/cipher/session/index.js +5 -0
  310. package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
  311. package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
  312. package/dist/infra/cipher/session/session-manager.d.ts +109 -0
  313. package/dist/infra/cipher/session/session-manager.js +172 -0
  314. package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
  315. package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
  316. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
  317. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
  318. package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
  319. package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
  320. package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
  321. package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
  322. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
  323. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
  324. package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
  325. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
  326. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
  327. package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
  328. package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
  329. package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
  330. package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
  331. package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
  332. package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
  333. package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
  334. package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
  335. package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
  336. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
  337. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
  338. package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
  339. package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
  340. package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
  341. package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
  342. package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
  343. package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
  344. package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
  345. package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
  346. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
  347. package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
  348. package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
  349. package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
  350. package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
  351. package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
  352. package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
  353. package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
  354. package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
  355. package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
  356. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
  357. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
  358. package/dist/infra/cipher/tools/index.d.ts +18 -0
  359. package/dist/infra/cipher/tools/index.js +19 -0
  360. package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
  361. package/dist/infra/cipher/tools/policy-engine.js +110 -0
  362. package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
  363. package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
  364. package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
  365. package/dist/infra/cipher/tools/tool-invocation.js +294 -0
  366. package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
  367. package/dist/infra/cipher/tools/tool-manager.js +209 -0
  368. package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
  369. package/dist/infra/cipher/tools/tool-markers.js +49 -0
  370. package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
  371. package/dist/infra/cipher/tools/tool-provider.js +196 -0
  372. package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
  373. package/dist/infra/cipher/tools/tool-registry.js +144 -0
  374. package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
  375. package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
  376. package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
  377. package/dist/infra/cipher/validation/workspace-validator.js +37 -0
  378. package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
  379. package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
  380. package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
  381. package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
  382. package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
  383. package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
  384. package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
  385. package/dist/infra/cogit/http-cogit-push-service.js +104 -0
  386. package/dist/infra/config/file-config-store.js +9 -3
  387. package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
  388. package/dist/infra/context-tree/file-context-file-reader.js +46 -0
  389. package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
  390. package/dist/infra/context-tree/file-context-tree-service.js +46 -0
  391. package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
  392. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
  393. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
  394. package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
  395. package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
  396. package/dist/infra/memory/http-memory-storage-service.js +4 -3
  397. package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
  398. package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
  399. package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
  400. package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
  401. package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
  402. package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
  403. package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
  404. package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
  405. package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
  406. package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
  407. package/dist/infra/parsers/clean/shared.d.ts +84 -0
  408. package/dist/infra/parsers/clean/shared.js +273 -0
  409. package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
  410. package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
  411. package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
  412. package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
  413. package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
  414. package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
  415. package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
  416. package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
  417. package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
  418. package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
  419. package/dist/infra/rule/constants.d.ts +4 -0
  420. package/dist/infra/rule/constants.js +4 -0
  421. package/dist/infra/rule/rule-template-service.js +1 -1
  422. package/dist/infra/rule/rule-writer-service.js +1 -5
  423. package/dist/infra/space/http-space-service.js +2 -1
  424. package/dist/infra/team/http-team-service.js +2 -1
  425. package/dist/infra/user/http-user-service.js +2 -1
  426. package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
  427. package/dist/infra/watcher/file-watcher-service.js +81 -0
  428. package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
  429. package/dist/infra/workspace/workspace-detector-service.js +165 -0
  430. package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
  431. package/dist/resources/prompts/modes/autonomous.yml +9 -0
  432. package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
  433. package/dist/resources/prompts/reflection.yml +27 -0
  434. package/dist/resources/prompts/system-prompt.yml +82 -0
  435. package/dist/resources/prompts/tool-outputs.yml +30 -0
  436. package/dist/templates/README.md +6 -7
  437. package/dist/templates/sections/command-reference.md +40 -93
  438. package/dist/templates/sections/workflow.md +3 -30
  439. package/dist/utils/emoji-helpers.d.ts +38 -0
  440. package/dist/utils/emoji-helpers.js +42 -0
  441. package/dist/utils/error-handler.d.ts +51 -0
  442. package/dist/utils/error-handler.js +169 -0
  443. package/dist/utils/error-helpers.d.ts +30 -0
  444. package/dist/utils/error-helpers.js +47 -0
  445. package/dist/utils/file-helpers.d.ts +15 -0
  446. package/dist/utils/file-helpers.js +44 -0
  447. package/dist/utils/oclif-error-helpers.d.ts +40 -0
  448. package/dist/utils/oclif-error-helpers.js +46 -0
  449. package/dist/utils/tool-display-formatter.d.ts +53 -0
  450. package/dist/utils/tool-display-formatter.js +257 -0
  451. package/oclif.manifest.json +422 -142
  452. package/package.json +29 -10
  453. package/dist/commands/add.d.ts +0 -49
  454. package/dist/commands/add.js +0 -192
  455. package/dist/commands/complete.d.ts +0 -108
  456. package/dist/commands/complete.js +0 -340
  457. package/dist/commands/retrieve.d.ts +0 -26
  458. package/dist/commands/retrieve.js +0 -101
  459. package/dist/core/domain/entities/curator-output.d.ts +0 -14
  460. package/dist/core/domain/entities/curator-output.js +0 -23
  461. package/dist/core/domain/entities/delta-batch.d.ts +0 -30
  462. package/dist/core/domain/entities/delta-batch.js +0 -52
  463. package/dist/core/domain/entities/delta-operation.d.ts +0 -31
  464. package/dist/core/domain/entities/delta-operation.js +0 -50
  465. package/dist/core/domain/entities/executor-output.d.ts +0 -27
  466. package/dist/core/domain/entities/executor-output.js +0 -33
  467. package/dist/core/domain/entities/reflector-output.d.ts +0 -38
  468. package/dist/core/domain/entities/reflector-output.js +0 -44
  469. package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
  470. package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
  471. package/dist/core/interfaces/i-delta-store.d.ts +0 -15
  472. package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
  473. package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
  474. package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
  475. package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
  476. package/dist/infra/ace/ace-file-utils.d.ts +0 -46
  477. package/dist/infra/ace/ace-file-utils.js +0 -83
  478. package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
  479. package/dist/infra/ace/ace-prompt-templates.js +0 -177
  480. package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
  481. package/dist/infra/ace/file-bullet-content-store.js +0 -89
  482. package/dist/infra/ace/file-delta-store.d.ts +0 -9
  483. package/dist/infra/ace/file-delta-store.js +0 -26
  484. package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
  485. package/dist/infra/ace/file-executor-output-store.js +0 -26
  486. package/dist/infra/ace/file-playbook-store.d.ts +0 -29
  487. package/dist/infra/ace/file-playbook-store.js +0 -107
  488. package/dist/infra/ace/file-reflection-store.d.ts +0 -10
  489. package/dist/infra/ace/file-reflection-store.js +0 -55
  490. package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
  491. package/dist/infra/playbook/file-playbook-service.js +0 -132
  492. /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
  493. /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
  494. /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
  495. /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
  496. /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
  497. /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
  498. /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
@@ -0,0 +1,439 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { isAbsolute, relative, resolve } from 'node:path';
4
+ import { ProcessError } from '../../../core/domain/cipher/errors/process-error.js';
5
+ import { CommandValidator } from './command-validator.js';
6
+ /**
7
+ * Default timeout for foreground commands (milliseconds).
8
+ */
9
+ const DEFAULT_TIMEOUT = 120_000; // 2 minutes
10
+ /**
11
+ * Default maximum timeout (milliseconds).
12
+ */
13
+ const DEFAULT_MAX_TIMEOUT = 600_000; // 10 minutes
14
+ /**
15
+ * Default maximum concurrent background processes.
16
+ */
17
+ const DEFAULT_MAX_CONCURRENT_PROCESSES = 5;
18
+ /**
19
+ * Default maximum output buffer size (bytes).
20
+ */
21
+ const DEFAULT_MAX_OUTPUT_BUFFER = 1024 * 1024; // 1MB
22
+ /**
23
+ * Process service implementation.
24
+ *
25
+ * Provides secure command execution with:
26
+ * - Multi-layer security validation
27
+ * - Foreground and background execution
28
+ * - Output buffering with size limits
29
+ * - Timeout management with signal escalation
30
+ * - Working directory confinement
31
+ * - Approval system integration
32
+ */
33
+ export class ProcessService {
34
+ backgroundProcesses = new Map();
35
+ commandValidator;
36
+ config;
37
+ initialized = false;
38
+ /**
39
+ * Creates a new process service.
40
+ *
41
+ * @param config - Process configuration (partial, will be merged with defaults)
42
+ */
43
+ constructor(config = {}) {
44
+ // Merge with defaults
45
+ this.config = {
46
+ allowedCommands: config.allowedCommands || [],
47
+ blockedCommands: config.blockedCommands || [],
48
+ environment: config.environment || {},
49
+ maxConcurrentProcesses: config.maxConcurrentProcesses || DEFAULT_MAX_CONCURRENT_PROCESSES,
50
+ maxOutputBuffer: config.maxOutputBuffer || DEFAULT_MAX_OUTPUT_BUFFER,
51
+ maxTimeout: config.maxTimeout || DEFAULT_MAX_TIMEOUT,
52
+ securityLevel: config.securityLevel || 'moderate',
53
+ workingDirectory: config.workingDirectory,
54
+ };
55
+ this.commandValidator = new CommandValidator({
56
+ allowedCommands: this.config.allowedCommands,
57
+ blockedCommands: this.config.blockedCommands,
58
+ securityLevel: this.config.securityLevel,
59
+ });
60
+ }
61
+ /**
62
+ * Clean up completed background processes older than 1 hour.
63
+ */
64
+ async cleanup() {
65
+ const now = Date.now();
66
+ const CLEANUP_AGE = 3_600_000; // 1 hour in milliseconds
67
+ for (const [processId, bgProcess] of this.backgroundProcesses.entries()) {
68
+ if (bgProcess.status !== 'running' && bgProcess.completedAt) {
69
+ const age = now - bgProcess.completedAt.getTime();
70
+ if (age > CLEANUP_AGE) {
71
+ this.backgroundProcesses.delete(processId);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Execute a shell command.
78
+ *
79
+ * @param command - Shell command to execute
80
+ * @param options - Execution options
81
+ * @returns Process result or handle
82
+ */
83
+ async executeCommand(command, options = {}) {
84
+ if (!this.initialized) {
85
+ throw ProcessError.notInitialized();
86
+ }
87
+ // Validate command
88
+ const validation = this.commandValidator.validateCommand(command);
89
+ if (!validation.isValid) {
90
+ throw ProcessError.invalidCommand(command, validation.error);
91
+ }
92
+ const { normalizedCommand } = validation;
93
+ // Validate timeout
94
+ const timeout = options.timeout || DEFAULT_TIMEOUT;
95
+ if (timeout > this.config.maxTimeout) {
96
+ throw ProcessError.invalidCommand(command, `Timeout ${timeout}ms exceeds maximum ${this.config.maxTimeout}ms`);
97
+ }
98
+ // Resolve working directory
99
+ const cwd = this.resolveSafeCwd(options.cwd);
100
+ // Merge environment variables
101
+ const env = {};
102
+ for (const [key, value] of Object.entries({
103
+ ...process.env,
104
+ ...this.config.environment,
105
+ ...options.env,
106
+ })) {
107
+ if (value !== undefined) {
108
+ env[key] = value;
109
+ }
110
+ }
111
+ // Execute based on mode
112
+ if (options.runInBackground) {
113
+ return this.executeInBackground(normalizedCommand, {
114
+ cwd,
115
+ description: options.description,
116
+ env,
117
+ timeout,
118
+ });
119
+ }
120
+ return this.executeForeground(normalizedCommand, { cwd, env, timeout });
121
+ }
122
+ /**
123
+ * Get the current process configuration.
124
+ */
125
+ getConfig() {
126
+ return { ...this.config };
127
+ }
128
+ /**
129
+ * Get output from a background process.
130
+ *
131
+ * @param processId - Unique process identifier
132
+ * @returns Process output
133
+ */
134
+ async getProcessOutput(processId) {
135
+ const bgProcess = this.backgroundProcesses.get(processId);
136
+ if (!bgProcess) {
137
+ throw ProcessError.processNotFound(processId);
138
+ }
139
+ // Join output chunks
140
+ const stdout = bgProcess.outputBuffer.stdout.join('');
141
+ const stderr = bgProcess.outputBuffer.stderr.join('');
142
+ // Clear buffer (destructive read)
143
+ bgProcess.outputBuffer.stdout = [];
144
+ bgProcess.outputBuffer.stderr = [];
145
+ bgProcess.outputBuffer.lastRead = Date.now();
146
+ bgProcess.outputBuffer.bytesUsed = 0;
147
+ // Calculate duration if completed
148
+ let duration;
149
+ if (bgProcess.completedAt) {
150
+ duration = bgProcess.completedAt.getTime() - bgProcess.startedAt.getTime();
151
+ }
152
+ return {
153
+ duration,
154
+ exitCode: bgProcess.exitCode,
155
+ status: bgProcess.status,
156
+ stderr,
157
+ stdout,
158
+ };
159
+ }
160
+ /**
161
+ * Initialize the process service.
162
+ */
163
+ async initialize() {
164
+ // Clear any stale processes
165
+ this.backgroundProcesses.clear();
166
+ this.initialized = true;
167
+ }
168
+ /**
169
+ * Terminate a background process.
170
+ *
171
+ * @param processId - Unique process identifier
172
+ */
173
+ async killProcess(processId) {
174
+ const bgProcess = this.backgroundProcesses.get(processId);
175
+ if (!bgProcess) {
176
+ throw ProcessError.processNotFound(processId);
177
+ }
178
+ if (bgProcess.status !== 'running') {
179
+ // Process already terminated
180
+ return;
181
+ }
182
+ try {
183
+ // Send SIGTERM
184
+ bgProcess.child.kill('SIGTERM');
185
+ // Wait 5 seconds, then escalate to SIGKILL
186
+ setTimeout(() => {
187
+ if (bgProcess.child.exitCode === null) {
188
+ bgProcess.child.kill('SIGKILL');
189
+ }
190
+ }, 5000);
191
+ }
192
+ catch (error) {
193
+ throw ProcessError.killFailed(processId, error instanceof Error ? error.message : String(error));
194
+ }
195
+ }
196
+ /**
197
+ * List all background processes.
198
+ */
199
+ async listProcesses() {
200
+ const processes = [];
201
+ for (const bgProcess of this.backgroundProcesses.values()) {
202
+ processes.push({
203
+ command: bgProcess.command,
204
+ completedAt: bgProcess.completedAt,
205
+ description: bgProcess.description,
206
+ exitCode: bgProcess.exitCode,
207
+ pid: bgProcess.child.pid,
208
+ processId: bgProcess.processId,
209
+ startedAt: bgProcess.startedAt,
210
+ status: bgProcess.status,
211
+ });
212
+ }
213
+ return processes;
214
+ }
215
+ /**
216
+ * Execute command in foreground (wait for completion).
217
+ *
218
+ * @param command - Normalized command to execute
219
+ * @param options - Execution options
220
+ * @param options.cwd - Working directory
221
+ * @param options.env - Environment variables
222
+ * @param options.timeout - Timeout in milliseconds
223
+ * @returns Process result with stdout, stderr, exit code, duration
224
+ */
225
+ async executeForeground(command, options) {
226
+ return new Promise((resolve, reject) => {
227
+ const startTime = Date.now();
228
+ let stdout = '';
229
+ let stderr = '';
230
+ let killed = false;
231
+ let closed = false;
232
+ // Spawn process
233
+ const child = spawn(command, {
234
+ cwd: options.cwd,
235
+ env: options.env,
236
+ shell: true,
237
+ });
238
+ // Collect stdout
239
+ child.stdout?.on('data', (data) => {
240
+ stdout += data.toString();
241
+ });
242
+ // Collect stderr
243
+ child.stderr?.on('data', (data) => {
244
+ stderr += data.toString();
245
+ });
246
+ // Handle timeout
247
+ const timeoutHandle = setTimeout(() => {
248
+ if (!closed) {
249
+ killed = true;
250
+ child.kill('SIGTERM');
251
+ // Escalate to SIGKILL after 5 seconds
252
+ setTimeout(() => {
253
+ if (!closed && child.exitCode === null) {
254
+ child.kill('SIGKILL');
255
+ }
256
+ }, 5000);
257
+ }
258
+ }, options.timeout);
259
+ // Handle process exit
260
+ child.on('close', (code, signal) => {
261
+ closed = true;
262
+ clearTimeout(timeoutHandle);
263
+ const duration = Date.now() - startTime;
264
+ if (killed) {
265
+ reject(ProcessError.timeout(command, options.timeout));
266
+ return;
267
+ }
268
+ if (signal) {
269
+ reject(ProcessError.executionFailed(command, `Process terminated by signal: ${signal}`));
270
+ return;
271
+ }
272
+ resolve({
273
+ duration,
274
+ exitCode: code ?? 1,
275
+ stderr,
276
+ stdout,
277
+ });
278
+ });
279
+ // Handle spawn errors
280
+ child.on('error', (error) => {
281
+ clearTimeout(timeoutHandle);
282
+ if (error.code === 'ENOENT') {
283
+ reject(ProcessError.commandNotFound(command));
284
+ }
285
+ else if (error.code === 'EACCES') {
286
+ reject(ProcessError.permissionDenied(command));
287
+ }
288
+ else {
289
+ reject(ProcessError.executionFailed(command, error.message));
290
+ }
291
+ });
292
+ });
293
+ }
294
+ /**
295
+ * Execute command in background (return immediately).
296
+ *
297
+ * @param command - Normalized command to execute
298
+ * @param options - Execution options
299
+ * @param options.cwd - Working directory
300
+ * @param options.description - Optional description
301
+ * @param options.env - Environment variables
302
+ * @param options.timeout - Timeout in milliseconds
303
+ * @returns Process handle with processId
304
+ */
305
+ async executeInBackground(command, options) {
306
+ // Check concurrent process limit
307
+ const runningCount = [...this.backgroundProcesses.values()].filter(p => p.status === 'running').length;
308
+ if (runningCount >= this.config.maxConcurrentProcesses) {
309
+ throw ProcessError.tooManyProcesses(runningCount, this.config.maxConcurrentProcesses);
310
+ }
311
+ // Generate unique process ID
312
+ const processId = randomBytes(4).toString('hex');
313
+ // Initialize output buffer
314
+ const outputBuffer = {
315
+ bytesUsed: 0,
316
+ complete: false,
317
+ lastRead: Date.now(),
318
+ stderr: [],
319
+ stdout: [],
320
+ truncated: false,
321
+ };
322
+ // Spawn process
323
+ const child = spawn(command, {
324
+ cwd: options.cwd,
325
+ detached: false, // Process dies with parent
326
+ env: options.env,
327
+ shell: true,
328
+ });
329
+ const startedAt = new Date();
330
+ // Create background process entry
331
+ const bgProcess = {
332
+ child,
333
+ command,
334
+ description: options.description,
335
+ outputBuffer,
336
+ processId,
337
+ startedAt,
338
+ status: 'running',
339
+ };
340
+ this.backgroundProcesses.set(processId, bgProcess);
341
+ // Collect stdout with buffer limit
342
+ child.stdout?.on('data', (data) => {
343
+ const chunk = data.toString();
344
+ const chunkBytes = Buffer.byteLength(chunk, 'utf8');
345
+ if (outputBuffer.bytesUsed + chunkBytes <= this.config.maxOutputBuffer) {
346
+ outputBuffer.stdout.push(chunk);
347
+ outputBuffer.bytesUsed += chunkBytes;
348
+ }
349
+ else if (!outputBuffer.truncated) {
350
+ outputBuffer.truncated = true;
351
+ // Note: In production, you might want to log this
352
+ }
353
+ });
354
+ // Collect stderr with buffer limit
355
+ child.stderr?.on('data', (data) => {
356
+ const chunk = data.toString();
357
+ const chunkBytes = Buffer.byteLength(chunk, 'utf8');
358
+ if (outputBuffer.bytesUsed + chunkBytes <= this.config.maxOutputBuffer) {
359
+ outputBuffer.stderr.push(chunk);
360
+ outputBuffer.bytesUsed += chunkBytes;
361
+ }
362
+ else if (!outputBuffer.truncated) {
363
+ outputBuffer.truncated = true;
364
+ // Note: In production, you might want to log this
365
+ }
366
+ });
367
+ // Handle process completion
368
+ child.on('close', (code, signal) => {
369
+ outputBuffer.complete = true;
370
+ bgProcess.completedAt = new Date();
371
+ bgProcess.exitCode = code ?? 1;
372
+ if (signal) {
373
+ bgProcess.status = 'failed';
374
+ }
375
+ else if (code === 0) {
376
+ bgProcess.status = 'completed';
377
+ }
378
+ else {
379
+ bgProcess.status = 'failed';
380
+ }
381
+ });
382
+ // Handle spawn errors
383
+ child.on('error', () => {
384
+ bgProcess.status = 'failed';
385
+ bgProcess.completedAt = new Date();
386
+ bgProcess.exitCode = 1;
387
+ outputBuffer.complete = true;
388
+ });
389
+ // Set timeout handler
390
+ const killTimer = setTimeout(() => {
391
+ if (bgProcess.status === 'running') {
392
+ child.kill('SIGTERM');
393
+ // Escalate to SIGKILL after 5 seconds
394
+ setTimeout(() => {
395
+ if (bgProcess.status === 'running') {
396
+ child.kill('SIGKILL');
397
+ }
398
+ }, 5000);
399
+ }
400
+ }, options.timeout);
401
+ // Clear timeout when process completes
402
+ child.on('close', () => {
403
+ clearTimeout(killTimer);
404
+ });
405
+ // Return handle immediately
406
+ return {
407
+ command,
408
+ description: options.description,
409
+ pid: child.pid,
410
+ processId,
411
+ startedAt,
412
+ };
413
+ }
414
+ /**
415
+ * Resolve and validate working directory.
416
+ *
417
+ * Ensures the directory is within the configured base directory
418
+ * and prevents directory traversal attacks.
419
+ *
420
+ * @param cwd - Optional working directory (relative or absolute)
421
+ * @returns Safe absolute working directory
422
+ */
423
+ resolveSafeCwd(cwd) {
424
+ const baseDir = this.config.workingDirectory || process.cwd();
425
+ // If no cwd specified, use base directory
426
+ if (!cwd) {
427
+ return baseDir;
428
+ }
429
+ // Resolve to absolute path
430
+ const candidatePath = isAbsolute(cwd) ? resolve(cwd) : resolve(baseDir, cwd);
431
+ // Check if path is within base directory
432
+ const relativePath = relative(baseDir, candidatePath);
433
+ const isOutsideBase = relativePath.startsWith('..') || isAbsolute(relativePath);
434
+ if (isOutsideBase) {
435
+ throw ProcessError.invalidWorkingDirectory(cwd, `Working directory must be within ${baseDir}`);
436
+ }
437
+ return candidatePath;
438
+ }
439
+ }
@@ -0,0 +1,80 @@
1
+ import type { Message } from '../../../core/domain/cipher/session/types.js';
2
+ import type { CipherAgentServices, SessionServices } from '../../../core/interfaces/cipher/cipher-services.js';
3
+ import type { IChatSession } from '../../../core/interfaces/cipher/i-chat-session.js';
4
+ import type { ExecutionContext } from '../../../core/interfaces/cipher/i-cipher-agent.js';
5
+ import type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
6
+ import { SessionEventBus } from '../events/event-emitter.js';
7
+ /**
8
+ * Chat session implementation.
9
+ *
10
+ * Following Dexto's pattern: ChatSession owns session-specific services
11
+ * (LLM, EventBus) and receives shared services (ToolManager, SystemPromptManager).
12
+ *
13
+ * The LLM service handles:
14
+ * - Message history (via ContextManager)
15
+ * - Agentic loop
16
+ * - Tool execution
17
+ *
18
+ * This session provides:
19
+ * - Session isolation
20
+ * - Cancellation support
21
+ * - Event forwarding to agent bus
22
+ * - Proper cleanup/disposal
23
+ */
24
+ export declare class ChatSession implements IChatSession {
25
+ readonly eventBus: SessionEventBus;
26
+ readonly id: string;
27
+ private currentController?;
28
+ private readonly forwarders;
29
+ private readonly llmService;
30
+ private readonly sharedServices;
31
+ /**
32
+ * Creates a new chat session
33
+ *
34
+ * @param id - Unique session identifier
35
+ * @param sharedServices - Shared services from CipherAgent
36
+ * @param sessionServices - Session-specific services (LLM, EventBus)
37
+ */
38
+ constructor(id: string, sharedServices: CipherAgentServices, sessionServices: SessionServices);
39
+ /**
40
+ * Cancel the current operation.
41
+ */
42
+ cancel(): void;
43
+ /**
44
+ * Dispose of the session and clean up resources.
45
+ * Removes event listeners to prevent memory leaks.
46
+ */
47
+ dispose(): void;
48
+ /**
49
+ * Get the conversation history.
50
+ */
51
+ getHistory(): Message[];
52
+ /**
53
+ * Get the LLM service for direct access to context manager.
54
+ * Useful for pre-loading conversation history in JSON input mode.
55
+ */
56
+ getLLMService(): ILLMService;
57
+ /**
58
+ * Get the number of messages in the conversation.
59
+ */
60
+ getMessageCount(): number;
61
+ /**
62
+ * Reset the conversation history.
63
+ */
64
+ reset(): void;
65
+ /**
66
+ * Send a message and get a response.
67
+ * Delegates to the LLM service which handles the agentic loop.
68
+ */
69
+ run(input: string, options?: {
70
+ executionContext?: ExecutionContext;
71
+ mode?: 'autonomous' | 'default' | 'query';
72
+ }): Promise<string>;
73
+ /**
74
+ * Setup automatic event forwarding from SessionEventBus to AgentEventBus.
75
+ * All session events are forwarded with sessionId added to the payload.
76
+ *
77
+ * Following Dexto's pattern: event forwarding is built into the session.
78
+ */
79
+ private setupEventForwarding;
80
+ }
@@ -0,0 +1,165 @@
1
+ import { LLMError, SessionCancelledError } from '../../../core/domain/cipher/errors/session-error.js';
2
+ // List of all session events that should be forwarded to agent bus
3
+ const SESSION_EVENT_NAMES = [
4
+ 'llmservice:thinking',
5
+ 'llmservice:chunk',
6
+ 'llmservice:response',
7
+ 'llmservice:toolCall',
8
+ 'llmservice:toolResult',
9
+ 'llmservice:error',
10
+ 'llmservice:unsupportedInput',
11
+ ];
12
+ /**
13
+ * Chat session implementation.
14
+ *
15
+ * Following Dexto's pattern: ChatSession owns session-specific services
16
+ * (LLM, EventBus) and receives shared services (ToolManager, SystemPromptManager).
17
+ *
18
+ * The LLM service handles:
19
+ * - Message history (via ContextManager)
20
+ * - Agentic loop
21
+ * - Tool execution
22
+ *
23
+ * This session provides:
24
+ * - Session isolation
25
+ * - Cancellation support
26
+ * - Event forwarding to agent bus
27
+ * - Proper cleanup/disposal
28
+ */
29
+ export class ChatSession {
30
+ eventBus;
31
+ id;
32
+ currentController;
33
+ forwarders = new Map();
34
+ llmService;
35
+ sharedServices;
36
+ /**
37
+ * Creates a new chat session
38
+ *
39
+ * @param id - Unique session identifier
40
+ * @param sharedServices - Shared services from CipherAgent
41
+ * @param sessionServices - Session-specific services (LLM, EventBus)
42
+ */
43
+ constructor(id, sharedServices, sessionServices) {
44
+ this.id = id;
45
+ this.sharedServices = sharedServices;
46
+ this.eventBus = sessionServices.sessionEventBus;
47
+ this.llmService = sessionServices.llmService;
48
+ // Setup event forwarding from session bus to agent bus
49
+ this.setupEventForwarding();
50
+ }
51
+ /**
52
+ * Cancel the current operation.
53
+ */
54
+ cancel() {
55
+ if (this.currentController) {
56
+ this.currentController.abort();
57
+ }
58
+ }
59
+ /**
60
+ * Dispose of the session and clean up resources.
61
+ * Removes event listeners to prevent memory leaks.
62
+ */
63
+ dispose() {
64
+ // Remove all event forwarders
65
+ for (const [eventName, forwarder] of this.forwarders.entries()) {
66
+ this.eventBus.off(eventName, forwarder);
67
+ }
68
+ this.forwarders.clear();
69
+ }
70
+ /**
71
+ * Get the conversation history.
72
+ */
73
+ getHistory() {
74
+ // Get history from service's context manager
75
+ const contextManager = this.llmService.getContextManager();
76
+ const internalMessages = contextManager.getMessages();
77
+ // Convert to session Message format
78
+ return internalMessages.map((msg) => ({
79
+ content: typeof msg.content === 'string' ? msg.content : '',
80
+ role: msg.role,
81
+ timestamp: Date.now(), // Internal messages don't have timestamps
82
+ toolCallId: msg.toolCallId,
83
+ toolCalls: msg.toolCalls?.map((tc) => ({
84
+ arguments: JSON.parse(tc.function.arguments),
85
+ id: tc.id,
86
+ name: tc.function.name,
87
+ })),
88
+ toolName: msg.name,
89
+ }));
90
+ }
91
+ /**
92
+ * Get the LLM service for direct access to context manager.
93
+ * Useful for pre-loading conversation history in JSON input mode.
94
+ */
95
+ getLLMService() {
96
+ return this.llmService;
97
+ }
98
+ /**
99
+ * Get the number of messages in the conversation.
100
+ */
101
+ getMessageCount() {
102
+ const contextManager = this.llmService.getContextManager();
103
+ return contextManager.getMessages().length;
104
+ }
105
+ /**
106
+ * Reset the conversation history.
107
+ */
108
+ reset() {
109
+ const contextManager = this.llmService.getContextManager();
110
+ contextManager.clearHistory();
111
+ // Emit conversation reset event
112
+ this.sharedServices.agentEventBus.emit('cipher:conversationReset', {
113
+ sessionId: this.id,
114
+ });
115
+ }
116
+ /**
117
+ * Send a message and get a response.
118
+ * Delegates to the LLM service which handles the agentic loop.
119
+ */
120
+ async run(input, options) {
121
+ // Create abort controller for cancellation
122
+ this.currentController = new AbortController();
123
+ try {
124
+ // Delegate to service - it handles everything
125
+ const response = await this.llmService.completeTask(input, this.id, {
126
+ executionContext: options?.executionContext,
127
+ mode: options?.mode,
128
+ signal: this.currentController.signal,
129
+ });
130
+ return response;
131
+ }
132
+ catch (error) {
133
+ // Check if cancelled
134
+ if (this.currentController.signal.aborted) {
135
+ throw new SessionCancelledError(this.id);
136
+ }
137
+ // Wrap other errors - pass message as-is since it's already formatted
138
+ const errorMessage = error instanceof Error ? error.message : String(error);
139
+ throw new LLMError(errorMessage, this.id);
140
+ }
141
+ finally {
142
+ this.currentController = undefined;
143
+ }
144
+ }
145
+ /**
146
+ * Setup automatic event forwarding from SessionEventBus to AgentEventBus.
147
+ * All session events are forwarded with sessionId added to the payload.
148
+ *
149
+ * Following Dexto's pattern: event forwarding is built into the session.
150
+ */
151
+ setupEventForwarding() {
152
+ for (const eventName of SESSION_EVENT_NAMES) {
153
+ const forwarder = (payload) => {
154
+ // Add sessionId to payload
155
+ const payloadWithSession = payload && typeof payload === 'object' ? { ...payload, sessionId: this.id } : { sessionId: this.id };
156
+ // Forward to agent bus - eventName is properly typed from SESSION_EVENT_NAMES
157
+ this.sharedServices.agentEventBus.emit(eventName, payloadWithSession);
158
+ };
159
+ // Track forwarder for cleanup
160
+ this.forwarders.set(eventName, forwarder);
161
+ // Register listener on session bus - eventName is properly typed from SESSION_EVENT_NAMES
162
+ this.eventBus.on(eventName, forwarder);
163
+ }
164
+ }
165
+ }
@@ -0,0 +1,6 @@
1
+ export { LLMError, MaxIterationsExceededError, SessionCancelledError, SessionError, SessionNotInitializedError, } from '../../../core/domain/cipher/errors/session-error.js';
2
+ export type { LLMResponse, Message, MessageRole, SessionConfig, ToolCall } from '../../../core/domain/cipher/session/types.js';
3
+ export type { IChatSession } from '../../../core/interfaces/cipher/i-chat-session.js';
4
+ export type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
5
+ export { ChatSession } from './chat-session.js';
6
+ export { SessionManager } from './session-manager.js';
@@ -0,0 +1,5 @@
1
+ // Session errors
2
+ export { LLMError, MaxIterationsExceededError, SessionCancelledError, SessionError, SessionNotInitializedError, } from '../../../core/domain/cipher/errors/session-error.js';
3
+ export { ChatSession } from './chat-session.js';
4
+ // Session manager
5
+ export { SessionManager } from './session-manager.js';