byterover-cli 0.4.1 → 1.0.1

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 (474) hide show
  1. package/README.md +1 -9
  2. package/dist/commands/curate.d.ts +1 -3
  3. package/dist/commands/curate.js +14 -51
  4. package/dist/commands/main.d.ts +8 -0
  5. package/dist/commands/main.js +29 -8
  6. package/dist/commands/query.d.ts +1 -3
  7. package/dist/commands/query.js +8 -35
  8. package/dist/config/context-tree-domains.d.ts +5 -0
  9. package/dist/config/context-tree-domains.js +6 -1
  10. package/dist/config/environment.js +9 -9
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.js +18 -0
  13. package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
  14. package/dist/core/domain/cipher/agent/agent-info.js +143 -0
  15. package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
  16. package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
  17. package/dist/core/domain/cipher/agent/index.d.ts +4 -1
  18. package/dist/core/domain/cipher/agent/index.js +7 -1
  19. package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
  20. package/dist/core/domain/cipher/agent-events/types.js +11 -0
  21. package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
  22. package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
  23. package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
  24. package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
  25. package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
  26. package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
  27. package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
  28. package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
  29. package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
  30. package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
  31. package/dist/core/domain/cipher/llm/error-codes.js +51 -0
  32. package/dist/core/domain/cipher/llm/index.d.ts +9 -0
  33. package/dist/core/domain/cipher/llm/index.js +13 -0
  34. package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
  35. package/dist/core/domain/cipher/llm/registry.js +244 -0
  36. package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
  37. package/dist/core/domain/cipher/llm/schemas.js +151 -0
  38. package/dist/core/domain/cipher/llm/types.d.ts +121 -0
  39. package/dist/core/domain/cipher/llm/types.js +60 -0
  40. package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
  41. package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
  42. package/dist/core/domain/cipher/streaming/types.js +16 -0
  43. package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
  44. package/dist/core/domain/cipher/todos/types.d.ts +34 -0
  45. package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
  46. package/dist/core/domain/cipher/tools/constants.js +5 -2
  47. package/dist/core/domain/cipher/tools/types.d.ts +31 -0
  48. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  49. package/dist/core/domain/errors/connection-error.js +54 -0
  50. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  51. package/dist/core/domain/errors/core-process-error.js +43 -0
  52. package/dist/core/domain/errors/task-error.d.ts +64 -0
  53. package/dist/core/domain/errors/task-error.js +116 -0
  54. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  55. package/dist/core/domain/errors/transport-error.js +114 -0
  56. package/dist/core/domain/instance/index.d.ts +1 -0
  57. package/dist/core/domain/instance/index.js +1 -0
  58. package/dist/core/domain/instance/types.d.ts +57 -0
  59. package/dist/core/domain/instance/types.js +72 -0
  60. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  61. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  62. package/dist/core/domain/transport/index.d.ts +2 -0
  63. package/dist/core/domain/transport/index.js +2 -0
  64. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  65. package/dist/core/domain/transport/schemas.js +554 -0
  66. package/dist/core/domain/transport/types.d.ts +67 -0
  67. package/dist/core/domain/transport/types.js +7 -0
  68. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  69. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  70. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  71. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  72. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  73. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  74. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  75. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  76. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  77. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  79. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  80. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  81. package/dist/core/interfaces/cipher/index.js +11 -0
  82. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  83. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  84. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  85. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  86. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  87. package/dist/core/interfaces/cipher/message-types.js +6 -0
  88. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  89. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  90. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  91. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  92. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  93. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  94. package/dist/core/interfaces/executor/index.d.ts +2 -0
  95. package/dist/core/interfaces/executor/index.js +2 -0
  96. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  97. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  98. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  99. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  100. package/dist/core/interfaces/instance/index.d.ts +2 -0
  101. package/dist/core/interfaces/instance/index.js +2 -0
  102. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  103. package/dist/core/interfaces/noop-implementations.js +62 -0
  104. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  105. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  106. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  107. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  108. package/dist/core/interfaces/transport/index.d.ts +2 -0
  109. package/dist/core/interfaces/transport/index.js +2 -0
  110. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  111. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  112. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  113. package/dist/infra/cipher/agent/agent-error.js +79 -0
  114. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  115. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  116. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  117. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  118. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  119. package/dist/infra/cipher/agent/base-agent.js +240 -0
  120. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  121. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  122. package/dist/infra/cipher/agent/index.d.ts +22 -0
  123. package/dist/infra/cipher/agent/index.js +24 -0
  124. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  125. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  126. package/dist/infra/cipher/agent/types.d.ts +35 -0
  127. package/dist/infra/cipher/agent/types.js +1 -0
  128. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  129. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  130. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  131. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  132. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  133. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  134. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  135. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  136. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  137. package/dist/infra/cipher/consumer/index.js +2 -1
  138. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  139. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  140. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  141. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  142. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  143. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  144. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  145. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  146. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  147. package/dist/infra/cipher/interactive-loop.js +41 -33
  148. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  149. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  150. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  151. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  152. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  153. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  154. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  155. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  156. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  157. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  158. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  159. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  160. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  161. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  162. package/dist/infra/cipher/llm/context/utils.js +17 -4
  163. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  164. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  165. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  166. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  167. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  168. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  169. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  170. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  171. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  172. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  173. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  174. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  175. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  176. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  177. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  178. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  179. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  180. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  181. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  182. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  183. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  184. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  185. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  186. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  187. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  188. package/dist/infra/cipher/process/command-validator.js +75 -0
  189. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  190. package/dist/infra/cipher/process/path-utils.js +94 -0
  191. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  192. package/dist/infra/cipher/process/process-service.js +98 -17
  193. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  194. package/dist/infra/cipher/session/chat-session.js +163 -13
  195. package/dist/infra/cipher/session/index.d.ts +1 -0
  196. package/dist/infra/cipher/session/index.js +2 -0
  197. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  198. package/dist/infra/cipher/session/message-queue.js +90 -0
  199. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  200. package/dist/infra/cipher/session/session-manager.js +254 -7
  201. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  202. package/dist/infra/cipher/session/session-status.js +184 -0
  203. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  204. package/dist/infra/cipher/session/title-generator.js +31 -0
  205. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  206. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  207. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  208. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  209. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  210. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  211. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  212. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  213. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  214. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  215. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  216. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  217. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  218. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  219. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  220. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  221. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  222. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  223. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  224. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  225. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  226. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  227. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  228. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  229. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  230. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  231. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  232. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  233. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  234. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  235. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  236. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  237. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  238. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  239. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  240. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  241. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  242. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  243. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  244. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  245. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  246. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  247. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  249. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  250. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  251. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  252. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  253. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  254. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  255. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  256. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  257. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  258. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  259. package/dist/infra/cipher/tools/index.d.ts +1 -1
  260. package/dist/infra/cipher/tools/index.js +1 -1
  261. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  262. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  263. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  264. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  265. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  266. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  267. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  268. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  269. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  270. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  271. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  272. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  273. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  274. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  275. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  276. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  277. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  278. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  279. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  280. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  281. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  282. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  283. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  284. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  285. package/dist/infra/context-tree/path-utils.js +7 -0
  286. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  287. package/dist/infra/core/executors/curate-executor.js +123 -0
  288. package/dist/infra/core/executors/index.d.ts +2 -0
  289. package/dist/infra/core/executors/index.js +2 -0
  290. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  291. package/dist/infra/core/executors/query-executor.js +51 -0
  292. package/dist/infra/core/task-processor.d.ts +81 -0
  293. package/dist/infra/core/task-processor.js +115 -0
  294. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  295. package/dist/infra/instance/file-instance-discovery.js +84 -0
  296. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  297. package/dist/infra/instance/file-instance-manager.js +123 -0
  298. package/dist/infra/instance/index.d.ts +3 -0
  299. package/dist/infra/instance/index.js +3 -0
  300. package/dist/infra/instance/process-utils.d.ts +14 -0
  301. package/dist/infra/instance/process-utils.js +39 -0
  302. package/dist/infra/process/agent-worker.d.ts +20 -0
  303. package/dist/infra/process/agent-worker.js +602 -0
  304. package/dist/infra/process/index.d.ts +12 -0
  305. package/dist/infra/process/index.js +11 -0
  306. package/dist/infra/process/ipc-types.d.ts +55 -0
  307. package/dist/infra/process/ipc-types.js +12 -0
  308. package/dist/infra/process/process-manager.d.ts +154 -0
  309. package/dist/infra/process/process-manager.js +471 -0
  310. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  311. package/dist/infra/process/task-queue-manager.js +226 -0
  312. package/dist/infra/process/transport-handlers.d.ts +124 -0
  313. package/dist/infra/process/transport-handlers.js +348 -0
  314. package/dist/infra/process/transport-worker.d.ts +20 -0
  315. package/dist/infra/process/transport-worker.js +168 -0
  316. package/dist/infra/repl/commands/curate-command.js +0 -5
  317. package/dist/infra/repl/commands/query-command.js +0 -3
  318. package/dist/infra/repl/repl-startup.d.ts +4 -0
  319. package/dist/infra/repl/repl-startup.js +8 -1
  320. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  321. package/dist/infra/repl/transport-client-helper.js +96 -0
  322. package/dist/infra/transport/index.d.ts +4 -0
  323. package/dist/infra/transport/index.js +4 -0
  324. package/dist/infra/transport/port-utils.d.ts +42 -0
  325. package/dist/infra/transport/port-utils.js +84 -0
  326. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  327. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  328. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  329. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  330. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  331. package/dist/infra/transport/transport-client-factory.js +168 -0
  332. package/dist/infra/transport/transport-factory.d.ts +33 -0
  333. package/dist/infra/transport/transport-factory.js +59 -0
  334. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  335. package/dist/infra/usecase/curate-use-case.js +71 -262
  336. package/dist/infra/usecase/init-use-case.js +3 -2
  337. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  338. package/dist/infra/usecase/query-use-case.js +250 -326
  339. package/dist/infra/usecase/status-use-case.js +1 -1
  340. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  341. package/dist/resources/prompts/explore.yml +78 -0
  342. package/dist/resources/prompts/plan.yml +114 -0
  343. package/dist/resources/prompts/reflection.yml +1 -1
  344. package/dist/resources/prompts/system-prompt.yml +15 -8
  345. package/dist/resources/prompts/tool-outputs.yml +0 -5
  346. package/dist/resources/tools/bash_exec.txt +98 -0
  347. package/dist/resources/tools/bash_output.txt +40 -0
  348. package/dist/resources/tools/batch.txt +28 -0
  349. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  350. package/dist/resources/tools/curate.txt +22 -0
  351. package/dist/resources/tools/delete_memory.txt +1 -0
  352. package/dist/resources/tools/detect_domains.txt +11 -0
  353. package/dist/resources/tools/edit_file.txt +1 -0
  354. package/dist/resources/tools/edit_memory.txt +1 -0
  355. package/dist/resources/tools/glob_files.txt +20 -0
  356. package/dist/resources/tools/grep_content.txt +18 -0
  357. package/dist/resources/tools/kill_process.txt +16 -0
  358. package/dist/resources/tools/list_directory.txt +16 -0
  359. package/dist/resources/tools/list_memories.txt +1 -0
  360. package/dist/resources/tools/read_file.txt +31 -0
  361. package/dist/resources/tools/read_memory.txt +1 -0
  362. package/dist/resources/tools/read_todos.txt +17 -0
  363. package/dist/resources/tools/search_history.txt +1 -0
  364. package/dist/resources/tools/task.txt +23 -0
  365. package/dist/resources/tools/write_file.txt +1 -0
  366. package/dist/resources/tools/write_memory.txt +1 -0
  367. package/dist/resources/tools/write_todos.txt +29 -0
  368. package/dist/tui/app.js +9 -13
  369. package/dist/tui/components/command-details.d.ts +14 -0
  370. package/dist/tui/components/command-details.js +35 -0
  371. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  372. package/dist/tui/components/execution/execution-changes.js +19 -4
  373. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  374. package/dist/tui/components/execution/execution-content.js +26 -13
  375. package/dist/tui/components/execution/execution-input.js +3 -3
  376. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  377. package/dist/tui/components/execution/execution-progress.js +8 -6
  378. package/dist/tui/components/execution/log-item.d.ts +3 -4
  379. package/dist/tui/components/execution/log-item.js +2 -5
  380. package/dist/tui/components/footer.js +9 -4
  381. package/dist/tui/components/header.d.ts +3 -3
  382. package/dist/tui/components/header.js +5 -3
  383. package/dist/tui/components/index.d.ts +1 -0
  384. package/dist/tui/components/index.js +1 -0
  385. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  386. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  387. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  388. package/dist/tui/components/scrollable-list.js +12 -10
  389. package/dist/tui/components/suggestions.js +39 -41
  390. package/dist/tui/components/tab-bar.d.ts +2 -1
  391. package/dist/tui/components/tab-bar.js +3 -4
  392. package/dist/tui/constants.d.ts +0 -5
  393. package/dist/tui/constants.js +0 -5
  394. package/dist/tui/contexts/auth-context.js +9 -2
  395. package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
  396. package/dist/tui/contexts/index.d.ts +6 -1
  397. package/dist/tui/contexts/index.js +6 -1
  398. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  399. package/dist/tui/contexts/onboarding-context.js +9 -9
  400. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  401. package/dist/tui/contexts/tasks-context.js +218 -0
  402. package/dist/tui/contexts/transport-context.d.ts +29 -0
  403. package/dist/tui/contexts/transport-context.js +82 -0
  404. package/dist/tui/hooks/index.d.ts +10 -6
  405. package/dist/tui/hooks/index.js +7 -6
  406. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  407. package/dist/tui/hooks/use-activity-logs.js +87 -34
  408. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  409. package/dist/tui/hooks/use-auth-polling.js +104 -0
  410. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  411. package/dist/tui/hooks/use-slash-completion.js +1 -1
  412. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  413. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  414. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  415. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  416. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  417. package/dist/tui/hooks/use-ui-heights.js +88 -0
  418. package/dist/tui/providers/app-providers.js +2 -6
  419. package/dist/tui/types/commands.d.ts +0 -26
  420. package/dist/tui/types/index.d.ts +1 -1
  421. package/dist/tui/types/ui.d.ts +9 -4
  422. package/dist/tui/utils/line.d.ts +11 -0
  423. package/dist/tui/utils/line.js +16 -0
  424. package/dist/tui/utils/log.d.ts +27 -0
  425. package/dist/tui/utils/log.js +114 -0
  426. package/dist/tui/views/command-view.d.ts +7 -0
  427. package/dist/tui/views/command-view.js +103 -80
  428. package/dist/tui/views/login-view.js +7 -4
  429. package/dist/tui/views/logs-view.d.ts +13 -0
  430. package/dist/tui/views/logs-view.js +27 -52
  431. package/dist/utils/connection-error-handler.d.ts +16 -0
  432. package/dist/utils/connection-error-handler.js +49 -0
  433. package/dist/utils/crash-log.d.ts +14 -0
  434. package/dist/utils/crash-log.js +19 -0
  435. package/dist/utils/file-helpers.d.ts +14 -0
  436. package/dist/utils/file-helpers.js +21 -0
  437. package/dist/utils/global-logs-path.d.ts +11 -0
  438. package/dist/utils/global-logs-path.js +37 -0
  439. package/dist/utils/process-logger.d.ts +53 -0
  440. package/dist/utils/process-logger.js +253 -0
  441. package/dist/utils/sandbox-detector.d.ts +31 -0
  442. package/dist/utils/sandbox-detector.js +122 -0
  443. package/oclif.manifest.json +10 -198
  444. package/package.json +5 -1
  445. package/dist/commands/cipher-agent/run.d.ts +0 -142
  446. package/dist/commands/cipher-agent/run.js +0 -555
  447. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  448. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  449. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  450. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  451. package/dist/commands/foo.d.ts +0 -14
  452. package/dist/commands/foo.js +0 -66
  453. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  454. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  455. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  456. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  457. package/dist/infra/cipher/cipher-agent.js +0 -317
  458. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  459. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  460. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  461. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  462. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  463. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  464. package/dist/tui/contexts/consumer.d.ts +0 -31
  465. package/dist/tui/contexts/consumer.js +0 -56
  466. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  467. package/dist/tui/hooks/use-consumer.js +0 -50
  468. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  469. package/dist/tui/hooks/use-queue-polling.js +0 -90
  470. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  471. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  472. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  473. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  474. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Reactive Overflow compression strategy.
