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
@@ -29,8 +29,8 @@ export class OpenRouterLLMService {
29
29
  formatter;
30
30
  logger;
31
31
  memoryManager;
32
- promptFactory;
33
32
  sessionEventBus;
33
+ systemPromptManager;
34
34
  tokenizer;
35
35
  toolManager;
36
36
  /**
@@ -48,7 +48,7 @@ export class OpenRouterLLMService {
48
48
  */
49
49
  constructor(sessionId, config, options) {
50
50
  this.toolManager = options.toolManager;
51
- this.promptFactory = options.systemPromptManager;
51
+ this.systemPromptManager = options.systemPromptManager;
52
52
  this.memoryManager = options.memoryManager;
53
53
  this.sessionEventBus = options.sessionEventBus;
54
54
  this.logger = options.logger ?? new NoOpLogger();
@@ -97,23 +97,22 @@ export class OpenRouterLLMService {
97
97
  * 3. Returning final response when no more tool calls
98
98
  *
99
99
  * @param textInput - User input text
100
- * @param sessionId - Session ID for tracking the conversation
101
100
  * @param options - Execution options
102
101
  * @param options.signal - Optional abort signal for cancellation
103
102
  * @param options.imageData - Optional image data
104
103
  * @param options.fileData - Optional file data
105
104
  * @param options.stream - Whether to stream response (not implemented yet)
106
105
  * @param options.executionContext - Optional execution context (for JSON input mode, etc.)
107
- * @param options.mode - Optional mode for system prompt ('json-input' enables autonomous mode)
106
+ * @param options.taskId - Task ID for billing tracking
108
107
  * @returns Final assistant response
109
108
  */
110
- async completeTask(textInput, sessionId, options) {
109
+ async completeTask(textInput, options) {
111
110
  // Extract options with defaults
112
- const { executionContext, fileData, imageData, mode, signal } = options ?? {};
111
+ const { executionContext, fileData, imageData, signal } = options ?? {};
113
112
  // Add user message to context
114
113
  await this.contextManager.addUserMessage(textInput, imageData, fileData);
115
- // Get all available tools
116
- const toolSet = this.toolManager.getAllTools();
114
+ // Get filtered tools based on command type (e.g., only read-only tools for 'query')
115
+ const toolSet = this.toolManager.getToolsForCommand(executionContext?.commandType);
117
116
  const tools = Object.entries(toolSet).map(([name, schema]) => ({
118
117
  function: {
119
118
  description: schema.description ?? '',
@@ -131,7 +130,7 @@ export class OpenRouterLLMService {
131
130
  }
132
131
  try {
133
132
  // eslint-disable-next-line no-await-in-loop -- Sequential iterations required for agentic loop
134
- const result = await this.executeAgenticIteration(iterationCount, tools, executionContext, mode);
133
+ const result = await this.executeAgenticIteration(iterationCount, tools, executionContext);
135
134
  if (result !== null) {
136
135
  return result;
137
136
  }
@@ -211,25 +210,24 @@ export class OpenRouterLLMService {
211
210
  * @param iterationCount - Current iteration number
212
211
  * @param tools - Available tools for this iteration
213
212
  * @param executionContext - Optional execution context
214
- * @param mode - Optional mode for system prompt
215
213
  * @returns Final response string if complete, null if more iterations needed
216
214
  */
217
- async executeAgenticIteration(iterationCount, tools, executionContext, mode) {
218
- // Build system prompt using SimplePromptFactory (before compression for correct token accounting)
219
- const availableTools = this.toolManager.getToolNames();
215
+ async executeAgenticIteration(iterationCount, tools, executionContext) {
216
+ // Build system prompt using SystemPromptManager (before compression for correct token accounting)
217
+ // Use filtered tool names based on command type (e.g., only read-only tools for 'query')
218
+ const availableTools = this.toolManager.getToolNamesForCommand(executionContext?.commandType);
220
219
  const markersSet = this.toolManager.getAvailableMarkers();
221
- // Convert Set<string> to Record<string, string> for SimplePromptFactory
220
+ // Convert Set<string> to Record<string, string> for SystemPromptManager
222
221
  const availableMarkers = {};
223
222
  for (const marker of markersSet) {
224
223
  availableMarkers[marker] = marker;
225
224
  }
226
- const systemPrompt = await this.promptFactory.buildSystemPrompt({
225
+ const systemPrompt = await this.systemPromptManager.build({
227
226
  availableMarkers,
228
227
  availableTools,
229
228
  commandType: executionContext?.commandType,
230
229
  conversationMetadata: executionContext?.conversationMetadata,
231
230
  memoryManager: this.memoryManager,
232
- mode,
233
231
  });
234
232
  // Verbose debug: Show complete system prompt
235
233
  if (this.config.verbose) {
@@ -31,6 +31,7 @@ export interface RetryPolicy {
31
31
  * - 2x exponential backoff
32
32
  * - 25% jitter
33
33
  * - Retries on common transient errors (429, 500, 502, 503, 504)
34
+ * - Retries on empty/incomplete LLM responses (transient API issues)
34
35
  */
35
36
  export declare const DEFAULT_RETRY_POLICY: RetryPolicy;
36
37
  /**
@@ -12,6 +12,7 @@
12
12
  * - 2x exponential backoff
13
13
  * - 25% jitter
14
14
  * - Retries on common transient errors (429, 500, 502, 503, 504)
15
+ * - Retries on empty/incomplete LLM responses (transient API issues)
15
16
  */
16
17
  export const DEFAULT_RETRY_POLICY = {
17
18
  backoffMultiplier: 2,
@@ -29,6 +30,11 @@ export const DEFAULT_RETRY_POLICY = {
29
30
  'capacity',
30
31
  'timeout',
31
32
  'temporarily unavailable',
33
+ // LLM empty/incomplete response errors (transient API issues)
34
+ 'neither content nor tool calls',
35
+ 'no content',
36
+ 'empty response',
37
+ 'no messages',
32
38
  ],
33
39
  retryableStatusCodes: [429, 500, 502, 503, 504],
34
40
  };
@@ -53,6 +59,11 @@ export const AGGRESSIVE_RETRY_POLICY = {
53
59
  'capacity',
54
60
  'timeout',
55
61
  'temporarily unavailable',
62
+ // LLM empty/incomplete response errors (transient API issues)
63
+ 'neither content nor tool calls',
64
+ 'no content',
65
+ 'empty response',
66
+ 'no messages',
56
67
  ],
57
68
  retryableStatusCodes: [429, 500, 502, 503, 504],
58
69
  };
@@ -19,10 +19,11 @@ async function sleep(ms, signal) {
19
19
  return;
20
20
  }
21
21
  const timeout = setTimeout(resolve, ms);
22
- signal?.addEventListener('abort', () => {
22
+ const abortHandler = () => {
23
23
  clearTimeout(timeout);
24
24
  reject(new Error('Retry aborted'));
25
- });
25
+ };
26
+ signal?.addEventListener('abort', abortHandler, { once: true });
26
27
  });
27
28
  }
28
29
  /**
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Base64 detection and parsing utilities for tool output sanitization.
3
+ *
4
+ * These utilities help identify and process base64-encoded content in tool outputs,
5
+ * enabling the sanitization pipeline to detect and handle binary data appropriately.
6
+ *
7
+ * Based on dexto's isLikelyBase64String() and parseDataUri() patterns.
8
+ */
9
+ /**
10
+ * Check if a string is likely a Base64-encoded binary blob.
11
+ *
12
+ * Uses heuristics to detect base64 content:
13
+ * 1. Length threshold (default 512 chars)
14
+ * 2. Character set matching (base64 alphabet only)
15
+ * 3. Low non-base64 character ratio
16
+ *
17
+ * This is intentionally conservative to avoid false positives on
18
+ * normal text that happens to look like base64.
19
+ *
20
+ * @param value - The string to check
21
+ * @param minLength - Minimum length threshold (default: 512)
22
+ * @returns true if the string is likely base64-encoded binary data
23
+ */
24
+ export declare function isLikelyBase64String(value: string, minLength?: number): boolean;
25
+ /**
26
+ * Result of parsing a data URI.
27
+ */
28
+ export interface ParsedDataUri {
29
+ /** The base64-encoded content */
30
+ base64: string;
31
+ /** The MIME type from the data URI */
32
+ mediaType: string;
33
+ }
34
+ /**
35
+ * Parse a data URI and extract media type and base64 content.
36
+ *
37
+ * Supports the standard data URI format:
38
+ * data:[<mediatype>][;base64],<data>
39
+ *
40
+ * @param value - The data URI string to parse
41
+ * @returns Parsed components or null if not a valid base64 data URI
42
+ */
43
+ export declare function parseDataUri(value: string): null | ParsedDataUri;
44
+ /**
45
+ * Estimate byte length from base64 string length.
46
+ *
47
+ * Base64 encoding uses 4 characters to represent 3 bytes.
48
+ * This approximation is useful for size threshold checks.
49
+ *
50
+ * @param charLength - Length of the base64 string
51
+ * @returns Approximate byte count of the decoded data
52
+ */
53
+ export declare function base64LengthToBytes(charLength: number): number;
54
+ /**
55
+ * Format byte size as human-readable string.
56
+ *
57
+ * @param bytes - Number of bytes
58
+ * @returns Formatted string like "1.5 KB" or "2.3 MB"
59
+ */
60
+ export declare function formatByteSize(bytes: number): string;
61
+ /**
62
+ * Check if a value is a valid base64 string (strict check).
63
+ *
64
+ * Unlike isLikelyBase64String which uses heuristics, this performs
65
+ * a stricter validation that the string is valid base64 format.
66
+ *
67
+ * @param value - The string to validate
68
+ * @returns true if valid base64 format
69
+ */
70
+ export declare function isValidBase64(value: string): boolean;
71
+ /**
72
+ * Safely decode base64 string to Buffer.
73
+ *
74
+ * @param base64 - Base64 encoded string
75
+ * @returns Decoded Buffer or null if invalid
76
+ */
77
+ export declare function safeBase64Decode(base64: string): Buffer | null;
78
+ /**
79
+ * Encode data to base64 string.
80
+ *
81
+ * @param data - Data to encode (Buffer, Uint8Array, or string)
82
+ * @returns Base64 encoded string
83
+ */
84
+ export declare function encodeToBase64(data: Buffer | string | Uint8Array): string;
85
+ /**
86
+ * Create a data URI from base64 content and MIME type.
87
+ *
88
+ * @param base64 - Base64 encoded content
89
+ * @param mimeType - MIME type of the content
90
+ * @returns Data URI string
91
+ */
92
+ export declare function createDataUri(base64: string, mimeType: string): string;
93
+ /**
94
+ * Extract base64 content from a data URI or return the original if not a data URI.
95
+ *
96
+ * @param value - Data URI or raw base64 string
97
+ * @returns Object with base64 content and optional MIME type
98
+ */
99
+ export declare function extractBase64Content(value: string): {
100
+ base64: string;
101
+ mimeType?: string;
102
+ };
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Base64 detection and parsing utilities for tool output sanitization.
3
+ *
4
+ * These utilities help identify and process base64-encoded content in tool outputs,
5
+ * enabling the sanitization pipeline to detect and handle binary data appropriately.
6
+ *
7
+ * Based on dexto's isLikelyBase64String() and parseDataUri() patterns.
8
+ */
9
+ /**
10
+ * Default minimum length for base64 heuristic detection.
11
+ * Strings shorter than this are unlikely to be meaningful base64 blobs.
12
+ */
13
+ const MIN_BASE64_HEURISTIC_LENGTH = 512;
14
+ /**
15
+ * Regular expression for valid base64 characters.
16
+ * Includes standard base64 alphabet plus padding and optional whitespace.
17
+ */
18
+ const BASE64_CHARSET_REGEX = /^[A-Za-z0-9+/=\r\n\s]+$/;
19
+ /**
20
+ * Check if a string is likely a Base64-encoded binary blob.
21
+ *
22
+ * Uses heuristics to detect base64 content:
23
+ * 1. Length threshold (default 512 chars)
24
+ * 2. Character set matching (base64 alphabet only)
25
+ * 3. Low non-base64 character ratio
26
+ *
27
+ * This is intentionally conservative to avoid false positives on
28
+ * normal text that happens to look like base64.
29
+ *
30
+ * @param value - The string to check
31
+ * @param minLength - Minimum length threshold (default: 512)
32
+ * @returns true if the string is likely base64-encoded binary data
33
+ */
34
+ export function isLikelyBase64String(value, minLength = MIN_BASE64_HEURISTIC_LENGTH) {
35
+ if (!value || typeof value !== 'string')
36
+ return false;
37
+ if (value.length < minLength)
38
+ return false;
39
+ // Fast-path for data URIs which explicitly declare base64
40
+ if (value.startsWith('data:') && value.includes(';base64,'))
41
+ return true;
42
+ // Check character set - must be valid base64 characters
43
+ if (!BASE64_CHARSET_REGEX.test(value))
44
+ return false;
45
+ // Calculate non-base64 character ratio (whitespace excluded)
46
+ const strippedValue = value.replaceAll(/[\r\n\s]/g, '');
47
+ const nonBase64Count = (strippedValue.match(/[^A-Za-z0-9+/=]/g) || []).length;
48
+ const nonBase64Ratio = nonBase64Count / strippedValue.length;
49
+ // Very low ratio of non-base64 chars suggests actual base64
50
+ return nonBase64Ratio < 0.01;
51
+ }
52
+ /**
53
+ * Parse a data URI and extract media type and base64 content.
54
+ *
55
+ * Supports the standard data URI format:
56
+ * data:[<mediatype>][;base64],<data>
57
+ *
58
+ * @param value - The data URI string to parse
59
+ * @returns Parsed components or null if not a valid base64 data URI
60
+ */
61
+ export function parseDataUri(value) {
62
+ if (!value || typeof value !== 'string')
63
+ return null;
64
+ if (!value.startsWith('data:'))
65
+ return null;
66
+ const commaIndex = value.indexOf(',');
67
+ if (commaIndex === -1)
68
+ return null;
69
+ const meta = value.slice(5, commaIndex); // Skip 'data:'
70
+ // Must be base64 encoded
71
+ if (!/;base64$/i.test(meta))
72
+ return null;
73
+ const mediaType = meta.replace(/;base64$/i, '') || 'application/octet-stream';
74
+ const base64 = value.slice(commaIndex + 1);
75
+ return { base64, mediaType };
76
+ }
77
+ /**
78
+ * Estimate byte length from base64 string length.
79
+ *
80
+ * Base64 encoding uses 4 characters to represent 3 bytes.
81
+ * This approximation is useful for size threshold checks.
82
+ *
83
+ * @param charLength - Length of the base64 string
84
+ * @returns Approximate byte count of the decoded data
85
+ */
86
+ export function base64LengthToBytes(charLength) {
87
+ // Remove padding chars from calculation for accuracy
88
+ const paddingChars = charLength > 0 ? (charLength % 4 === 0 ? 0 : 4 - (charLength % 4)) : 0;
89
+ return Math.floor(((charLength - paddingChars) * 3) / 4);
90
+ }
91
+ /**
92
+ * Format byte size as human-readable string.
93
+ *
94
+ * @param bytes - Number of bytes
95
+ * @returns Formatted string like "1.5 KB" or "2.3 MB"
96
+ */
97
+ export function formatByteSize(bytes) {
98
+ if (bytes === 0)
99
+ return '0 B';
100
+ const k = 1024;
101
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
102
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
103
+ return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
104
+ }
105
+ /**
106
+ * Check if a value is a valid base64 string (strict check).
107
+ *
108
+ * Unlike isLikelyBase64String which uses heuristics, this performs
109
+ * a stricter validation that the string is valid base64 format.
110
+ *
111
+ * @param value - The string to validate
112
+ * @returns true if valid base64 format
113
+ */
114
+ export function isValidBase64(value) {
115
+ if (!value || typeof value !== 'string')
116
+ return false;
117
+ // Remove whitespace
118
+ const cleaned = value.replaceAll(/[\r\n\s]/g, '');
119
+ // Check length is multiple of 4
120
+ if (cleaned.length % 4 !== 0)
121
+ return false;
122
+ // Check character set
123
+ return /^[A-Za-z0-9+/]*={0,2}$/.test(cleaned);
124
+ }
125
+ /**
126
+ * Safely decode base64 string to Buffer.
127
+ *
128
+ * @param base64 - Base64 encoded string
129
+ * @returns Decoded Buffer or null if invalid
130
+ */
131
+ export function safeBase64Decode(base64) {
132
+ try {
133
+ // Remove whitespace
134
+ const cleaned = base64.replaceAll(/[\r\n\s]/g, '');
135
+ // Validate before decoding
136
+ if (!isValidBase64(cleaned))
137
+ return null;
138
+ return Buffer.from(cleaned, 'base64');
139
+ }
140
+ catch {
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Encode data to base64 string.
146
+ *
147
+ * @param data - Data to encode (Buffer, Uint8Array, or string)
148
+ * @returns Base64 encoded string
149
+ */
150
+ export function encodeToBase64(data) {
151
+ if (typeof data === 'string') {
152
+ return Buffer.from(data, 'utf8').toString('base64');
153
+ }
154
+ if (Buffer.isBuffer(data)) {
155
+ return data.toString('base64');
156
+ }
157
+ // At this point, data must be Uint8Array
158
+ return Buffer.from(data).toString('base64');
159
+ }
160
+ /**
161
+ * Create a data URI from base64 content and MIME type.
162
+ *
163
+ * @param base64 - Base64 encoded content
164
+ * @param mimeType - MIME type of the content
165
+ * @returns Data URI string
166
+ */
167
+ export function createDataUri(base64, mimeType) {
168
+ return `data:${mimeType};base64,${base64}`;
169
+ }
170
+ /**
171
+ * Extract base64 content from a data URI or return the original if not a data URI.
172
+ *
173
+ * @param value - Data URI or raw base64 string
174
+ * @returns Object with base64 content and optional MIME type
175
+ */
176
+ export function extractBase64Content(value) {
177
+ const parsed = parseDataUri(value);
178
+ if (parsed) {
179
+ return { base64: parsed.base64, mimeType: parsed.mediaType };
180
+ }
181
+ return { base64: value };
182
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tool output sanitization module.
3
+ *
4
+ * Provides utilities for sanitizing tool outputs:
5
+ * - Base64 detection and parsing
6
+ * - Media persistence to blob storage
7
+ * - Text truncation
8
+ * - Consistent tool result formatting
9
+ */
10
+ export { base64LengthToBytes, createDataUri, encodeToBase64, extractBase64Content, formatByteSize, isLikelyBase64String, isValidBase64, parseDataUri, safeBase64Decode, } from './base64-utils.js';
11
+ export type { ParsedDataUri } from './base64-utils.js';
12
+ export { createToolSanitizer, sanitizeToolResult, ToolSanitizer, } from './tool-sanitizer.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tool output sanitization module.
3
+ *
4
+ * Provides utilities for sanitizing tool outputs:
5
+ * - Base64 detection and parsing
6
+ * - Media persistence to blob storage
7
+ * - Text truncation
8
+ * - Consistent tool result formatting
9
+ */
10
+ // Base64 utilities
11
+ export { base64LengthToBytes, createDataUri, encodeToBase64, extractBase64Content, formatByteSize, isLikelyBase64String, isValidBase64, parseDataUri, safeBase64Decode, } from './base64-utils.js';
12
+ // Tool sanitizer
13
+ export { createToolSanitizer, sanitizeToolResult, ToolSanitizer, } from './tool-sanitizer.js';
@@ -0,0 +1,74 @@
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 type { IBlobStorage } from '../../../../core/interfaces/cipher/i-blob-storage.js';
11
+ import type { MessagePart } from '../../../../core/interfaces/cipher/message-types.js';
12
+ import type { NormalizedToolOutput, PersistMediaResult, SanitizedToolResult, SanitizeToolResultOptions } from '../../../../core/interfaces/cipher/sanitization-types.js';
13
+ /**
14
+ * Tool output sanitizer.
15
+ *
16
+ * Provides a pipeline for sanitizing tool outputs:
17
+ * - Normalizes arbitrary output formats to MessagePart[]
18
+ * - Stores large media in blob storage with lazy references
19
+ * - Applies text truncation and cleanup
20
+ */
21
+ export declare class ToolSanitizer {
22
+ private readonly blobStorage?;
23
+ private readonly maxInlineMediaBytes;
24
+ private readonly maxTextLength;
25
+ constructor(options?: {
26
+ blobStorage?: IBlobStorage;
27
+ maxInlineMediaBytes?: number;
28
+ maxTextLength?: number;
29
+ });
30
+ /**
31
+ * Step 3: Apply final sanitization (truncation, etc.).
32
+ */
33
+ applySanitization(parts: MessagePart[], maxTextLength?: number): MessagePart[];
34
+ /**
35
+ * Step 1: Normalize arbitrary tool output to MessagePart array.
36
+ */
37
+ normalize(result: unknown): NormalizedToolOutput;
38
+ /**
39
+ * Step 2: Persist large media to blob storage.
40
+ */
41
+ persistMedia(parts: MessagePart[], toolName: string, toolCallId: string, maxInlineBytes?: number): Promise<PersistMediaResult>;
42
+ /**
43
+ * Sanitize a tool result through the full pipeline.
44
+ */
45
+ sanitize(result: unknown, options: SanitizeToolResultOptions): Promise<SanitizedToolResult>;
46
+ private extractData;
47
+ private generateBlobId;
48
+ private normalizeArray;
49
+ private normalizeArrayItem;
50
+ private normalizeObject;
51
+ private normalizeResourceContent;
52
+ private normalizeString;
53
+ private normalizeValue;
54
+ private persistFileIfNeeded;
55
+ private persistImageIfNeeded;
56
+ /**
57
+ * Recursively sanitize object, replacing large base64 with placeholders.
58
+ */
59
+ private sanitizeDeepObject;
60
+ private storeAsBlob;
61
+ private truncateText;
62
+ }
63
+ /**
64
+ * Create a ToolSanitizer instance.
65
+ */
66
+ export declare function createToolSanitizer(options?: {
67
+ blobStorage?: IBlobStorage;
68
+ maxInlineMediaBytes?: number;
69
+ maxTextLength?: number;
70
+ }): ToolSanitizer;
71
+ /**
72
+ * Convenience function to sanitize a tool result with default options.
73
+ */
74
+ export declare function sanitizeToolResult(result: unknown, options: SanitizeToolResultOptions): Promise<SanitizedToolResult>;