byterover-cli 0.4.0 → 1.0.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 (478) 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/entities/event.d.ts +1 -1
  49. package/dist/core/domain/entities/event.js +3 -1
  50. package/dist/core/domain/errors/connection-error.d.ts +33 -0
  51. package/dist/core/domain/errors/connection-error.js +54 -0
  52. package/dist/core/domain/errors/core-process-error.d.ts +27 -0
  53. package/dist/core/domain/errors/core-process-error.js +43 -0
  54. package/dist/core/domain/errors/task-error.d.ts +64 -0
  55. package/dist/core/domain/errors/task-error.js +116 -0
  56. package/dist/core/domain/errors/transport-error.d.ts +72 -0
  57. package/dist/core/domain/errors/transport-error.js +114 -0
  58. package/dist/core/domain/instance/index.d.ts +1 -0
  59. package/dist/core/domain/instance/index.js +1 -0
  60. package/dist/core/domain/instance/types.d.ts +57 -0
  61. package/dist/core/domain/instance/types.js +72 -0
  62. package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
  63. package/dist/core/domain/knowledge/directory-manager.js +31 -0
  64. package/dist/core/domain/transport/index.d.ts +2 -0
  65. package/dist/core/domain/transport/index.js +2 -0
  66. package/dist/core/domain/transport/schemas.d.ts +1149 -0
  67. package/dist/core/domain/transport/schemas.js +554 -0
  68. package/dist/core/domain/transport/types.d.ts +67 -0
  69. package/dist/core/domain/transport/types.js +7 -0
  70. package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
  71. package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
  72. package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
  73. package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
  74. package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
  75. package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
  76. package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
  77. package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
  78. package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
  79. package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
  80. package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
  81. package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
  82. package/dist/core/interfaces/cipher/index.d.ts +35 -0
  83. package/dist/core/interfaces/cipher/index.js +11 -0
  84. package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
  85. package/dist/core/interfaces/cipher/message-factory.js +252 -0
  86. package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
  87. package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
  88. package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
  89. package/dist/core/interfaces/cipher/message-types.js +6 -0
  90. package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
  91. package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
  92. package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
  93. package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
  94. package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
  95. package/dist/core/interfaces/executor/i-query-executor.js +1 -0
  96. package/dist/core/interfaces/executor/index.d.ts +2 -0
  97. package/dist/core/interfaces/executor/index.js +2 -0
  98. package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
  99. package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
  100. package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
  101. package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
  102. package/dist/core/interfaces/instance/index.d.ts +2 -0
  103. package/dist/core/interfaces/instance/index.js +2 -0
  104. package/dist/core/interfaces/noop-implementations.d.ts +53 -0
  105. package/dist/core/interfaces/noop-implementations.js +62 -0
  106. package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
  107. package/dist/core/interfaces/transport/i-transport-client.js +1 -0
  108. package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
  109. package/dist/core/interfaces/transport/i-transport-server.js +1 -0
  110. package/dist/core/interfaces/transport/index.d.ts +2 -0
  111. package/dist/core/interfaces/transport/index.js +2 -0
  112. package/dist/hooks/init/welcome.js +9 -24
  113. package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
  114. package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
  115. package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
  116. package/dist/infra/cipher/agent/agent-error.js +79 -0
  117. package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
  118. package/dist/infra/cipher/agent/agent-schemas.js +97 -0
  119. package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
  120. package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
  121. package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
  122. package/dist/infra/cipher/agent/base-agent.js +240 -0
  123. package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
  124. package/dist/infra/cipher/agent/cipher-agent.js +546 -0
  125. package/dist/infra/cipher/agent/index.d.ts +22 -0
  126. package/dist/infra/cipher/agent/index.js +24 -0
  127. package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
  128. package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
  129. package/dist/infra/cipher/agent/types.d.ts +35 -0
  130. package/dist/infra/cipher/agent/types.js +1 -0
  131. package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
  132. package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
  133. package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
  134. package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
  135. package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
  136. package/dist/infra/cipher/consumer/consumer-service.js +1 -0
  137. package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
  138. package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
  139. package/dist/infra/cipher/consumer/index.d.ts +1 -1
  140. package/dist/infra/cipher/consumer/index.js +2 -1
  141. package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
  142. package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
  143. package/dist/infra/cipher/file-system/binary-utils.js +164 -0
  144. package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
  145. package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
  146. package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
  147. package/dist/infra/cipher/file-system/file-system-service.js +327 -36
  148. package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
  149. package/dist/infra/cipher/file-system/path-validator.js +111 -6
  150. package/dist/infra/cipher/interactive-loop.js +41 -33
  151. package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
  152. package/dist/infra/cipher/llm/capability-cache.js +125 -0
  153. package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
  154. package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
  155. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
  156. package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
  157. package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
  158. package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
  159. package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
  160. package/dist/infra/cipher/llm/context/compression/index.js +6 -0
  161. package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
  162. package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
  163. package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
  164. package/dist/infra/cipher/llm/context/context-manager.js +129 -0
  165. package/dist/infra/cipher/llm/context/utils.js +17 -4
  166. package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
  167. package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
  168. package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
  169. package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
  170. package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
  171. package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
  172. package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
  173. package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
  174. package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
  175. package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
  176. package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
  177. package/dist/infra/cipher/llm/sanitization/index.js +13 -0
  178. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
  179. package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
  180. package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
  181. package/dist/infra/cipher/llm/stream-processor.js +276 -0
  182. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
  183. package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
  184. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
  185. package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
  186. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
  187. package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
  188. package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
  189. package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
  190. package/dist/infra/cipher/process/command-validator.d.ts +23 -0
  191. package/dist/infra/cipher/process/command-validator.js +75 -0
  192. package/dist/infra/cipher/process/path-utils.d.ts +66 -0
  193. package/dist/infra/cipher/process/path-utils.js +94 -0
  194. package/dist/infra/cipher/process/process-service.d.ts +32 -0
  195. package/dist/infra/cipher/process/process-service.js +98 -17
  196. package/dist/infra/cipher/session/chat-session.d.ts +56 -7
  197. package/dist/infra/cipher/session/chat-session.js +163 -13
  198. package/dist/infra/cipher/session/index.d.ts +1 -0
  199. package/dist/infra/cipher/session/index.js +2 -0
  200. package/dist/infra/cipher/session/message-queue.d.ts +65 -0
  201. package/dist/infra/cipher/session/message-queue.js +90 -0
  202. package/dist/infra/cipher/session/session-manager.d.ts +106 -5
  203. package/dist/infra/cipher/session/session-manager.js +254 -7
  204. package/dist/infra/cipher/session/session-status.d.ts +137 -0
  205. package/dist/infra/cipher/session/session-status.js +184 -0
  206. package/dist/infra/cipher/session/title-generator.d.ts +8 -0
  207. package/dist/infra/cipher/session/title-generator.js +31 -0
  208. package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
  209. package/dist/infra/cipher/storage/message-storage-service.js +300 -54
  210. package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
  211. package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
  212. package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
  213. package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
  214. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
  215. package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
  216. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
  217. package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
  218. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
  219. package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
  220. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
  221. package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
  222. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
  223. package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
  224. package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
  225. package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
  226. package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
  227. package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
  228. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
  229. package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
  230. package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
  231. package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
  232. package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
  233. package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
  234. package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
  235. package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
  236. package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
  237. package/dist/infra/cipher/system-prompt/schemas.js +94 -0
  238. package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
  239. package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
  240. package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
  241. package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
  242. package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
  243. package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
  244. package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
  245. package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
  246. package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
  247. package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
  248. package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
  249. package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
  250. package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
  251. package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
  252. package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
  253. package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
  254. package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
  255. package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
  256. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
  257. package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
  258. package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
  259. package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
  260. package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
  261. package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
  262. package/dist/infra/cipher/tools/index.d.ts +1 -1
  263. package/dist/infra/cipher/tools/index.js +1 -1
  264. package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
  265. package/dist/infra/cipher/tools/plugins/index.js +2 -0
  266. package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
  267. package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
  268. package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
  269. package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
  270. package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
  271. package/dist/infra/cipher/tools/streaming/index.js +1 -0
  272. package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
  273. package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
  274. package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
  275. package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
  276. package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
  277. package/dist/infra/cipher/tools/tool-manager.js +107 -11
  278. package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
  279. package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
  280. package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
  281. package/dist/infra/cipher/tools/tool-provider.js +81 -25
  282. package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
  283. package/dist/infra/cipher/tools/tool-registry.js +58 -16
  284. package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
  285. package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
  286. package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
  287. package/dist/infra/context-tree/path-utils.d.ts +7 -0
  288. package/dist/infra/context-tree/path-utils.js +7 -0
  289. package/dist/infra/core/executors/curate-executor.d.ts +35 -0
  290. package/dist/infra/core/executors/curate-executor.js +123 -0
  291. package/dist/infra/core/executors/index.d.ts +2 -0
  292. package/dist/infra/core/executors/index.js +2 -0
  293. package/dist/infra/core/executors/query-executor.d.ts +23 -0
  294. package/dist/infra/core/executors/query-executor.js +51 -0
  295. package/dist/infra/core/task-processor.d.ts +81 -0
  296. package/dist/infra/core/task-processor.js +115 -0
  297. package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
  298. package/dist/infra/instance/file-instance-discovery.js +84 -0
  299. package/dist/infra/instance/file-instance-manager.d.ts +46 -0
  300. package/dist/infra/instance/file-instance-manager.js +123 -0
  301. package/dist/infra/instance/index.d.ts +3 -0
  302. package/dist/infra/instance/index.js +3 -0
  303. package/dist/infra/instance/process-utils.d.ts +14 -0
  304. package/dist/infra/instance/process-utils.js +39 -0
  305. package/dist/infra/process/agent-worker.d.ts +20 -0
  306. package/dist/infra/process/agent-worker.js +602 -0
  307. package/dist/infra/process/index.d.ts +12 -0
  308. package/dist/infra/process/index.js +11 -0
  309. package/dist/infra/process/ipc-types.d.ts +55 -0
  310. package/dist/infra/process/ipc-types.js +12 -0
  311. package/dist/infra/process/process-manager.d.ts +154 -0
  312. package/dist/infra/process/process-manager.js +471 -0
  313. package/dist/infra/process/task-queue-manager.d.ts +123 -0
  314. package/dist/infra/process/task-queue-manager.js +226 -0
  315. package/dist/infra/process/transport-handlers.d.ts +124 -0
  316. package/dist/infra/process/transport-handlers.js +348 -0
  317. package/dist/infra/process/transport-worker.d.ts +20 -0
  318. package/dist/infra/process/transport-worker.js +168 -0
  319. package/dist/infra/repl/commands/curate-command.js +0 -5
  320. package/dist/infra/repl/commands/query-command.js +0 -3
  321. package/dist/infra/repl/repl-startup.d.ts +4 -0
  322. package/dist/infra/repl/repl-startup.js +10 -1
  323. package/dist/infra/repl/transport-client-helper.d.ts +9 -0
  324. package/dist/infra/repl/transport-client-helper.js +96 -0
  325. package/dist/infra/transport/index.d.ts +4 -0
  326. package/dist/infra/transport/index.js +4 -0
  327. package/dist/infra/transport/port-utils.d.ts +42 -0
  328. package/dist/infra/transport/port-utils.js +84 -0
  329. package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
  330. package/dist/infra/transport/socket-io-transport-client.js +270 -0
  331. package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
  332. package/dist/infra/transport/socket-io-transport-server.js +207 -0
  333. package/dist/infra/transport/transport-client-factory.d.ts +76 -0
  334. package/dist/infra/transport/transport-client-factory.js +168 -0
  335. package/dist/infra/transport/transport-factory.d.ts +33 -0
  336. package/dist/infra/transport/transport-factory.js +59 -0
  337. package/dist/infra/usecase/curate-use-case.d.ts +8 -55
  338. package/dist/infra/usecase/curate-use-case.js +73 -259
  339. package/dist/infra/usecase/init-use-case.js +19 -8
  340. package/dist/infra/usecase/login-use-case.js +9 -3
  341. package/dist/infra/usecase/query-use-case.d.ts +18 -45
  342. package/dist/infra/usecase/query-use-case.js +251 -326
  343. package/dist/infra/usecase/status-use-case.js +1 -1
  344. package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
  345. package/dist/resources/prompts/explore.yml +78 -0
  346. package/dist/resources/prompts/plan.yml +114 -0
  347. package/dist/resources/prompts/reflection.yml +1 -1
  348. package/dist/resources/prompts/system-prompt.yml +15 -8
  349. package/dist/resources/prompts/tool-outputs.yml +0 -5
  350. package/dist/resources/tools/bash_exec.txt +98 -0
  351. package/dist/resources/tools/bash_output.txt +40 -0
  352. package/dist/resources/tools/batch.txt +28 -0
  353. package/dist/resources/tools/create_knowledge_topic.txt +23 -0
  354. package/dist/resources/tools/curate.txt +22 -0
  355. package/dist/resources/tools/delete_memory.txt +1 -0
  356. package/dist/resources/tools/detect_domains.txt +11 -0
  357. package/dist/resources/tools/edit_file.txt +1 -0
  358. package/dist/resources/tools/edit_memory.txt +1 -0
  359. package/dist/resources/tools/glob_files.txt +20 -0
  360. package/dist/resources/tools/grep_content.txt +18 -0
  361. package/dist/resources/tools/kill_process.txt +16 -0
  362. package/dist/resources/tools/list_directory.txt +16 -0
  363. package/dist/resources/tools/list_memories.txt +1 -0
  364. package/dist/resources/tools/read_file.txt +31 -0
  365. package/dist/resources/tools/read_memory.txt +1 -0
  366. package/dist/resources/tools/read_todos.txt +17 -0
  367. package/dist/resources/tools/search_history.txt +1 -0
  368. package/dist/resources/tools/task.txt +23 -0
  369. package/dist/resources/tools/write_file.txt +1 -0
  370. package/dist/resources/tools/write_memory.txt +1 -0
  371. package/dist/resources/tools/write_todos.txt +29 -0
  372. package/dist/tui/app.js +9 -13
  373. package/dist/tui/components/command-details.d.ts +14 -0
  374. package/dist/tui/components/command-details.js +35 -0
  375. package/dist/tui/components/execution/execution-changes.d.ts +5 -0
  376. package/dist/tui/components/execution/execution-changes.js +19 -4
  377. package/dist/tui/components/execution/execution-content.d.ts +4 -2
  378. package/dist/tui/components/execution/execution-content.js +26 -13
  379. package/dist/tui/components/execution/execution-input.js +3 -3
  380. package/dist/tui/components/execution/execution-progress.d.ts +2 -2
  381. package/dist/tui/components/execution/execution-progress.js +8 -6
  382. package/dist/tui/components/execution/log-item.d.ts +3 -4
  383. package/dist/tui/components/execution/log-item.js +2 -5
  384. package/dist/tui/components/footer.js +9 -4
  385. package/dist/tui/components/header.d.ts +3 -3
  386. package/dist/tui/components/header.js +5 -3
  387. package/dist/tui/components/index.d.ts +1 -0
  388. package/dist/tui/components/index.js +1 -0
  389. package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
  390. package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
  391. package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
  392. package/dist/tui/components/scrollable-list.js +12 -10
  393. package/dist/tui/components/suggestions.js +39 -41
  394. package/dist/tui/components/tab-bar.d.ts +2 -1
  395. package/dist/tui/components/tab-bar.js +3 -4
  396. package/dist/tui/constants.d.ts +0 -5
  397. package/dist/tui/constants.js +0 -5
  398. package/dist/tui/contexts/auth-context.js +9 -2
  399. package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
  400. package/dist/tui/contexts/index.d.ts +6 -1
  401. package/dist/tui/contexts/index.js +6 -1
  402. package/dist/tui/contexts/onboarding-context.d.ts +1 -1
  403. package/dist/tui/contexts/onboarding-context.js +9 -9
  404. package/dist/tui/contexts/tasks-context.d.ts +84 -0
  405. package/dist/tui/contexts/tasks-context.js +218 -0
  406. package/dist/tui/contexts/transport-context.d.ts +29 -0
  407. package/dist/tui/contexts/transport-context.js +82 -0
  408. package/dist/tui/hooks/index.d.ts +10 -6
  409. package/dist/tui/hooks/index.js +7 -6
  410. package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
  411. package/dist/tui/hooks/use-activity-logs.js +87 -34
  412. package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
  413. package/dist/tui/hooks/use-auth-polling.js +104 -0
  414. package/dist/tui/hooks/use-slash-command-processor.js +0 -1
  415. package/dist/tui/hooks/use-slash-completion.js +1 -1
  416. package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
  417. package/dist/tui/hooks/use-tab-navigation.js +16 -7
  418. package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
  419. package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
  420. package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
  421. package/dist/tui/hooks/use-ui-heights.js +88 -0
  422. package/dist/tui/providers/app-providers.js +2 -6
  423. package/dist/tui/types/commands.d.ts +0 -26
  424. package/dist/tui/types/index.d.ts +1 -1
  425. package/dist/tui/types/ui.d.ts +9 -4
  426. package/dist/tui/utils/line.d.ts +11 -0
  427. package/dist/tui/utils/line.js +16 -0
  428. package/dist/tui/utils/log.d.ts +27 -0
  429. package/dist/tui/utils/log.js +114 -0
  430. package/dist/tui/views/command-view.d.ts +7 -0
  431. package/dist/tui/views/command-view.js +103 -80
  432. package/dist/tui/views/login-view.js +7 -4
  433. package/dist/tui/views/logs-view.d.ts +13 -0
  434. package/dist/tui/views/logs-view.js +27 -52
  435. package/dist/utils/connection-error-handler.d.ts +16 -0
  436. package/dist/utils/connection-error-handler.js +49 -0
  437. package/dist/utils/crash-log.d.ts +14 -0
  438. package/dist/utils/crash-log.js +19 -0
  439. package/dist/utils/file-helpers.d.ts +14 -0
  440. package/dist/utils/file-helpers.js +21 -0
  441. package/dist/utils/global-logs-path.d.ts +11 -0
  442. package/dist/utils/global-logs-path.js +37 -0
  443. package/dist/utils/process-logger.d.ts +53 -0
  444. package/dist/utils/process-logger.js +253 -0
  445. package/dist/utils/sandbox-detector.d.ts +31 -0
  446. package/dist/utils/sandbox-detector.js +122 -0
  447. package/oclif.manifest.json +10 -198
  448. package/package.json +5 -1
  449. package/dist/commands/cipher-agent/run.d.ts +0 -142
  450. package/dist/commands/cipher-agent/run.js +0 -555
  451. package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
  452. package/dist/commands/cipher-agent/set-prompt.js +0 -58
  453. package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
  454. package/dist/commands/cipher-agent/show-prompt.js +0 -53
  455. package/dist/commands/foo.d.ts +0 -14
  456. package/dist/commands/foo.js +0 -66
  457. package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
  458. package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
  459. package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
  460. package/dist/infra/cipher/cipher-agent.d.ts +0 -182
  461. package/dist/infra/cipher/cipher-agent.js +0 -317
  462. package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
  463. package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
  464. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
  465. package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
  466. package/dist/resources/prompts/modes/autonomous.yml +0 -9
  467. package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
  468. package/dist/tui/contexts/consumer.d.ts +0 -31
  469. package/dist/tui/contexts/consumer.js +0 -56
  470. package/dist/tui/hooks/use-consumer.d.ts +0 -12
  471. package/dist/tui/hooks/use-consumer.js +0 -50
  472. package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
  473. package/dist/tui/hooks/use-queue-polling.js +0 -90
  474. /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
  475. /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
  476. /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
  477. /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
  478. /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