3
+ *
4
+ * This strategy uses an LLM to generate intelligent summaries of older messages
5
+ * when the context window overflows. Unlike simple truncation strategies, it
6
+ * preserves the semantic meaning of the conversation.
7
+ *
8
+ * Algorithm:
9
+ * 1. Check if overflow (currentTokens > maxHistoryTokens)
10
+ * 2. Select oldest non-system messages to summarize
11
+ * 3. Generate LLM summary of selected messages
12
+ * 4. Return: systemMessages + summaryMessage + remainingMessages
13
+ * 5. Summary message has metadata.isSummary = true
14
+ *
15
+ * Key design principles:
16
+ * - Uses same model as conversation (per user configuration)
17
+ * - Summary message marks compaction boundary
18
+ * - filterCompacted() excludes old messages at read-time
19
+ * - Full history preserved in storage for audit
20
+ *
21
+ */
22
+ import { isTextPart } from '../../../../../core/interfaces/cipher/message-type-guards.js';
23
+ /**
24
+ * Default configuration values.
25
+ */
26
+ const DEFAULTS = {
27
+ minMessagesToSummarize: 10,
28
+ preserveLastNTurns: 2,
29
+ summaryTargetTokens: 2000,
30
+ };
31
+ /**
32
+ * Reactive Overflow compression strategy.
33
+ *
34
+ * Uses an LLM to generate intelligent summaries when context overflows.
35
+ */
36
+ export class ReactiveOverflowStrategy {
37
+ llmProvider;
38
+ minMessagesToSummarize;
39
+ model;
40
+ preserveLastNTurns;
41
+ summaryTargetTokens;
42
+ constructor(options) {
43
+ this.llmProvider = options.llmProvider;
44
+ this.model = options.model;
45
+ this.summaryTargetTokens = options.summaryTargetTokens ?? DEFAULTS.summaryTargetTokens;
46
+ this.minMessagesToSummarize = options.minMessagesToSummarize ?? DEFAULTS.minMessagesToSummarize;
47
+ this.preserveLastNTurns = options.preserveLastNTurns ?? DEFAULTS.preserveLastNTurns;
48
+ }
49
+ async compress(history, maxHistoryTokens, tokenizer) {
50
+ // Calculate current token count
51
+ const currentTokens = this.countHistoryTokens(history, tokenizer);
52
+ // Check if compression is needed
53
+ if (currentTokens <= maxHistoryTokens) {
54
+ return history;
55
+ }
56
+ // Separate system messages from non-system messages
57
+ const systemMessages = history.filter((m) => m.role === 'system');
58
+ const nonSystemMessages = history.filter((m) => m.role !== 'system');
59
+ // Check if we have enough messages to summarize
60
+ if (nonSystemMessages.length < this.minMessagesToSummarize) {
61
+ // Not enough messages, can't use this strategy
62
+ return history;
63
+ }
64
+ // Calculate how many messages to keep (preserve last N turns)
65
+ const turnBoundaries = this.findTurnBoundaries(nonSystemMessages);
66
+ const turnsToPreserve = Math.min(this.preserveLastNTurns, turnBoundaries.length);
67
+ const preserveFromIndex = turnsToPreserve > 0
68
+ ? turnBoundaries[turnBoundaries.length - turnsToPreserve]
69
+ : nonSystemMessages.length;
70
+ // Split messages into "to summarize" and "to keep"
71
+ const messagesToSummarize = nonSystemMessages.slice(0, preserveFromIndex);
72
+ const messagesToKeep = nonSystemMessages.slice(preserveFromIndex);
73
+ // Need enough messages to summarize
74
+ if (messagesToSummarize.length < this.minMessagesToSummarize) {
75
+ return history;
76
+ }
77
+ // Generate summary using LLM
78
+ const summaryContent = await this.generateSummary(messagesToSummarize);
79
+ // Create summary message with metadata
80
+ const summaryMessage = {
81
+ content: `[Conversation Summary]\n${summaryContent}`,
82
+ metadata: {
83
+ compactedAt: Date.now(),
84
+ isSummary: true,
85
+ summarizedMessageCount: messagesToSummarize.length,
86
+ },
87
+ role: 'system',
88
+ };
89
+ // Return: system messages + summary + kept messages
90
+ return [...systemMessages, summaryMessage, ...messagesToKeep];
91
+ }
92
+ getName() {
93
+ return 'ReactiveOverflow';
94
+ }
95
+ /**
96
+ * Count tokens in message history.
97
+ */
98
+ countHistoryTokens(history, tokenizer) {
99
+ let total = 0;
100
+ for (const message of history) {
101
+ total += this.countMessageTokens(message, tokenizer);
102
+ }
103
+ return total;
104
+ }
105
+ /**
106
+ * Count tokens in a single message.
107
+ */
108
+ countMessageTokens(message, tokenizer) {
109
+ // Role overhead (approximately 4 tokens)
110
+ let tokens = 4;
111
+ if (typeof message.content === 'string') {
112
+ tokens += tokenizer.countTokens(message.content);
113
+ }
114
+ else if (Array.isArray(message.content)) {
115
+ for (const part of message.content) {
116
+ tokens += isTextPart(part) ? tokenizer.countTokens(part.text) : 100;
117
+ }
118
+ }
119
+ // Tool calls overhead
120
+ if (message.toolCalls) {
121
+ for (const call of message.toolCalls) {
122
+ tokens += tokenizer.countTokens(call.function.name);
123
+ tokens += tokenizer.countTokens(call.function.arguments);
124
+ }
125
+ }
126
+ return tokens;
127
+ }
128
+ /**
129
+ * Extract text content from a message.
130
+ */
131
+ extractTextContent(message) {
132
+ if (typeof message.content === 'string') {
133
+ return message.content;
134
+ }
135
+ if (Array.isArray(message.content)) {
136
+ return message.content
137
+ .filter((p) => isTextPart(p))
138
+ .map((p) => p.text)
139
+ .join('\n');
140
+ }
141
+ return '';
142
+ }
143
+ /**
144
+ * Find turn boundaries in message history.
145
+ *
146
+ * A turn boundary is the index where a user message starts.
147
+ * Returns indices of all user messages.
148
+ */
149
+ findTurnBoundaries(messages) {
150
+ const boundaries = [];
151
+ for (const [index, message] of messages.entries()) {
152
+ if (message.role === 'user') {
153
+ boundaries.push(index);
154
+ }
155
+ }
156
+ return boundaries;
157
+ }
158
+ /**
159
+ * Format messages for the summary prompt.
160
+ */
161
+ formatMessagesForSummary(messages) {
162
+ const lines = [];
163
+ for (const message of messages) {
164
+ const role = this.formatRole(message.role);
165
+ const content = this.extractTextContent(message);
166
+ // Truncate very long messages
167
+ const truncatedContent = content.length > 2000
168
+ ? `${content.slice(0, 2000)}... [truncated]`
169
+ : content;
170
+ if (truncatedContent) {
171
+ lines.push(`${role}: ${truncatedContent}`);
172
+ }
173
+ // Include tool call information
174
+ if (message.toolCalls && message.toolCalls.length > 0) {
175
+ const toolNames = message.toolCalls.map((tc) => tc.function.name).join(', ');
176
+ lines.push(`[Used tools: ${toolNames}]`);
177
+ }
178
+ }
179
+ return lines.join('\n\n');
180
+ }
181
+ /**
182
+ * Format role for display.
183
+ */
184
+ formatRole(role) {
185
+ switch (role) {
186
+ case 'assistant': {
187
+ return 'Assistant';
188
+ }
189
+ case 'system': {
190
+ return 'System';
191
+ }
192
+ case 'tool': {
193
+ return 'Tool Result';
194
+ }
195
+ case 'user': {
196
+ return 'User';
197
+ }
198
+ default: {
199
+ return role.charAt(0).toUpperCase() + role.slice(1);
200
+ }
201
+ }
202
+ }
203
+ /**
204
+ * Generate a fallback summary without LLM.
205
+ */
206
+ generateFallbackSummary(messages) {
207
+ const userMessages = messages.filter((m) => m.role === 'user');
208
+ const assistantMessages = messages.filter((m) => m.role === 'assistant');
209
+ const toolMessages = messages.filter((m) => m.role === 'tool');
210
+ const lines = [
211
+ `Summarized ${messages.length} messages:`,
212
+ `- ${userMessages.length} user messages`,
213
+ `- ${assistantMessages.length} assistant responses`,
214
+ `- ${toolMessages.length} tool results`,
215
+ ];
216
+ // Extract key topics from user messages
217
+ const topics = new Set();
218
+ for (const msg of userMessages.slice(0, 5)) {
219
+ const content = this.extractTextContent(msg);
220
+ const words = content.split(/\s+/).slice(0, 10).join(' ');
221
+ if (words) {
222
+ topics.add(words);
223
+ }
224
+ }
225
+ if (topics.size > 0) {
226
+ const topicLines = ['', 'Key topics discussed:'];
227
+ for (const topic of topics) {
228
+ topicLines.push(`- ${topic}...`);
229
+ }
230
+ lines.push(...topicLines);
231
+ }
232
+ return lines.join('\n');
233
+ }
234
+ /**
235
+ * Generate a summary of messages using the LLM.
236
+ */
237
+ async generateSummary(messages) {
238
+ const conversationText = this.formatMessagesForSummary(messages);
239
+ const prompt = `You are a conversation summarizer. Summarize the following conversation concisely, preserving:
240
+ - Key decisions made
241
+ - Important actions taken
242
+ - Critical context for continuing the conversation
243
+ - Any unresolved questions or tasks
244
+
245
+ Keep the summary focused and actionable. Do not include unnecessary details.
246
+
247
+ Conversation:
248
+ ${conversationText}
249
+
250
+ Summary:`;
251
+ try {
252
+ const summary = await this.llmProvider.generate({
253
+ maxTokens: this.summaryTargetTokens,
254
+ prompt,
255
+ ...(this.model && { model: this.model }),
256
+ temperature: 0.3, // Lower temperature for more consistent summaries
257
+ });
258
+ return summary.trim() || 'Unable to generate summary.';
259
+ }
260
+ catch {
261
+ // Fallback if LLM fails
262
+ const fallbackSummary = this.generateFallbackSummary(messages);
263
+ return fallbackSummary;
264
+ }
265
+ }
266
+ }
267
+ /**
268
+ * Create a ReactiveOverflowStrategy instance.
269
+ */
270
+ export function createReactiveOverflowStrategy(options) {
271
+ return new ReactiveOverflowStrategy(options);
272
+ }
@@ -2,7 +2,7 @@ import type { IHistoryStorage } from '../../../../core/interfaces/cipher/i-histo
2
2
  import type { ILogger } from '../../../../core/interfaces/cipher/i-logger.js';
