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,183 @@
1
+ import type { ToolSet } from '../../../core/domain/cipher/tools/types.js';
2
+ import type { ExecutionContext } from '../../../core/interfaces/cipher/i-cipher-agent.js';
3
+ import type { IHistoryStorage } from '../../../core/interfaces/cipher/i-history-storage.js';
4
+ import type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
5
+ import type { ILogger } from '../../../core/interfaces/cipher/i-logger.js';
6
+ import type { MemoryManager } from '../memory/memory-manager.js';
7
+ import type { SimplePromptFactory } from '../system-prompt/simple-prompt-factory.js';
8
+ import type { ToolManager } from '../tools/tool-manager.js';
9
+ import { SessionEventBus } from '../events/event-emitter.js';
10
+ import { ContextManager, type FileData, type ImageData } from './context/context-manager.js';
11
+ /**
12
+ * Configuration for OpenRouter LLM service
13
+ */
14
+ export interface OpenRouterServiceConfig {
15
+ apiKey: string;
16
+ baseUrl?: string;
17
+ httpReferer?: string;
18
+ maxInputTokens?: number;
19
+ maxIterations?: number;
20
+ maxTokens?: number;
21
+ model?: string;
22
+ siteName?: string;
23
+ temperature?: number;
24
+ timeout?: number;
25
+ verbose?: boolean;
26
+ }
27
+ /**
28
+ * LLM service configuration response
29
+ */
30
+ export interface LLMServiceConfig {
31
+ configuredMaxInputTokens: number;
32
+ model: string;
33
+ modelMaxInputTokens: number;
34
+ provider: string;
35
+ router: string;
36
+ }
37
+ /**
38
+ * OpenRouter LLM Service.
39
+ *
40
+ * Orchestrates the agentic loop for tool calling with OpenRouter.
41
+ * OpenRouter provides access to multiple LLM providers through an OpenAI-compatible API.
42
+ *
43
+ * Responsibilities:
44
+ * - Manage conversation context via ContextManager
45
+ * - Execute agentic loop (call LLM → execute tools → repeat)
46
+ * - Delegate tool execution to ToolManager
47
+ * - Format messages for OpenRouter API via formatter
48
+ * - Handle errors and iteration limits
49
+ *
50
+ * Does NOT:
51
+ * - Execute tools directly (uses ToolManager)
52
+ * - Store persistent history (uses in-memory ContextManager)
53
+ */
54
+ export declare class OpenRouterLLMService implements ILLMService {
55
+ private readonly client;
56
+ private readonly config;
57
+ private readonly contextManager;
58
+ private readonly formatter;
59
+ private readonly logger;
60
+ private readonly memoryManager?;
61
+ private readonly promptFactory;
62
+ private readonly sessionEventBus;
63
+ private readonly tokenizer;
64
+ private readonly toolManager;
65
+ /**
66
+ * Creates a new OpenRouter LLM service
67
+ *
68
+ * @param sessionId - Unique session identifier
69
+ * @param config - Service configuration
70
+ * @param options - Service dependencies
71
+ * @param options.toolManager - Tool manager for tool execution
72
+ * @param options.systemPromptManager - Simple prompt factory for building system prompts
73
+ * @param options.sessionEventBus - Session event bus for emitting events
74
+ * @param options.memoryManager - Optional memory manager for agent memories
75
+ * @param options.historyStorage - Optional history storage for persistence
76
+ * @param options.logger - Optional logger for structured logging
77
+ */
78
+ constructor(sessionId: string, config: OpenRouterServiceConfig, options: {
79
+ historyStorage?: IHistoryStorage;
80
+ logger?: ILogger;
81
+ memoryManager?: MemoryManager;
82
+ sessionEventBus: SessionEventBus;
83
+ systemPromptManager: SimplePromptFactory;
84
+ toolManager: ToolManager;
85
+ });
86
+ /**
87
+ * Complete a task with tool calling support.
88
+ *
89
+ * This is the main entry point for the agentic loop.
90
+ * It handles:
91
+ * 1. Adding user message to context
92
+ * 2. Looping: call LLM → check for tool calls → execute tools
93
+ * 3. Returning final response when no more tool calls
94
+ *
95
+ * @param textInput - User input text
96
+ * @param sessionId - Session ID for tracking the conversation
97
+ * @param options - Execution options
98
+ * @param options.signal - Optional abort signal for cancellation
99
+ * @param options.imageData - Optional image data
100
+ * @param options.fileData - Optional file data
101
+ * @param options.stream - Whether to stream response (not implemented yet)
102
+ * @param options.executionContext - Optional execution context (for JSON input mode, etc.)
103
+ * @param options.mode - Optional mode for system prompt ('json-input' enables autonomous mode)
104
+ * @returns Final assistant response
105
+ */
106
+ completeTask(textInput: string, sessionId: string, options?: {
107
+ executionContext?: ExecutionContext;
108
+ fileData?: FileData;
109
+ imageData?: ImageData;
110
+ mode?: 'autonomous' | 'default' | 'query';
111
+ signal?: AbortSignal;
112
+ stream?: boolean;
113
+ }): Promise<string>;
114
+ /**
115
+ * Get all available tools from ToolManager.
116
+ */
117
+ getAllTools(): Promise<ToolSet>;
118
+ /**
119
+ * Get service configuration.
120
+ */
121
+ getConfig(): LLMServiceConfig;
122
+ /**
123
+ * Get the context manager instance.
124
+ */
125
+ getContextManager(): ContextManager<unknown>;
126
+ /**
127
+ * Initialize the LLM service by loading persisted history.
128
+ * Should be called after construction to restore previous conversation.
129
+ *
130
+ * @returns True if history was loaded, false otherwise
131
+ */
132
+ initialize(): Promise<boolean>;
133
+ /**
134
+ * Call LLM and parse the response.
135
+ *
136
+ * @param tools - Available tools for function calling
137
+ * @param formattedMessages - Formatted messages to send
138
+ * @returns Parsed message from LLM response
139
+ */
140
+ private callLLMAndParseResponse;
141
+ /**
142
+ * Execute a single iteration of the agentic loop.
143
+ *
144
+ * @param iterationCount - Current iteration number
145
+ * @param tools - Available tools for this iteration
146
+ * @param executionContext - Optional execution context
147
+ * @param mode - Optional mode for system prompt
148
+ * @returns Final response string if complete, null if more iterations needed
149
+ */
150
+ private executeAgenticIteration;
151
+ /**
152
+ * Execute a single tool call.
153
+ *
154
+ * @param toolCall - Tool call to execute
155
+ */
156
+ private executeToolCall;
157
+ /**
158
+ * Extract text content from an internal message.
159
+ *
160
+ * @param message - Internal message
161
+ * @returns Text content as string
162
+ */
163
+ private extractTextContent;
164
+ /**
165
+ * Handle final response when there are no tool calls.
166
+ *
167
+ * @param lastMessage - Last message from LLM
168
+ * @returns Final response content
169
+ */
170
+ private handleFinalResponse;
171
+ /**
172
+ * Handle LLM errors and re-throw or wrap appropriately.
173
+ *
174
+ * @param error - Error to handle
175
+ */
176
+ private handleLLMError;
177
+ /**
178
+ * Handle tool calls from LLM response.
179
+ *
180
+ * @param lastMessage - Last message containing tool calls
181
+ */
182
+ private handleToolCalls;
183
+ }
@@ -0,0 +1,386 @@
1
+ import { OpenAI } from 'openai';
2
+ import { LlmGenerationError, LlmMaxIterationsError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
3
+ import { NoOpLogger } from '../../../core/interfaces/cipher/i-logger.js';
4
+ import { getErrorMessage } from '../../../utils/error-helpers.js';
5
+ import { ContextManager } from './context/context-manager.js';
6
+ import { OpenRouterMessageFormatter } from './formatters/openrouter-formatter.js';
7
+ import { OpenRouterTokenizer } from './tokenizers/openrouter-tokenizer.js';
8
+ /**
9
+ * OpenRouter LLM Service.
10
+ *
11
+ * Orchestrates the agentic loop for tool calling with OpenRouter.
12
+ * OpenRouter provides access to multiple LLM providers through an OpenAI-compatible API.
13
+ *
14
+ * Responsibilities:
15
+ * - Manage conversation context via ContextManager
16
+ * - Execute agentic loop (call LLM → execute tools → repeat)
17
+ * - Delegate tool execution to ToolManager
18
+ * - Format messages for OpenRouter API via formatter
19
+ * - Handle errors and iteration limits
20
+ *
21
+ * Does NOT:
22
+ * - Execute tools directly (uses ToolManager)
23
+ * - Store persistent history (uses in-memory ContextManager)
24
+ */
25
+ export class OpenRouterLLMService {
26
+ client;
27
+ config;
28
+ contextManager;
29
+ formatter;
30
+ logger;
31
+ memoryManager;
32
+ promptFactory;
33
+ sessionEventBus;
34
+ tokenizer;
35
+ toolManager;
36
+ /**
37
+ * Creates a new OpenRouter LLM service
38
+ *
39
+ * @param sessionId - Unique session identifier
40
+ * @param config - Service configuration
41
+ * @param options - Service dependencies
42
+ * @param options.toolManager - Tool manager for tool execution
43
+ * @param options.systemPromptManager - Simple prompt factory for building system prompts
44
+ * @param options.sessionEventBus - Session event bus for emitting events
45
+ * @param options.memoryManager - Optional memory manager for agent memories
46
+ * @param options.historyStorage - Optional history storage for persistence
47
+ * @param options.logger - Optional logger for structured logging
48
+ */
49
+ constructor(sessionId, config, options) {
50
+ this.toolManager = options.toolManager;
51
+ this.promptFactory = options.systemPromptManager;
52
+ this.memoryManager = options.memoryManager;
53
+ this.sessionEventBus = options.sessionEventBus;
54
+ this.logger = options.logger ?? new NoOpLogger();
55
+ this.config = {
56
+ apiKey: config.apiKey,
57
+ baseUrl: config.baseUrl ?? 'https://openrouter.ai/api/v1',
58
+ httpReferer: config.httpReferer,
59
+ maxInputTokens: config.maxInputTokens ?? 200_000,
60
+ maxIterations: config.maxIterations ?? 50,
61
+ maxTokens: config.maxTokens ?? 8192,
62
+ model: config.model ?? 'anthropic/claude-haiku-4.5',
63
+ siteName: config.siteName,
64
+ temperature: config.temperature ?? 0.7,
65
+ timeout: config.timeout,
66
+ verbose: config.verbose,
67
+ };
68
+ // Initialize OpenAI client with OpenRouter base URL
69
+ this.client = new OpenAI({
70
+ apiKey: this.config.apiKey,
71
+ baseURL: this.config.baseUrl,
72
+ defaultHeaders: {
73
+ ...(this.config.httpReferer && { 'HTTP-Referer': this.config.httpReferer }),
74
+ ...(this.config.siteName && { 'X-Title': this.config.siteName }),
75
+ },
76
+ timeout: this.config.timeout,
77
+ });
78
+ // Initialize formatter and tokenizer
79
+ this.formatter = new OpenRouterMessageFormatter();
80
+ this.tokenizer = new OpenRouterTokenizer();
81
+ // Initialize context manager with optional history storage
82
+ this.contextManager = new ContextManager({
83
+ formatter: this.formatter,
84
+ historyStorage: options.historyStorage,
85
+ maxInputTokens: this.config.maxInputTokens,
86
+ sessionId,
87
+ tokenizer: this.tokenizer,
88
+ });
89
+ }
90
+ /**
91
+ * Complete a task with tool calling support.
92
+ *
93
+ * This is the main entry point for the agentic loop.
94
+ * It handles:
95
+ * 1. Adding user message to context
96
+ * 2. Looping: call LLM → check for tool calls → execute tools
97
+ * 3. Returning final response when no more tool calls
98
+ *
99
+ * @param textInput - User input text
100
+ * @param sessionId - Session ID for tracking the conversation
101
+ * @param options - Execution options
102
+ * @param options.signal - Optional abort signal for cancellation
103
+ * @param options.imageData - Optional image data
104
+ * @param options.fileData - Optional file data
105
+ * @param options.stream - Whether to stream response (not implemented yet)
106
+ * @param options.executionContext - Optional execution context (for JSON input mode, etc.)
107
+ * @param options.mode - Optional mode for system prompt ('json-input' enables autonomous mode)
108
+ * @returns Final assistant response
109
+ */
110
+ async completeTask(textInput, sessionId, options) {
111
+ // Extract options with defaults
112
+ const { executionContext, fileData, imageData, mode, signal } = options ?? {};
113
+ // Add user message to context
114
+ await this.contextManager.addUserMessage(textInput, imageData, fileData);
115
+ // Get all available tools
116
+ const toolSet = this.toolManager.getAllTools();
117
+ const tools = Object.entries(toolSet).map(([name, schema]) => ({
118
+ function: {
119
+ description: schema.description ?? '',
120
+ name,
121
+ parameters: schema.parameters,
122
+ },
123
+ type: 'function',
124
+ }));
125
+ let iterationCount = 0;
126
+ // Agentic loop
127
+ while (iterationCount < this.config.maxIterations) {
128
+ // Check if aborted
129
+ if (signal?.aborted) {
130
+ throw new Error('Operation aborted');
131
+ }
132
+ try {
133
+ // eslint-disable-next-line no-await-in-loop -- Sequential iterations required for agentic loop
134
+ const result = await this.executeAgenticIteration(iterationCount, tools, executionContext, mode);
135
+ if (result !== null) {
136
+ return result;
137
+ }
138
+ iterationCount++;
139
+ }
140
+ catch (error) {
141
+ this.handleLLMError(error);
142
+ }
143
+ }
144
+ // Max iterations exceeded
145
+ throw new LlmMaxIterationsError(this.config.maxIterations, 'openrouter', this.config.model);
146
+ }
147
+ /**
148
+ * Get all available tools from ToolManager.
149
+ */
150
+ async getAllTools() {
151
+ return this.toolManager.getAllTools();
152
+ }
153
+ /**
154
+ * Get service configuration.
155
+ */
156
+ getConfig() {
157
+ return {
158
+ configuredMaxInputTokens: this.config.maxInputTokens,
159
+ model: this.config.model,
160
+ modelMaxInputTokens: this.config.maxInputTokens,
161
+ provider: 'openrouter',
162
+ router: 'openrouter',
163
+ };
164
+ }
165
+ /**
166
+ * Get the context manager instance.
167
+ */
168
+ getContextManager() {
169
+ return this.contextManager;
170
+ }
171
+ /**
172
+ * Initialize the LLM service by loading persisted history.
173
+ * Should be called after construction to restore previous conversation.
174
+ *
175
+ * @returns True if history was loaded, false otherwise
176
+ */
177
+ async initialize() {
178
+ return this.contextManager.initialize();
179
+ }
180
+ /**
181
+ * Call LLM and parse the response.
182
+ *
183
+ * @param tools - Available tools for function calling
184
+ * @param formattedMessages - Formatted messages to send
185
+ * @returns Parsed message from LLM response
186
+ */
187
+ async callLLMAndParseResponse(tools, formattedMessages) {
188
+ // Call OpenRouter API via OpenAI client
189
+ const response = await this.client.chat.completions.create({
190
+ // eslint-disable-next-line camelcase
191
+ max_tokens: this.config.maxTokens,
192
+ messages: formattedMessages,
193
+ model: this.config.model,
194
+ temperature: this.config.temperature,
195
+ ...(tools.length > 0 && { tools: tools }),
196
+ });
197
+ // Parse response to internal format
198
+ const messages = this.formatter.parseResponse(response);
199
+ if (messages.length === 0) {
200
+ throw new LlmResponseParsingError('No messages returned from formatter', 'openrouter', this.config.model);
201
+ }
202
+ const lastMessage = messages.at(-1);
203
+ if (!lastMessage) {
204
+ throw new LlmResponseParsingError('Failed to get last message from response', 'openrouter', this.config.model);
205
+ }
206
+ return lastMessage;
207
+ }
208
+ /**
209
+ * Execute a single iteration of the agentic loop.
210
+ *
211
+ * @param iterationCount - Current iteration number
212
+ * @param tools - Available tools for this iteration
213
+ * @param executionContext - Optional execution context
214
+ * @param mode - Optional mode for system prompt
215
+ * @returns Final response string if complete, null if more iterations needed
216
+ */
217
+ async executeAgenticIteration(iterationCount, tools, executionContext, mode) {
218
+ // Build system prompt using SimplePromptFactory (before compression for correct token accounting)
219
+ const availableTools = this.toolManager.getToolNames();
220
+ const markersSet = this.toolManager.getAvailableMarkers();
221
+ // Convert Set<string> to Record<string, string> for SimplePromptFactory
222
+ const availableMarkers = {};
223
+ for (const marker of markersSet) {
224
+ availableMarkers[marker] = marker;
225
+ }
226
+ const systemPrompt = await this.promptFactory.buildSystemPrompt({
227
+ availableMarkers,
228
+ availableTools,
229
+ commandType: executionContext?.commandType,
230
+ conversationMetadata: executionContext?.conversationMetadata,
231
+ memoryManager: this.memoryManager,
232
+ mode,
233
+ });
234
+ // Verbose debug: Show complete system prompt
235
+ if (this.config.verbose) {
236
+ this.logger.debug('System prompt details', {
237
+ first500Chars: systemPrompt.slice(0, 500),
238
+ iteration: iterationCount + 1,
239
+ last500Chars: systemPrompt.slice(-500),
240
+ length: systemPrompt.length,
241
+ lines: systemPrompt.split('\n').length,
242
+ });
243
+ }
244
+ // Get formatted messages from context with compression (passing system prompt for token accounting)
245
+ const { formattedMessages, tokensUsed } = await this.contextManager.getFormattedMessagesWithCompression(systemPrompt);
246
+ // Verbose: Log formatted messages and token usage
247
+ if (this.config.verbose) {
248
+ this.logger.debug('Formatted messages for LLM', {
249
+ formattedMessages,
250
+ iteration: `${iterationCount + 1}/${this.config.maxIterations}`,
251
+ maxInputTokens: this.config.maxInputTokens,
252
+ tokensUsed,
253
+ });
254
+ }
255
+ // Emit thinking event
256
+ this.sessionEventBus.emit('llmservice:thinking');
257
+ // Call LLM and parse response
258
+ const lastMessage = await this.callLLMAndParseResponse(tools, formattedMessages);
259
+ // Check if there are tool calls
260
+ if (!lastMessage.toolCalls || lastMessage.toolCalls.length === 0) {
261
+ return this.handleFinalResponse(lastMessage);
262
+ }
263
+ // Has tool calls - handle them
264
+ await this.handleToolCalls(lastMessage);
265
+ return null;
266
+ }
267
+ /**
268
+ * Execute a single tool call.
269
+ *
270
+ * @param toolCall - Tool call to execute
271
+ */
272
+ async executeToolCall(toolCall) {
273
+ try {
274
+ const toolName = toolCall.function.name;
275
+ const toolArgs = JSON.parse(toolCall.function.arguments);
276
+ // Emit tool call event
277
+ this.sessionEventBus.emit('llmservice:toolCall', {
278
+ args: toolArgs,
279
+ callId: toolCall.id,
280
+ toolName,
281
+ });
282
+ // Execute tool via ToolManager (handles approval, routing, etc.)
283
+ const result = await this.toolManager.executeTool(toolName, toolArgs);
284
+ // Emit tool result event (success)
285
+ this.sessionEventBus.emit('llmservice:toolResult', {
286
+ callId: toolCall.id,
287
+ result,
288
+ success: true,
289
+ toolName,
290
+ });
291
+ // Add tool result to context
292
+ await this.contextManager.addToolResult(toolCall.id, toolName, result, { success: true });
293
+ }
294
+ catch (error) {
295
+ // Add error result to context
296
+ const errorMessage = error instanceof Error ? error.message : String(error);
297
+ // Emit tool result event (error)
298
+ this.sessionEventBus.emit('llmservice:toolResult', {
299
+ callId: toolCall.id,
300
+ error: errorMessage,
301
+ success: false,
302
+ toolName: toolCall.function.name,
303
+ });
304
+ await this.contextManager.addToolResult(toolCall.id, toolCall.function.name, `Error: ${errorMessage}`, {
305
+ success: false,
306
+ });
307
+ }
308
+ }
309
+ /**
310
+ * Extract text content from an internal message.
311
+ *
312
+ * @param message - Internal message
313
+ * @returns Text content as string
314
+ */
315
+ extractTextContent(message) {
316
+ if (typeof message.content === 'string') {
317
+ return message.content;
318
+ }
319
+ if (Array.isArray(message.content)) {
320
+ return message.content
321
+ .filter((part) => part.type === 'text')
322
+ .map((part) => (part.type === 'text' ? part.text : ''))
323
+ .join('');
324
+ }
325
+ return '';
326
+ }
327
+ /**
328
+ * Handle final response when there are no tool calls.
329
+ *
330
+ * @param lastMessage - Last message from LLM
331
+ * @returns Final response content
332
+ */
333
+ async handleFinalResponse(lastMessage) {
334
+ const content = this.extractTextContent(lastMessage);
335
+ // Emit response event
336
+ this.sessionEventBus.emit('llmservice:response', {
337
+ content,
338
+ model: this.config.model,
339
+ provider: 'openrouter',
340
+ });
341
+ // Add assistant message to context
342
+ await this.contextManager.addAssistantMessage(content);
343
+ return content;
344
+ }
345
+ /**
346
+ * Handle LLM errors and re-throw or wrap appropriately.
347
+ *
348
+ * @param error - Error to handle
349
+ */
350
+ handleLLMError(error) {
351
+ // Emit error event
352
+ const errorMessage = error instanceof Error ? error.message : String(error);
353
+ this.sessionEventBus.emit('llmservice:error', {
354
+ error: errorMessage,
355
+ });
356
+ // Re-throw LLM errors as-is
357
+ if (error instanceof LlmResponseParsingError ||
358
+ error instanceof LlmGenerationError ||
359
+ error instanceof LlmMaxIterationsError) {
360
+ throw error;
361
+ }
362
+ // Wrap other errors
363
+ if (error && typeof error === 'object' && 'message' in error) {
364
+ throw new LlmGenerationError(getErrorMessage(error), 'openrouter', this.config.model);
365
+ }
366
+ throw new LlmGenerationError(String(error), 'openrouter', this.config.model);
367
+ }
368
+ /**
369
+ * Handle tool calls from LLM response.
370
+ *
371
+ * @param lastMessage - Last message containing tool calls
372
+ */
373
+ async handleToolCalls(lastMessage) {
374
+ if (!lastMessage.toolCalls || lastMessage.toolCalls.length === 0) {
375
+ return;
376
+ }
377
+ // Has tool calls - add assistant message with tool calls
378
+ const assistantContent = this.extractTextContent(lastMessage);
379
+ await this.contextManager.addAssistantMessage(assistantContent, lastMessage.toolCalls);
380
+ // Execute tool calls via ToolManager
381
+ for (const toolCall of lastMessage.toolCalls) {
382
+ // eslint-disable-next-line no-await-in-loop -- Sequential tool execution required
383
+ await this.executeToolCall(toolCall);
384
+ }
385
+ }
386
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Response Validation Layer
3
+ *
4
+ * Validates LLM responses before processing to catch malformed content.
5
+ * Pure validation only - retry logic is handled by RetryableContentGenerator.
6
+ */
7
+ import type { InternalMessage } from '../../../core/interfaces/cipher/message-types.js';
8
+ /**
9
+ * Types of validation errors that can occur
10
+ */
11
+ export type ResponseValidationType = 'EMPTY_RESPONSE' | 'INVALID_ROLE' | 'MALFORMED_TOOL_CALL' | 'NO_CONTENT' | 'NO_MESSAGES';
12
+ /**
13
+ * Error thrown when response validation fails
14
+ */
15
+ export declare class ResponseValidationError extends Error {
16
+ /**
17
+ * Original response that failed validation (for debugging)
18
+ */
19
+ readonly originalResponse?: unknown;
20
+ /**
21
+ * Type of validation failure
22
+ */
23
+ readonly validationType: ResponseValidationType;
24
+ /**
25
+ * Create a new ResponseValidationError
26
+ *
27
+ * @param message - Human-readable error message
28
+ * @param validationType - Type of validation failure
29
+ * @param originalResponse - Original response object (optional)
30
+ */
31
+ constructor(message: string, validationType: ResponseValidationType, originalResponse?: unknown);
32
+ /**
33
+ * Convert error to JSON for serialization
34
+ */
35
+ toJSON(): Record<string, unknown>;
36
+ }
37
+ /**
38
+ * Response validator with validation rules and helper methods.
39
+ *
40
+ * Pure validation only - no retry logic.
41
+ * Retry behavior is handled by RetryableContentGenerator decorator.
42
+ */
43
+ export declare const ResponseValidator: {
44
+ /**
45
+ * Validate individual message structure
46
+ *
47
+ * Checks that message has:
48
+ * 1. Valid role (assistant)
49
+ * 2. Either content or tool calls
50
+ * 3. Well-formed tool calls (if present)
51
+ *
52
+ * @param message - Internal message to validate
53
+ * @throws ResponseValidationError if validation fails
54
+ */
55
+ readonly validateMessage: (message: InternalMessage) => void;
56
+ /**
57
+ * Validate parsed message array
58
+ *
59
+ * Checks that:
60
+ * 1. Array is not empty
61
+ * 2. Has at least one message
62
+ *
63
+ * @param messages - Parsed messages from formatter
64
+ * @throws ResponseValidationError if validation fails
65
+ */
66
+ readonly validateMessageArray: (messages: InternalMessage[]) => void;
67
+ /**
68
+ * Validate raw response from LLM provider
69
+ *
70
+ * Checks that response is:
71
+ * 1. Not null/undefined
72
+ * 2. An object
73
+ *
74
+ * @param response - Raw response from provider
75
+ * @throws ResponseValidationError if validation fails
76
+ */
77
+ readonly validateRawResponse: (response: unknown) => void;
78
+ /**
79
+ * Validate complete response after parsing
80
+ *
81
+ * Runs all validation checks on raw response, message array, and last message.
82
+ *
83
+ * @param response - Raw response from provider
84
+ * @param messages - Parsed messages from formatter
85
+ * @returns Last message if all validations pass
86
+ * @throws ResponseValidationError if any validation fails
87
+ */
88
+ readonly validateResponse: (response: unknown, messages: InternalMessage[]) => InternalMessage;
89
+ };