@@ -0,0 +1,398 @@
1
+ /**
2
+ * Tool output sanitization pipeline.
3
+ *
4
+ * This module provides a comprehensive sanitization pipeline for tool outputs:
5
+ * 1. normalize() - Convert arbitrary tool output to MessagePart[]
6
+ * 2. persistMedia() - Store large media as blob references
7
+ * 3. applySanitization() - Apply final cleanup (truncation, etc.)
8
+ *
9
+ */
10
+ import { DEFAULT_MAX_INLINE_MEDIA_BYTES, DEFAULT_TEXT_TRUNCATION, inferResourceKind, shouldAlwaysBlob, } from '../../../../core/interfaces/cipher/sanitization-types.js';
11
+ import { base64LengthToBytes, formatByteSize, isLikelyBase64String, parseDataUri, } from './base64-utils.js';
12
+ /**
13
+ * Tool output sanitizer.
14
+ *
15
+ * Provides a pipeline for sanitizing tool outputs:
16
+ * - Normalizes arbitrary output formats to MessagePart[]
17
+ * - Stores large media in blob storage with lazy references
18
+ * - Applies text truncation and cleanup
19
+ */
20
+ export class ToolSanitizer {
21
+ blobStorage;
22
+ maxInlineMediaBytes;
23
+ maxTextLength;
24
+ constructor(options) {
25
+ this.blobStorage = options?.blobStorage;
26
+ this.maxInlineMediaBytes = options?.maxInlineMediaBytes ?? DEFAULT_MAX_INLINE_MEDIA_BYTES;
27
+ this.maxTextLength = options?.maxTextLength ?? DEFAULT_TEXT_TRUNCATION.maxLength;
28
+ }
29
+ /**
30
+ * Step 3: Apply final sanitization (truncation, etc.).
31
+ */
32
+ applySanitization(parts, maxTextLength) {
33
+ const maxLen = maxTextLength ?? this.maxTextLength;
34
+ return parts.map((part) => {
35
+ if (part.type === 'text' && part.text.length > maxLen) {
36
+ return {
37
+ text: this.truncateText(part.text, maxLen),
38
+ type: 'text',
39
+ };
40
+ }
41
+ return part;
42
+ });
43
+ }
44
+ /**
45
+ * Step 1: Normalize arbitrary tool output to MessagePart array.
46
+ */
47
+ normalize(result) {
48
+ const detectedMimeTypes = [];
49
+ let hasBinaryContent = false;
50
+ const parts = this.normalizeValue(result, detectedMimeTypes, (isBinary) => {
51
+ if (isBinary)
52
+ hasBinaryContent = true;
53
+ });
54
+ return {
55
+ detectedMimeTypes: [...new Set(detectedMimeTypes)],
56
+ hasBinaryContent,
57
+ parts,
58
+ };
59
+ }
60
+ /**
61
+ * Step 2: Persist large media to blob storage.
62
+ */
63
+ async persistMedia(parts, toolName, toolCallId, maxInlineBytes) {
64
+ const threshold = maxInlineBytes ?? this.maxInlineMediaBytes;
65
+ const resources = [];
66
+ const persistedParts = [];
67
+ let blobsCreated = 0;
68
+ let bytesStored = 0;
69
+ const persistPromises = parts.map(async (part) => {
70
+ if (part.type === 'image' && typeof part.image === 'string') {
71
+ return this.persistImageIfNeeded(part, toolName, toolCallId, threshold);
72
+ }
73
+ if (part.type === 'file' && typeof part.data === 'string') {
74
+ return this.persistFileIfNeeded(part, toolName, toolCallId, threshold);
75
+ }
76
+ return { part };
77
+ });
78
+ const persistedResults = await Promise.all(persistPromises);
79
+ for (const persisted of persistedResults) {
80
+ persistedParts.push(persisted.part);
81
+ if (persisted.resource) {
82
+ resources.push(persisted.resource);
83
+ blobsCreated++;
84
+ bytesStored += persisted.resource.size ?? 0;
85
+ }
86
+ }
87
+ return { blobsCreated, bytesStored, parts: persistedParts, resources };
88
+ }
89
+ /**
90
+ * Sanitize a tool result through the full pipeline.
91
+ */
92
+ async sanitize(result, options) {
93
+ // Step 1: Normalize to MessagePart[]
94
+ const normalized = this.normalize(result);
95
+ // Step 2: Persist large media to blob storage
96
+ const persisted = await this.persistMedia(normalized.parts, options.toolName, options.toolCallId, options.maxInlineMediaBytes);
97
+ // Step 3: Apply final sanitization
98
+ const sanitizedParts = this.applySanitization(persisted.parts, options.maxTextLength);
99
+ return {
100
+ content: sanitizedParts,
101
+ ...(persisted.resources.length > 0 && { resources: persisted.resources }),
102
+ meta: {
103
+ success: options.success,
104
+ toolCallId: options.toolCallId,
105
+ toolName: options.toolName,
106
+ ...(options.durationMs !== undefined && { durationMs: options.durationMs }),
107
+ },
108
+ };
109
+ }
110
+ extractData(data) {
111
+ if (typeof data === 'string')
112
+ return data;
113
+ if (Buffer.isBuffer(data))
114
+ return data.toString('base64');
115
+ if (data instanceof Uint8Array)
116
+ return Buffer.from(data).toString('base64');
117
+ if (data instanceof ArrayBuffer)
118
+ return Buffer.from(new Uint8Array(data)).toString('base64');
119
+ return String(data);
120
+ }
121
+ generateBlobId(toolName, toolCallId) {
122
+ const sanitizedTool = toolName.replaceAll(/[^a-z0-9]/gi, '_').slice(0, 20);
123
+ const sanitizedCall = toolCallId.replaceAll(/[^a-z0-9]/gi, '_').slice(0, 10);
124
+ const timestamp = Date.now().toString(36);
125
+ const random = Math.random().toString(36).slice(2, 6);
126
+ return `${sanitizedTool}_${sanitizedCall}_${timestamp}_${random}`;
127
+ }
128
+ normalizeArray(array, detectedMimeTypes, onBinary) {
129
+ const parts = [];
130
+ for (const item of array) {
131
+ if (!item || typeof item !== 'object')
132
+ continue;
133
+ const obj = item;
134
+ const itemParts = this.normalizeArrayItem(obj, detectedMimeTypes, onBinary);
135
+ if (itemParts.length > 0) {
136
+ parts.push(...itemParts);
137
+ }
138
+ }
139
+ return parts.length > 0 ? parts : [{ text: JSON.stringify(array), type: 'text' }];
140
+ }
141
+ normalizeArrayItem(obj, detectedMimeTypes, onBinary) {
142
+ // MCP text content
143
+ if (obj.type === 'text' && typeof obj.text === 'string') {
144
+ return [{ text: obj.text, type: 'text' }];
145
+ }
146
+ // MCP image content
147
+ if (obj.type === 'image' && obj.data && obj.mimeType) {
148
+ const mimeType = obj.mimeType;
149
+ detectedMimeTypes.push(mimeType);
150
+ onBinary(true);
151
+ return [{
152
+ image: obj.data,
153
+ mimeType,
154
+ type: 'image',
155
+ }];
156
+ }
157
+ // MCP resource content
158
+ if (obj.type === 'resource' && obj.resource) {
159
+ return this.normalizeResourceContent(obj.resource, detectedMimeTypes, onBinary);
160
+ }
161
+ // Nested object - recursively normalize
162
+ return this.normalizeValue(obj, detectedMimeTypes, onBinary);
163
+ }
164
+ normalizeObject(obj, detectedMimeTypes, onBinary) {
165
+ // Check for nested content array
166
+ if ('content' in obj && Array.isArray(obj.content)) {
167
+ return this.normalizeArray(obj.content, detectedMimeTypes, onBinary);
168
+ }
169
+ // { image, mimeType? }
170
+ if ('image' in obj) {
171
+ const mimeType = obj.mimeType || 'image/jpeg';
172
+ detectedMimeTypes.push(mimeType);
173
+ onBinary(true);
174
+ return [{
175
+ image: this.extractData(obj.image),
176
+ mimeType,
177
+ type: 'image',
178
+ }];
179
+ }
180
+ // { data, mimeType }
181
+ if ('data' in obj && obj.mimeType) {
182
+ const mimeType = obj.mimeType;
183
+ detectedMimeTypes.push(mimeType);
184
+ onBinary(true);
185
+ const filePart = {
186
+ data: this.extractData(obj.data),
187
+ mimeType,
188
+ type: 'file',
189
+ };
190
+ if (obj.filename && typeof obj.filename === 'string') {
191
+ filePart.filename = obj.filename;
192
+ }
193
+ return [filePart];
194
+ }
195
+ // Generic object - sanitize and stringify
196
+ const cleaned = this.sanitizeDeepObject(obj);
197
+ return [{ text: JSON.stringify(cleaned, null, 2), type: 'text' }];
198
+ }
199
+ normalizeResourceContent(resource, detectedMimeTypes, onBinary) {
200
+ if (!resource.text && !resource.blob) {
201
+ return [];
202
+ }
203
+ const mimeType = resource.mimeType || 'application/octet-stream';
204
+ const data = (resource.blob || resource.text);
205
+ detectedMimeTypes.push(mimeType);
206
+ if (mimeType.startsWith('image/')) {
207
+ onBinary(true);
208
+ return [{ image: data, mimeType, type: 'image' }];
209
+ }
210
+ if (resource.blob || isLikelyBase64String(data)) {
211
+ onBinary(true);
212
+ const filePart = {
213
+ data,
214
+ mimeType,
215
+ type: 'file',
216
+ };
217
+ if (resource.title && typeof resource.title === 'string') {
218
+ filePart.filename = resource.title;
219
+ }
220
+ return [filePart];
221
+ }
222
+ return [{ text: data, type: 'text' }];
223
+ }
224
+ normalizeString(value, detectedMimeTypes, onBinary) {
225
+ // Check for data URI
226
+ const dataUri = parseDataUri(value);
227
+ if (dataUri) {
228
+ detectedMimeTypes.push(dataUri.mediaType);
229
+ onBinary(true);
230
+ if (dataUri.mediaType.startsWith('image/')) {
231
+ return [{ image: dataUri.base64, mimeType: dataUri.mediaType, type: 'image' }];
232
+ }
233
+ return [{ data: dataUri.base64, mimeType: dataUri.mediaType, type: 'file' }];
234
+ }
235
+ // Check for likely base64 blob
236
+ if (isLikelyBase64String(value)) {
237
+ onBinary(true);
238
+ // Can't determine MIME type, treat as binary
239
+ return [{ data: value, mimeType: 'application/octet-stream', type: 'file' }];
240
+ }
241
+ // Regular text
242
+ return [{ text: value, type: 'text' }];
243
+ }
244
+ normalizeValue(value, detectedMimeTypes, onBinary) {
245
+ // Null/undefined
246
+ if (value === null || value === undefined) {
247
+ return [{ text: '', type: 'text' }];
248
+ }
249
+ // String input
250
+ if (typeof value === 'string') {
251
+ return this.normalizeString(value, detectedMimeTypes, onBinary);
252
+ }
253
+ // Array input (MCP-style content)
254
+ if (Array.isArray(value)) {
255
+ return this.normalizeArray(value, detectedMimeTypes, onBinary);
256
+ }
257
+ // Object input
258
+ if (typeof value === 'object') {
259
+ return this.normalizeObject(value, detectedMimeTypes, onBinary);
260
+ }
261
+ // Primitive fallback
262
+ return [{ text: String(value), type: 'text' }];
263
+ }
264
+ async persistFileIfNeeded(part, toolName, toolCallId, threshold) {
265
+ const { data, filename, mimeType } = part;
266
+ const dataString = data;
267
+ const approxBytes = base64LengthToBytes(dataString.length);
268
+ const shouldPersist = shouldAlwaysBlob(mimeType) || approxBytes >= threshold;
269
+ if (!shouldPersist || !this.blobStorage) {
270
+ return { part };
271
+ }
272
+ const blobId = await this.storeAsBlob({
273
+ data: dataString,
274
+ filename,
275
+ mimeType,
276
+ toolCallId,
277
+ toolName,
278
+ });
279
+ if (!blobId) {
280
+ return { part };
281
+ }
282
+ return {
283
+ part: {
284
+ data: `@blob:${blobId}`,
285
+ ...(filename && { filename }),
286
+ mimeType,
287
+ type: 'file',
288
+ },
289
+ resource: {
290
+ ...(filename && { filename }),
291
+ kind: inferResourceKind(mimeType),
292
+ mimeType,
293
+ size: approxBytes,
294
+ uri: `blob:${blobId}`,
295
+ },
296
+ };
297
+ }
298
+ async persistImageIfNeeded(part, toolName, toolCallId, threshold) {
299
+ const data = part.image;
300
+ const mimeType = part.mimeType || 'image/jpeg';
301
+ const approxBytes = base64LengthToBytes(data.length);
302
+ const shouldPersist = shouldAlwaysBlob(mimeType) || approxBytes >= threshold;
303
+ if (!shouldPersist || !this.blobStorage) {
304
+ return { part };
305
+ }
306
+ const blobId = await this.storeAsBlob({
307
+ data,
308
+ mimeType,
309
+ toolCallId,
310
+ toolName,
311
+ });
312
+ if (!blobId) {
313
+ return { part };
314
+ }
315
+ return {
316
+ part: {
317
+ image: `@blob:${blobId}`,
318
+ mimeType,
319
+ type: 'image',
320
+ },
321
+ resource: {
322
+ kind: 'image',
323
+ mimeType,
324
+ size: approxBytes,
325
+ uri: `blob:${blobId}`,
326
+ },
327
+ };
328
+ }
329
+ /**
330
+ * Recursively sanitize object, replacing large base64 with placeholders.
331
+ */
332
+ sanitizeDeepObject(obj) {
333
+ if (obj === null || obj === undefined)
334
+ return obj;
335
+ if (typeof obj === 'string') {
336
+ if (isLikelyBase64String(obj)) {
337
+ const approxBytes = base64LengthToBytes(obj.length);
338
+ return `[binary data omitted ~${formatByteSize(approxBytes)}]`;
339
+ }
340
+ return obj;
341
+ }
342
+ if (Array.isArray(obj)) {
343
+ return obj.map((x) => this.sanitizeDeepObject(x));
344
+ }
345
+ if (typeof obj === 'object') {
346
+ const out = {};
347
+ for (const [k, v] of Object.entries(obj)) {
348
+ out[k] = this.sanitizeDeepObject(v);
349
+ }
350
+ return out;
351
+ }
352
+ return obj;
353
+ }
354
+ async storeAsBlob(options) {
355
+ if (!this.blobStorage)
356
+ return null;
357
+ try {
358
+ const blobId = this.generateBlobId(options.toolName, options.toolCallId);
359
+ const buffer = Buffer.from(options.data, 'base64');
360
+ await this.blobStorage.store(blobId, buffer, {
361
+ contentType: options.mimeType,
362
+ originalName: options.filename,
363
+ tags: { source: 'tool', toolCallId: options.toolCallId, toolName: options.toolName },
364
+ });
365
+ return blobId;
366
+ }
367
+ catch {
368
+ return null;
369
+ }
370
+ }
371
+ truncateText(text, maxLength) {
372
+ if (text.length <= maxLength)
373
+ return text;
374
+ const { headLength, placeholder, tailLength } = DEFAULT_TEXT_TRUNCATION;
375
+ const omittedCount = text.length - headLength - tailLength;
376
+ const head = text.slice(0, headLength);
377
+ const tail = text.slice(-tailLength);
378
+ const replacedPlaceholder = placeholder.replace('{count}', String(omittedCount));
379
+ return `${head}${replacedPlaceholder}${tail}`;
380
+ }
381
+ }
382
+ /**
383
+ * Create a ToolSanitizer instance.
384
+ */
385
+ export function createToolSanitizer(options) {
386
+ return new ToolSanitizer(options);
387
+ }
388
+ /**
389
+ * Convenience function to sanitize a tool result with default options.
390
+ */
391
+ export async function sanitizeToolResult(result, options) {
392
+ const sanitizer = new ToolSanitizer({
393
+ blobStorage: options.blobStorage,
394
+ maxInlineMediaBytes: options.maxInlineMediaBytes,
395
+ maxTextLength: options.maxTextLength,
396
+ });
397
+ return sanitizer.sanitize(result, options);
398
+ }
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Stream Processor
3
+ *
4
+ * Handles granular LLM stream processing following the OpenCode pattern.
5
+ * Provides real-time event emission for streaming text, tool calls, and step tracking.
6
+ *
7
+ * Key features:
8
+ * - Delta-based text updates for responsive UI
9
+ * - Tool call lifecycle tracking (pending → running → completed/error)
10
+ * - Step-level cost and token tracking
11
+ * - Part creation and updates with unique IDs
12
+ */
13
+ import type { StepTokenUsage } from '../../../core/domain/cipher/agent-events/types.js';
14
+ import type { CompactionPart, PatchPart, RetryPart, SnapshotPart, StepFinishPart, StepStartPart, TextPart, ToolPart } from '../../../core/interfaces/cipher/message-types.js';
15
+ import type { SessionEventBus } from '../events/event-emitter.js';
16
+ /**
17
+ * Stream event types that the processor can handle.
18
+ */
19
+ export type StreamEvent = {
20
+ callId: string;
21
+ error: string;
22
+ type: 'tool-call-error';
23
+ } | {
24
+ callId: string;
25
+ input: Record<string, unknown>;
26
+ type: 'tool-call-input';
27
+ } | {
28
+ callId: string;
29
+ output: string;
30
+ type: 'tool-call-complete';
31
+ } | {
32
+ callId: string;
33
+ toolName: string;
34
+ type: 'tool-call-start';
35
+ } | {
36
+ callId: string;
37
+ type: 'tool-call-running';
38
+ } | {
39
+ cost: number;
40
+ finishReason: 'max_tokens' | 'stop' | 'tool_calls';
41
+ stepIndex: number;
42
+ tokens: StepTokenUsage;
43
+ type: 'step-finish';
44
+ } | {
45
+ delta: string;
46
+ type: 'reasoning-delta';
47
+ } | {
48
+ delta: string;
49
+ type: 'text-delta';
50
+ } | {
51
+ stepIndex: number;
52
+ type: 'step-start';
53
+ } | {
54
+ type: 'finish';
55
+ };
56
+ /**
57
+ * Context provided to the stream processor.
58
+ */
59
+ export interface ProcessorContext {
60
+ /** Event bus for emitting events */
61
+ eventBus: SessionEventBus;
62
+ /** Function to generate unique IDs */
63
+ generateId: () => string;
64
+ /** Session ID for event context */
65
+ sessionId: string;
66
+ }
67
+ /**
68
+ * Accumulated state during stream processing.
69
+ */
70
+ export interface ProcessorState {
71
+ /** Current step index */
72
+ currentStepIndex: number;
73
+ /** Parts created during processing */
74
+ parts: Array<CompactionPart | PatchPart | RetryPart | SnapshotPart | StepFinishPart | StepStartPart | TextPart | ToolPart>;
75
+ /** Accumulated text content */
76
+ textContent: string;
77
+ /** Tool parts indexed by call ID */
78
+ toolParts: Map<string, ToolPart>;
79
+ }
80
+ /**
81
+ * Stream Processor class.
82
+ *
83
+ * Processes streaming events from LLM providers and emits granular events
84
+ * for real-time UI updates. Follows the OpenCode pattern of part-based
85
+ * message construction with delta updates.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const processor = new StreamProcessor()
90
+ *
91
+ * const state = await processor.process(streamEvents, {
92
+ * eventBus: sessionEventBus,
93
+ * generateId: () => crypto.randomUUID(),
94
+ * sessionId: 'session-123',
95
+ * })
96
+ *
97
+ * console.log('Accumulated text:', state.textContent)
98
+ * console.log('Parts created:', state.parts.length)
99
+ * ```
100
+ */
101
+ export declare class StreamProcessor {
102
+ /**
103
+ * Process a stream of events and emit granular updates.
104
+ *
105
+ * @param stream - Async iterable of stream events
106
+ * @param context - Processing context with event bus and utilities
107
+ * @returns Final processor state with accumulated parts
108
+ */
109
+ process(stream: AsyncIterable<StreamEvent>, context: ProcessorContext): Promise<ProcessorState>;
110
+ /**
111
+ * Finalize text part if there's accumulated content.
112
+ */
113
+ private finalizeTextPart;
114
+ /**
115
+ * Handle a single stream event.
116
+ */
117
+ private handleEvent;
118
+ /**
119
+ * Handle step finish event.
120
+ */
121
+ private handleStepFinish;
122
+ /**
123
+ * Handle step start event.
124
+ */
125
+ private handleStepStart;
126
+ /**
127
+ * Handle text delta - accumulate and emit.
128
+ */
129
+ private handleTextDelta;
130
+ /**
131
+ * Handle tool call completion.
132
+ */
133
+ private handleToolCallComplete;
134
+ /**
135
+ * Handle tool call error.
136
+ */
137
+ private handleToolCallError;
138
+ /**
139
+ * Handle tool call input received.
140
+ */
141
+ private handleToolCallInput;
142
+ /**
143
+ * Handle tool call transition to running.
144
+ */
145
+ private handleToolCallRunning;
146
+ /**
147
+ * Handle tool call start - create pending tool part.
148
+ */
149
+ private handleToolCallStart;
150
+ }
151
+ /**
152
+ * Helper to create a unique ID generator.
153
+ */
154
+ export declare function createIdGenerator(): () => string;
155
+ /**
156
+ * Singleton stream processor instance.
157
+ */
158
+ export declare const streamProcessor: StreamProcessor;