3
3
  import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
4
4
  import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
5
- import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
5
+ import type { InternalMessage, ToolPart, ToolState } from '../../../../core/interfaces/cipher/message-types.js';
6
6
  import type { ICompressionStrategy } from './compression/types.js';
7
7
  /**
8
8
  * Configuration for persistence retry behavior.
@@ -138,6 +138,15 @@ export declare class ContextManager<T> {
138
138
  * @param content - System message content
139
139
  */
140
140
  addSystemMessage(content: string): Promise<void>;
141
+ /**
142
+ * Add a pending tool call to the current assistant message.
143
+ * Creates a ToolPart in pending state and adds it to the last assistant message's content.
144
+ *
145
+ * @param callId - Unique identifier for this tool call
146
+ * @param toolName - Name of the tool being called
147
+ * @param input - Parsed input arguments
148
+ */
149
+ addToolCallPending(callId: string, toolName: string, input: Record<string, unknown>): void;
141
150
  /**
142
151
  * Add a tool result message to the conversation.
143
152
  * Thread-safe: Uses mutex to protect shared state during parallel tool execution.
@@ -169,6 +178,18 @@ export declare class ContextManager<T> {
169
178
  * Also clears persisted history if storage is enabled.
170
179
  */
171
180
  clearHistory(): Promise<void>;
181
+ /**
182
+ * Flush any pending history writes to storage.
183
+ * Provides explicit durability guarantee - ensures all messages
184
+ * are persisted before the promise resolves.
185
+ *
186
+ * Call at turn boundaries, before session cleanup, or when
187
+ * explicit persistence confirmation is needed.
188
+ *
189
+ * @returns Promise that resolves when history is persisted
190
+ * @throws Error if persistence fails after all retries
191
+ */
192
+ flush(): Promise<void>;
172
193
  /**
173
194
  * Get comprehensive messages (all messages, for persistence/debugging).
174
195
  * This includes all messages including invalid ones.
@@ -203,6 +224,13 @@ export declare class ContextManager<T> {
203
224
  * Get the session ID.
204
225
  */
205
226
  getSessionId(): string;
227
+ /**
228
+ * Get a tool part by its call ID.
229
+ *
230
+ * @param callId - ID of the tool call to find
231
+ * @returns The tool part if found, undefined otherwise
232
+ */
233
+ getToolPart(callId: string): ToolPart | undefined;
206
234
  /**
207
235
  * Initialize the context manager by loading persisted history.
208
236
  * Should be called after construction to restore previous conversation.
@@ -210,6 +238,18 @@ export declare class ContextManager<T> {
210
238
  * @returns True if history was loaded, false otherwise
211
239
  */
212
240
  initialize(): Promise<boolean>;
241
+ /**
242
+ * Update a tool call's state.
243
+ * Used for transitioning through pending → running → completed/error.
244
+ *
245
+ * @param callId - ID of the tool call to update
246
+ * @param stateUpdate - New state
247
+ */
248
+ updateToolCallState(callId: string, stateUpdate: ToolState): void;
249
+ /**
250
+ * Add a ToolPart to a message at the given index.
251
+ */
252
+ private addToolPartToMessage;
213
253
  /**
214
254
  * Compress conversation history if needed to fit within token limits.
215
255
  *
@@ -228,6 +268,12 @@ export declare class ContextManager<T> {
228
268
  * @returns Token count
229
269
  */
230
270
  private countTokens;
271
+ /**
272
+ * Find the index of the last assistant message.
273
+ *
274
+ * @returns Index of last assistant message, or -1 if not found
275
+ */
276
+ private findLastAssistantMessageIndex;
231
277
  /**
232
278
  * Check if a system message is noise (empty or whitespace only).
233
279
  *
@@ -101,6 +101,29 @@ export class ContextManager {
101
101
  this.logger.error('Failed to persist history after system message', { error, sessionId: this.sessionId });
102
102
  });
103
103
  }
104
+ /**
105
+ * Add a pending tool call to the current assistant message.
106
+ * Creates a ToolPart in pending state and adds it to the last assistant message's content.
107
+ *
108
+ * @param callId - Unique identifier for this tool call
109
+ * @param toolName - Name of the tool being called
110
+ * @param input - Parsed input arguments
111
+ */
112
+ addToolCallPending(callId, toolName, input) {
113
+ const toolPart = {
114
+ callId,
115
+ state: { input, status: 'pending' },
116
+ toolName,
117
+ type: 'tool',
118
+ };
119
+ // Find the last assistant message and add the tool part
120
+ const lastAssistantIdx = this.findLastAssistantMessageIndex();
121
+ if (lastAssistantIdx === -1) {
122
+ this.logger.warn('No assistant message found to add tool call', { callId, sessionId: this.sessionId });
123
+ return;
124
+ }
125
+ this.addToolPartToMessage(lastAssistantIdx, toolPart);
126
+ }
104
127
  /**
105
128
  * Add a tool result message to the conversation.
106
129
  * Thread-safe: Uses mutex to protect shared state during parallel tool execution.
@@ -173,6 +196,22 @@ export class ContextManager {
173
196
  }
174
197
  }
175
198
  }
199
+ /**
200
+ * Flush any pending history writes to storage.
201
+ * Provides explicit durability guarantee - ensures all messages
202
+ * are persisted before the promise resolves.
203
+ *
204
+ * Call at turn boundaries, before session cleanup, or when
205
+ * explicit persistence confirmation is needed.
206
+ *
207
+ * @returns Promise that resolves when history is persisted
208
+ * @throws Error if persistence fails after all retries
209
+ */
210
+ async flush() {
211
+ if (this.historyStorage) {
212
+ await this.persistHistory();
213
+ }
214
+ }
176
215
  /**
177
216
  * Get comprehensive messages (all messages, for persistence/debugging).
178
217
  * This includes all messages including invalid ones.
@@ -236,6 +275,25 @@ export class ContextManager {
236
275
  getSessionId() {
237
276
  return this.sessionId;
238
277
  }
278
+ /**
279
+ * Get a tool part by its call ID.
280
+ *
281
+ * @param callId - ID of the tool call to find
282
+ * @returns The tool part if found, undefined otherwise
283
+ */
284
+ getToolPart(callId) {
285
+ for (let msgIdx = this.messages.length - 1; msgIdx >= 0; msgIdx--) {
286
+ const message = this.messages[msgIdx];
287
+ if (!Array.isArray(message.content))
288
+ continue;
289
+ for (const part of message.content) {
290
+ if (part.type === 'tool' && part.callId === callId) {
291
+ return part;
292
+ }
293
+ }
294
+ }
295
+ return undefined;
296
+ }
239
297
  /**
240
298
  * Initialize the context manager by loading persisted history.
241
299
  * Should be called after construction to restore previous conversation.
@@ -269,6 +327,64 @@ export class ContextManager {
269
327
  return false;
270
328
  }
271
329
  }
330
+ /**
331
+ * Update a tool call's state.
332
+ * Used for transitioning through pending → running → completed/error.
333
+ *
334
+ * @param callId - ID of the tool call to update
335
+ * @param stateUpdate - New state
336
+ */
337
+ updateToolCallState(callId, stateUpdate) {
338
+ // Find the tool part with this callId
339
+ for (let msgIdx = this.messages.length - 1; msgIdx >= 0; msgIdx--) {
340
+ const message = this.messages[msgIdx];
341
+ if (!Array.isArray(message.content))
342
+ continue;
343
+ for (let partIdx = 0; partIdx < message.content.length; partIdx++) {
344
+ const part = message.content[partIdx];
345
+ if (part.type === 'tool' && part.callId === callId) {
346
+ // Update the tool part state
347
+ const updatedPart = {
348
+ ...part,
349
+ state: stateUpdate,
350
+ };
351
+ // Create new content array with updated part
352
+ const newContent = [...message.content];
353
+ newContent[partIdx] = updatedPart;
354
+ // Update the message
355
+ this.messages[msgIdx] = {
356
+ ...message,
357
+ content: newContent,
358
+ };
359
+ return;
360
+ }
361
+ }
362
+ }
363
+ this.logger.warn('Tool call not found for state update', { callId, sessionId: this.sessionId });
364
+ }
365
+ // ==================== PRIVATE METHODS ====================
366
+ /**
367
+ * Add a ToolPart to a message at the given index.
368
+ */
369
+ addToolPartToMessage(messageIdx, toolPart) {
370
+ const message = this.messages[messageIdx];
371
+ let newContent;
372
+ if (Array.isArray(message.content)) {
373
+ newContent = [...message.content, toolPart];
374
+ }
375
+ else if (typeof message.content === 'string') {
376
+ // Convert string content to array with text part + tool part
377
+ newContent = [{ text: message.content, type: 'text' }, toolPart];
378
+ }
379
+ else {
380
+ // null content - just add tool part
381
+ newContent = [toolPart];
382
+ }
383
+ this.messages[messageIdx] = {
384
+ ...message,
385
+ content: newContent,
386
+ };
387
+ }
272
388
  /**
273
389
  * Compress conversation history if needed to fit within token limits.
274
390
  *
@@ -352,6 +468,19 @@ export class ContextManager {
352
468
  .join('\n');
353
469
  return this.tokenizer.countTokens(text);
354
470
  }
471
+ /**
472
+ * Find the index of the last assistant message.
473
+ *
474
+ * @returns Index of last assistant message, or -1 if not found
475
+ */
476
+ findLastAssistantMessageIndex() {
477
+ for (let i = this.messages.length - 1; i >= 0; i--) {
478
+ if (this.messages[i].role === 'assistant') {
479
+ return i;
480
+ }
481
+ }
482
+ return -1;
483
+ }
355
484
  /**
356
485
  * Check if a system message is noise (empty or whitespace only).
357
486
  *
@@ -1,9 +1,7 @@
1
1
  /**
2
2
  * Count tokens for a single content part
3
3
  *
4
- * @param part - Content part
5
- * @param part.text - Text content (for text type)
6
- * @param part.type - Type of content part
4
+ * @param part - Content part (text, image, file, reasoning, or tool)
7
5
  * @param tokenizer - Tokenizer for counting
8
6
  * @returns Token count for the part
9
7
  */
@@ -20,9 +18,24 @@ function countPartTokens(part, tokenizer) {
20
18
  // Conservative estimate: ~100 tokens per image
21
19
  return 100;
22
20
  }
21
+ case 'reasoning': {
22
+ // Reasoning/thinking content - use tokenizer
23
+ return tokenizer.countTokens(part.text);
24
+ }
23
25
  case 'text': {
24
26
  // Text content - use tokenizer
25
- return tokenizer.countTokens(part.text ?? '');
27
+ return tokenizer.countTokens(part.text);
28
+ }
29
+ case 'tool': {
30
+ // Tool call part - count input + output tokens
31
+ let tokens = tokenizer.countTokens(JSON.stringify(part.state.input));
32
+ if (part.state.status === 'completed') {
33
+ tokens += tokenizer.countTokens(part.state.output);
34
+ }
35
+ else if (part.state.status === 'error') {
36
+ tokens += tokenizer.countTokens(part.state.error);
37
+ }
38
+ return tokens;
26
39
  }
27
40
  default: {
28
41
  return 0;
@@ -77,10 +77,12 @@ export class ByteRoverContentGenerator {
77
77
  const config = this.providerType === 'claude' ? {} : genConfig;
78
78
  // Build execution metadata from request
79
79
  const executionMetadata = {
80
- sessionId: request.sessionId,
81
- ...(request.mode && { mode: request.mode }),
80
+ sessionId: request.taskId,
81
+ taskId: request.taskId,
82
82
  ...(request.executionContext && { executionContext: request.executionContext }),
83
83
  };
84
+ // // Debug: Log taskId for tracking
85
+ // appendFileSync('debug-taskid.log', `[${new Date().toISOString()}] taskId from request: "${request.taskId}"\n`)
84
86
  const rawResponse = await this.httpService.generateContent(contents, config, this.config.model, executionMetadata);
85
87
  // Parse response to internal format
86
88
  const messages = this.formatter.parseResponse(rawResponse);