@dexto/core 1.3.0 → 1.4.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 (479) hide show
  1. package/README.md +17 -9
  2. package/dist/agent/DextoAgent.cjs +548 -207
  3. package/dist/agent/DextoAgent.d.ts +156 -33
  4. package/dist/agent/DextoAgent.d.ts.map +1 -1
  5. package/dist/agent/DextoAgent.js +545 -204
  6. package/dist/agent/agentCard.js +1 -1
  7. package/dist/agent/error-codes.cjs +1 -0
  8. package/dist/agent/error-codes.d.ts +2 -1
  9. package/dist/agent/error-codes.d.ts.map +1 -1
  10. package/dist/agent/error-codes.js +2 -1
  11. package/dist/agent/errors.cjs +13 -0
  12. package/dist/agent/errors.d.ts +4 -0
  13. package/dist/agent/errors.d.ts.map +1 -1
  14. package/dist/agent/errors.js +14 -1
  15. package/dist/agent/index.d.ts +1 -1
  16. package/dist/agent/index.d.ts.map +1 -1
  17. package/dist/agent/index.js +1 -1
  18. package/dist/agent/schemas.cjs +3 -0
  19. package/dist/agent/schemas.d.ts +92 -55
  20. package/dist/agent/schemas.d.ts.map +1 -1
  21. package/dist/agent/schemas.js +6 -2
  22. package/dist/agent/state-manager.cjs +5 -5
  23. package/dist/agent/state-manager.d.ts +4 -4
  24. package/dist/agent/state-manager.js +6 -6
  25. package/dist/agent/types.d.ts +24 -10
  26. package/dist/agent/types.d.ts.map +1 -1
  27. package/dist/approval/error-codes.js +1 -1
  28. package/dist/approval/errors.js +1 -1
  29. package/dist/approval/factory.js +1 -1
  30. package/dist/approval/index.js +1 -1
  31. package/dist/approval/manager.cjs +69 -3
  32. package/dist/approval/manager.d.ts +41 -3
  33. package/dist/approval/manager.d.ts.map +1 -1
  34. package/dist/approval/manager.js +70 -4
  35. package/dist/approval/schemas.cjs +18 -4
  36. package/dist/approval/schemas.d.ts +106 -32
  37. package/dist/approval/schemas.d.ts.map +1 -1
  38. package/dist/approval/schemas.js +19 -5
  39. package/dist/approval/types.d.ts +6 -0
  40. package/dist/approval/types.d.ts.map +1 -1
  41. package/dist/approval/types.js +1 -1
  42. package/dist/{chunk-C6A6W6XS.js → chunk-PTJYTZNU.js} +44 -1
  43. package/dist/{llm/tokenizer/default.cjs → context/compression/overflow.cjs} +20 -18
  44. package/dist/context/compression/overflow.d.ts +33 -0
  45. package/dist/context/compression/overflow.d.ts.map +1 -0
  46. package/dist/context/compression/overflow.js +19 -0
  47. package/dist/context/compression/reactive-overflow.cjs +201 -0
  48. package/dist/context/compression/reactive-overflow.d.ts +81 -0
  49. package/dist/context/compression/reactive-overflow.d.ts.map +1 -0
  50. package/dist/context/compression/reactive-overflow.js +178 -0
  51. package/dist/context/compression/types.d.ts +9 -7
  52. package/dist/context/compression/types.d.ts.map +1 -1
  53. package/dist/context/error-codes.cjs +3 -0
  54. package/dist/context/error-codes.d.ts +4 -1
  55. package/dist/context/error-codes.d.ts.map +1 -1
  56. package/dist/context/error-codes.js +4 -1
  57. package/dist/context/errors.cjs +28 -0
  58. package/dist/context/errors.d.ts +7 -0
  59. package/dist/context/errors.d.ts.map +1 -1
  60. package/dist/context/errors.js +29 -1
  61. package/dist/context/index.js +1 -1
  62. package/dist/context/manager.cjs +280 -323
  63. package/dist/context/manager.d.ts +65 -111
  64. package/dist/context/manager.d.ts.map +1 -1
  65. package/dist/context/manager.js +280 -328
  66. package/dist/context/media-helpers.js +1 -1
  67. package/dist/context/types.cjs +49 -0
  68. package/dist/context/types.d.ts +181 -72
  69. package/dist/context/types.d.ts.map +1 -1
  70. package/dist/context/types.js +35 -0
  71. package/dist/context/utils.cjs +266 -283
  72. package/dist/context/utils.d.ts +32 -18
  73. package/dist/context/utils.d.ts.map +1 -1
  74. package/dist/context/utils.js +266 -283
  75. package/dist/errors/DextoBaseError.js +1 -1
  76. package/dist/errors/DextoRuntimeError.js +1 -1
  77. package/dist/errors/DextoValidationError.js +1 -1
  78. package/dist/errors/index.js +1 -1
  79. package/dist/errors/result-bridge.js +1 -1
  80. package/dist/errors/types.js +1 -1
  81. package/dist/events/index.cjs +18 -1
  82. package/dist/events/index.d.ts +149 -12
  83. package/dist/events/index.d.ts.map +1 -1
  84. package/dist/events/index.js +19 -2
  85. package/dist/filesystem/error-codes.js +1 -1
  86. package/dist/filesystem/errors.js +1 -1
  87. package/dist/filesystem/filesystem-service.js +1 -1
  88. package/dist/filesystem/index.js +1 -1
  89. package/dist/filesystem/path-validator.js +1 -1
  90. package/dist/index.browser.cjs +23 -8
  91. package/dist/index.browser.d.ts +4 -3
  92. package/dist/index.browser.d.ts.map +1 -1
  93. package/dist/index.browser.js +20 -3
  94. package/dist/index.js +1 -1
  95. package/dist/llm/error-codes.cjs +0 -1
  96. package/dist/llm/error-codes.d.ts +0 -1
  97. package/dist/llm/error-codes.d.ts.map +1 -1
  98. package/dist/llm/error-codes.js +1 -2
  99. package/dist/llm/errors.cjs +10 -10
  100. package/dist/llm/errors.d.ts +5 -6
  101. package/dist/llm/errors.d.ts.map +1 -1
  102. package/dist/llm/errors.js +12 -12
  103. package/dist/llm/executor/stream-processor.cjs +367 -0
  104. package/dist/llm/executor/stream-processor.d.ts +55 -0
  105. package/dist/llm/executor/stream-processor.d.ts.map +1 -0
  106. package/dist/llm/executor/stream-processor.js +344 -0
  107. package/dist/llm/executor/tool-output-truncator.cjs +75 -0
  108. package/dist/llm/executor/tool-output-truncator.d.ts +27 -0
  109. package/dist/llm/executor/tool-output-truncator.d.ts.map +1 -0
  110. package/dist/llm/executor/tool-output-truncator.js +48 -0
  111. package/dist/llm/executor/turn-executor.cjs +753 -0
  112. package/dist/llm/executor/turn-executor.d.ts +166 -0
  113. package/dist/llm/executor/turn-executor.d.ts.map +1 -0
  114. package/dist/llm/executor/turn-executor.js +684 -0
  115. package/dist/llm/executor/types.d.ts +27 -0
  116. package/dist/llm/executor/types.d.ts.map +1 -0
  117. package/dist/llm/formatters/vercel.cjs +20 -186
  118. package/dist/llm/formatters/vercel.d.ts +2 -14
  119. package/dist/llm/formatters/vercel.d.ts.map +1 -1
  120. package/dist/llm/formatters/vercel.js +19 -185
  121. package/dist/llm/registry.cjs +36 -45
  122. package/dist/llm/registry.d.ts +53 -39
  123. package/dist/llm/registry.d.ts.map +1 -1
  124. package/dist/llm/registry.js +34 -42
  125. package/dist/llm/resolver.cjs +1 -31
  126. package/dist/llm/resolver.d.ts.map +1 -1
  127. package/dist/llm/resolver.js +2 -34
  128. package/dist/llm/schemas.cjs +2 -17
  129. package/dist/llm/schemas.d.ts +10 -23
  130. package/dist/llm/schemas.d.ts.map +1 -1
  131. package/dist/llm/schemas.js +5 -22
  132. package/dist/llm/services/factory.cjs +3 -92
  133. package/dist/llm/services/factory.d.ts +14 -4
  134. package/dist/llm/services/factory.d.ts.map +1 -1
  135. package/dist/llm/services/factory.js +4 -83
  136. package/dist/llm/services/test-utils.integration.cjs +6 -8
  137. package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
  138. package/dist/llm/services/test-utils.integration.js +7 -9
  139. package/dist/llm/services/types.d.ts +1 -28
  140. package/dist/llm/services/types.d.ts.map +1 -1
  141. package/dist/llm/services/vercel.cjs +54 -468
  142. package/dist/llm/services/vercel.d.ts +38 -21
  143. package/dist/llm/services/vercel.d.ts.map +1 -1
  144. package/dist/llm/services/vercel.js +56 -475
  145. package/dist/llm/types.cjs +0 -3
  146. package/dist/llm/types.d.ts +8 -8
  147. package/dist/llm/types.d.ts.map +1 -1
  148. package/dist/llm/types.js +1 -3
  149. package/dist/llm/validation.js +1 -1
  150. package/dist/logger/browser.js +1 -1
  151. package/dist/logger/factory.js +1 -1
  152. package/dist/logger/index.js +1 -1
  153. package/dist/logger/logger.js +1 -1
  154. package/dist/logger/v2/dexto-logger.cjs +34 -6
  155. package/dist/logger/v2/dexto-logger.d.ts +20 -2
  156. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  157. package/dist/logger/v2/dexto-logger.js +35 -7
  158. package/dist/logger/v2/error-codes.js +1 -1
  159. package/dist/logger/v2/errors.js +1 -1
  160. package/dist/logger/v2/schemas.js +1 -1
  161. package/dist/logger/v2/test-utils.cjs +70 -0
  162. package/dist/logger/v2/test-utils.d.ts +17 -0
  163. package/dist/logger/v2/test-utils.d.ts.map +1 -0
  164. package/dist/logger/v2/test-utils.js +46 -0
  165. package/dist/logger/v2/transport-factory.js +1 -1
  166. package/dist/logger/v2/transports/console-transport.js +1 -1
  167. package/dist/logger/v2/transports/file-transport.cjs +6 -0
  168. package/dist/logger/v2/transports/file-transport.d.ts +4 -0
  169. package/dist/logger/v2/transports/file-transport.d.ts.map +1 -1
  170. package/dist/logger/v2/transports/file-transport.js +7 -1
  171. package/dist/logger/v2/types.cjs +1 -0
  172. package/dist/logger/v2/types.d.ts +18 -2
  173. package/dist/logger/v2/types.d.ts.map +1 -1
  174. package/dist/logger/v2/types.js +2 -1
  175. package/dist/mcp/error-codes.cjs +1 -0
  176. package/dist/mcp/error-codes.d.ts +1 -0
  177. package/dist/mcp/error-codes.d.ts.map +1 -1
  178. package/dist/mcp/error-codes.js +2 -1
  179. package/dist/mcp/errors.cjs +13 -0
  180. package/dist/mcp/errors.d.ts +7 -0
  181. package/dist/mcp/errors.d.ts.map +1 -1
  182. package/dist/mcp/errors.js +14 -1
  183. package/dist/mcp/manager.cjs +4 -0
  184. package/dist/mcp/manager.d.ts.map +1 -1
  185. package/dist/mcp/manager.js +5 -1
  186. package/dist/mcp/mcp-client.js +1 -1
  187. package/dist/mcp/resolver.js +1 -1
  188. package/dist/mcp/schemas.cjs +6 -0
  189. package/dist/mcp/schemas.d.ts +52 -0
  190. package/dist/mcp/schemas.d.ts.map +1 -1
  191. package/dist/mcp/schemas.js +6 -1
  192. package/dist/memory/error-codes.js +1 -1
  193. package/dist/memory/errors.js +1 -1
  194. package/dist/memory/index.js +1 -1
  195. package/dist/memory/manager.js +1 -1
  196. package/dist/memory/schemas.d.ts +2 -2
  197. package/dist/memory/schemas.js +1 -1
  198. package/dist/plugins/builtins/content-policy.js +1 -1
  199. package/dist/plugins/builtins/response-sanitizer.js +1 -1
  200. package/dist/plugins/error-codes.js +1 -1
  201. package/dist/plugins/index.js +1 -1
  202. package/dist/plugins/loader.js +1 -1
  203. package/dist/plugins/manager.js +1 -1
  204. package/dist/plugins/registrations/builtins.js +1 -1
  205. package/dist/plugins/schemas.d.ts +3 -3
  206. package/dist/plugins/schemas.js +1 -1
  207. package/dist/plugins/types.d.ts +0 -1
  208. package/dist/plugins/types.d.ts.map +1 -1
  209. package/dist/process/command-validator.js +1 -1
  210. package/dist/process/error-codes.js +1 -1
  211. package/dist/process/errors.js +1 -1
  212. package/dist/process/index.js +1 -1
  213. package/dist/process/process-service.cjs +78 -26
  214. package/dist/process/process-service.d.ts +6 -1
  215. package/dist/process/process-service.d.ts.map +1 -1
  216. package/dist/process/process-service.js +79 -27
  217. package/dist/process/types.d.ts +2 -2
  218. package/dist/process/types.d.ts.map +1 -1
  219. package/dist/prompts/error-codes.cjs +1 -0
  220. package/dist/prompts/error-codes.d.ts +2 -1
  221. package/dist/prompts/error-codes.d.ts.map +1 -1
  222. package/dist/prompts/error-codes.js +2 -1
  223. package/dist/prompts/errors.cjs +15 -0
  224. package/dist/prompts/errors.d.ts +4 -0
  225. package/dist/prompts/errors.d.ts.map +1 -1
  226. package/dist/prompts/errors.js +16 -1
  227. package/dist/prompts/index.js +1 -1
  228. package/dist/prompts/name-validation.js +1 -1
  229. package/dist/prompts/prompt-manager.cjs +13 -2
  230. package/dist/prompts/prompt-manager.d.ts +7 -0
  231. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  232. package/dist/prompts/prompt-manager.js +14 -3
  233. package/dist/prompts/providers/config-prompt-provider.cjs +12 -3
  234. package/dist/prompts/providers/config-prompt-provider.d.ts +2 -1
  235. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  236. package/dist/prompts/providers/config-prompt-provider.js +13 -4
  237. package/dist/prompts/providers/custom-prompt-provider.js +1 -1
  238. package/dist/prompts/providers/mcp-prompt-provider.js +1 -1
  239. package/dist/prompts/schemas.d.ts +12 -0
  240. package/dist/prompts/schemas.d.ts.map +1 -1
  241. package/dist/prompts/schemas.js +1 -1
  242. package/dist/prompts/types.d.ts +2 -0
  243. package/dist/prompts/types.d.ts.map +1 -1
  244. package/dist/prompts/utils.js +1 -1
  245. package/dist/resources/error-codes.js +1 -1
  246. package/dist/resources/errors.js +1 -1
  247. package/dist/resources/handlers/blob-handler.js +1 -1
  248. package/dist/resources/handlers/factory.js +1 -1
  249. package/dist/resources/handlers/filesystem-handler.js +1 -1
  250. package/dist/resources/index.js +1 -1
  251. package/dist/resources/internal-provider.js +1 -1
  252. package/dist/resources/manager.js +1 -1
  253. package/dist/resources/reference-parser.js +1 -1
  254. package/dist/resources/schemas.js +1 -1
  255. package/dist/search/index.js +1 -1
  256. package/dist/search/search-service.js +1 -1
  257. package/dist/session/chat-session.cjs +149 -51
  258. package/dist/session/chat-session.d.ts +69 -29
  259. package/dist/session/chat-session.d.ts.map +1 -1
  260. package/dist/session/chat-session.js +150 -52
  261. package/dist/session/error-codes.js +1 -1
  262. package/dist/session/errors.js +1 -1
  263. package/dist/session/history/database.cjs +134 -21
  264. package/dist/session/history/database.d.ts +37 -8
  265. package/dist/session/history/database.d.ts.map +1 -1
  266. package/dist/session/history/database.js +135 -22
  267. package/dist/session/history/factory.js +1 -1
  268. package/dist/session/history/memory.cjs +18 -0
  269. package/dist/session/history/memory.d.ts +8 -0
  270. package/dist/session/history/memory.d.ts.map +1 -1
  271. package/dist/session/history/memory.js +19 -1
  272. package/dist/session/history/types.d.ts +13 -1
  273. package/dist/session/history/types.d.ts.map +1 -1
  274. package/dist/session/index.cjs +3 -0
  275. package/dist/session/index.d.ts +3 -0
  276. package/dist/session/index.d.ts.map +1 -1
  277. package/dist/session/index.js +3 -1
  278. package/dist/session/message-queue.cjs +201 -0
  279. package/dist/session/message-queue.d.ts +114 -0
  280. package/dist/session/message-queue.d.ts.map +1 -0
  281. package/dist/session/message-queue.js +178 -0
  282. package/dist/session/schemas.js +1 -1
  283. package/dist/session/session-manager.cjs +57 -7
  284. package/dist/session/session-manager.d.ts +18 -0
  285. package/dist/session/session-manager.d.ts.map +1 -1
  286. package/dist/session/session-manager.js +58 -8
  287. package/dist/session/title-generator.cjs +4 -8
  288. package/dist/session/title-generator.d.ts +1 -2
  289. package/dist/session/title-generator.d.ts.map +1 -1
  290. package/dist/session/title-generator.js +5 -9
  291. package/dist/session/types.cjs +16 -0
  292. package/dist/session/types.d.ts +14 -0
  293. package/dist/session/types.d.ts.map +1 -0
  294. package/dist/session/types.js +0 -0
  295. package/dist/storage/blob/factory.js +1 -1
  296. package/dist/storage/blob/local-blob-store.js +1 -1
  297. package/dist/storage/blob/memory-blob-store.js +1 -1
  298. package/dist/storage/blob/schemas.js +1 -1
  299. package/dist/storage/cache/factory.js +1 -1
  300. package/dist/storage/cache/memory-cache-store.js +1 -1
  301. package/dist/storage/cache/redis-store.js +1 -1
  302. package/dist/storage/cache/schemas.js +1 -1
  303. package/dist/storage/database/factory.js +1 -1
  304. package/dist/storage/database/memory-database-store.js +1 -1
  305. package/dist/storage/database/postgres-store.cjs +12 -0
  306. package/dist/storage/database/postgres-store.d.ts.map +1 -1
  307. package/dist/storage/database/postgres-store.js +13 -1
  308. package/dist/storage/database/schemas.js +1 -1
  309. package/dist/storage/database/sqlite-store.js +1 -1
  310. package/dist/storage/error-codes.js +1 -1
  311. package/dist/storage/errors.js +1 -1
  312. package/dist/storage/index.js +1 -1
  313. package/dist/storage/schemas.js +1 -1
  314. package/dist/storage/storage-manager.js +1 -1
  315. package/dist/systemPrompt/contributors.js +1 -1
  316. package/dist/systemPrompt/error-codes.js +1 -1
  317. package/dist/systemPrompt/errors.js +1 -1
  318. package/dist/systemPrompt/in-built-prompts.js +1 -1
  319. package/dist/systemPrompt/index.js +1 -1
  320. package/dist/systemPrompt/manager.js +1 -1
  321. package/dist/systemPrompt/registry.js +1 -1
  322. package/dist/systemPrompt/schemas.d.ts +5 -5
  323. package/dist/systemPrompt/schemas.js +1 -1
  324. package/dist/telemetry/decorators.js +1 -1
  325. package/dist/telemetry/error-codes.js +1 -1
  326. package/dist/telemetry/errors.js +1 -1
  327. package/dist/telemetry/exporters.js +1 -1
  328. package/dist/telemetry/index.js +1 -1
  329. package/dist/telemetry/schemas.js +1 -1
  330. package/dist/telemetry/telemetry.js +1 -1
  331. package/dist/telemetry/utils.js +1 -1
  332. package/dist/tools/bash-pattern-utils.cjs +91 -0
  333. package/dist/tools/bash-pattern-utils.d.ts +58 -0
  334. package/dist/tools/bash-pattern-utils.d.ts.map +1 -0
  335. package/dist/tools/bash-pattern-utils.js +64 -0
  336. package/dist/tools/confirmation/allowed-tools-provider/factory.js +1 -1
  337. package/dist/tools/confirmation/allowed-tools-provider/in-memory.js +1 -1
  338. package/dist/tools/confirmation/allowed-tools-provider/storage.js +1 -1
  339. package/dist/tools/display-types.cjs +60 -0
  340. package/dist/tools/display-types.d.ts +133 -0
  341. package/dist/tools/display-types.d.ts.map +1 -0
  342. package/dist/tools/display-types.js +32 -0
  343. package/dist/tools/error-codes.cjs +2 -0
  344. package/dist/tools/error-codes.d.ts +3 -1
  345. package/dist/tools/error-codes.d.ts.map +1 -1
  346. package/dist/tools/error-codes.js +3 -1
  347. package/dist/tools/errors.cjs +30 -0
  348. package/dist/tools/errors.d.ts +16 -0
  349. package/dist/tools/errors.d.ts.map +1 -1
  350. package/dist/tools/errors.js +31 -1
  351. package/dist/tools/index.cjs +2 -0
  352. package/dist/tools/index.d.ts +1 -0
  353. package/dist/tools/index.d.ts.map +1 -1
  354. package/dist/tools/index.js +2 -1
  355. package/dist/tools/internal-tools/constants.js +1 -1
  356. package/dist/tools/internal-tools/implementations/ask-user-tool.cjs +1 -1
  357. package/dist/tools/internal-tools/implementations/ask-user-tool.js +2 -2
  358. package/dist/tools/internal-tools/implementations/bash-exec-tool.cjs +42 -18
  359. package/dist/tools/internal-tools/implementations/bash-exec-tool.d.ts +3 -3
  360. package/dist/tools/internal-tools/implementations/bash-exec-tool.d.ts.map +1 -1
  361. package/dist/tools/internal-tools/implementations/bash-exec-tool.js +43 -19
  362. package/dist/tools/internal-tools/implementations/bash-output-tool.js +1 -1
  363. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.js +1 -1
  364. package/dist/tools/internal-tools/implementations/edit-file-tool.cjs +66 -1
  365. package/dist/tools/internal-tools/implementations/edit-file-tool.d.ts.map +1 -1
  366. package/dist/tools/internal-tools/implementations/edit-file-tool.js +67 -2
  367. package/dist/tools/internal-tools/implementations/glob-files-tool.cjs +14 -1
  368. package/dist/tools/internal-tools/implementations/glob-files-tool.d.ts.map +1 -1
  369. package/dist/tools/internal-tools/implementations/glob-files-tool.js +15 -2
  370. package/dist/tools/internal-tools/implementations/grep-content-tool.cjs +16 -1
  371. package/dist/tools/internal-tools/implementations/grep-content-tool.d.ts.map +1 -1
  372. package/dist/tools/internal-tools/implementations/grep-content-tool.js +17 -2
  373. package/dist/tools/internal-tools/implementations/kill-process-tool.js +1 -1
  374. package/dist/tools/internal-tools/implementations/read-file-tool.cjs +9 -1
  375. package/dist/tools/internal-tools/implementations/read-file-tool.d.ts.map +1 -1
  376. package/dist/tools/internal-tools/implementations/read-file-tool.js +10 -2
  377. package/dist/tools/internal-tools/implementations/search-history-tool.js +1 -1
  378. package/dist/tools/internal-tools/implementations/write-file-tool.cjs +69 -1
  379. package/dist/tools/internal-tools/implementations/write-file-tool.d.ts.map +1 -1
  380. package/dist/tools/internal-tools/implementations/write-file-tool.js +72 -2
  381. package/dist/tools/internal-tools/provider.cjs +27 -10
  382. package/dist/tools/internal-tools/provider.d.ts +8 -5
  383. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  384. package/dist/tools/internal-tools/provider.js +28 -11
  385. package/dist/tools/internal-tools/registry.cjs +4 -3
  386. package/dist/tools/internal-tools/registry.d.ts +28 -7
  387. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  388. package/dist/tools/internal-tools/registry.js +5 -4
  389. package/dist/tools/schemas.cjs +16 -6
  390. package/dist/tools/schemas.d.ts +31 -4
  391. package/dist/tools/schemas.d.ts.map +1 -1
  392. package/dist/tools/schemas.js +14 -6
  393. package/dist/tools/tool-manager.cjs +140 -18
  394. package/dist/tools/tool-manager.d.ts +23 -1
  395. package/dist/tools/tool-manager.d.ts.map +1 -1
  396. package/dist/tools/tool-manager.js +145 -19
  397. package/dist/tools/types.d.ts +20 -0
  398. package/dist/tools/types.d.ts.map +1 -1
  399. package/dist/utils/api-key-resolver.js +1 -1
  400. package/dist/utils/async-context.js +1 -1
  401. package/dist/utils/debug.js +1 -1
  402. package/dist/{llm/tokenizer/types.cjs → utils/defer.cjs} +19 -10
  403. package/dist/utils/defer.d.ts +63 -0
  404. package/dist/utils/defer.d.ts.map +1 -0
  405. package/dist/utils/defer.js +19 -0
  406. package/dist/utils/env-file.js +1 -1
  407. package/dist/utils/error-conversion.js +1 -1
  408. package/dist/utils/execution-context.js +1 -1
  409. package/dist/utils/fs-walk.js +1 -1
  410. package/dist/utils/index.cjs +3 -1
  411. package/dist/utils/index.d.ts +1 -0
  412. package/dist/utils/index.d.ts.map +1 -1
  413. package/dist/utils/index.js +1 -0
  414. package/dist/utils/path.js +1 -1
  415. package/dist/utils/redactor.js +1 -1
  416. package/dist/utils/result.js +1 -1
  417. package/dist/utils/safe-stringify.js +1 -1
  418. package/dist/utils/schema-metadata.js +1 -1
  419. package/dist/utils/schema.js +1 -1
  420. package/dist/utils/service-initializer.cjs +6 -2
  421. package/dist/utils/service-initializer.d.ts.map +1 -1
  422. package/dist/utils/service-initializer.js +7 -3
  423. package/dist/utils/user-info.js +1 -1
  424. package/dist/utils/zod-schema-converter.js +1 -1
  425. package/package.json +6 -7
  426. package/dist/context/compression/middle-removal.cjs +0 -95
  427. package/dist/context/compression/middle-removal.d.ts +0 -47
  428. package/dist/context/compression/middle-removal.d.ts.map +0 -1
  429. package/dist/context/compression/middle-removal.js +0 -72
  430. package/dist/context/compression/oldest-removal.cjs +0 -83
  431. package/dist/context/compression/oldest-removal.d.ts +0 -42
  432. package/dist/context/compression/oldest-removal.d.ts.map +0 -1
  433. package/dist/context/compression/oldest-removal.js +0 -60
  434. package/dist/llm/formatters/anthropic.cjs +0 -257
  435. package/dist/llm/formatters/anthropic.d.ts +0 -46
  436. package/dist/llm/formatters/anthropic.d.ts.map +0 -1
  437. package/dist/llm/formatters/anthropic.js +0 -239
  438. package/dist/llm/formatters/factory.cjs +0 -50
  439. package/dist/llm/formatters/factory.d.ts +0 -10
  440. package/dist/llm/formatters/factory.d.ts.map +0 -1
  441. package/dist/llm/formatters/factory.js +0 -27
  442. package/dist/llm/formatters/openai.cjs +0 -203
  443. package/dist/llm/formatters/openai.d.ts +0 -39
  444. package/dist/llm/formatters/openai.d.ts.map +0 -1
  445. package/dist/llm/formatters/openai.js +0 -184
  446. package/dist/llm/formatters/types.d.ts +0 -41
  447. package/dist/llm/formatters/types.d.ts.map +0 -1
  448. package/dist/llm/services/anthropic.cjs +0 -511
  449. package/dist/llm/services/anthropic.d.ts +0 -48
  450. package/dist/llm/services/anthropic.d.ts.map +0 -1
  451. package/dist/llm/services/anthropic.js +0 -447
  452. package/dist/llm/services/openai.cjs +0 -611
  453. package/dist/llm/services/openai.d.ts +0 -48
  454. package/dist/llm/services/openai.d.ts.map +0 -1
  455. package/dist/llm/services/openai.js +0 -547
  456. package/dist/llm/tokenizer/anthropic.cjs +0 -43
  457. package/dist/llm/tokenizer/anthropic.d.ts +0 -19
  458. package/dist/llm/tokenizer/anthropic.d.ts.map +0 -1
  459. package/dist/llm/tokenizer/anthropic.js +0 -20
  460. package/dist/llm/tokenizer/default.d.ts +0 -14
  461. package/dist/llm/tokenizer/default.d.ts.map +0 -1
  462. package/dist/llm/tokenizer/default.js +0 -18
  463. package/dist/llm/tokenizer/factory.cjs +0 -44
  464. package/dist/llm/tokenizer/factory.d.ts +0 -12
  465. package/dist/llm/tokenizer/factory.d.ts.map +0 -1
  466. package/dist/llm/tokenizer/factory.js +0 -21
  467. package/dist/llm/tokenizer/google.cjs +0 -52
  468. package/dist/llm/tokenizer/google.d.ts +0 -29
  469. package/dist/llm/tokenizer/google.d.ts.map +0 -1
  470. package/dist/llm/tokenizer/google.js +0 -29
  471. package/dist/llm/tokenizer/openai.cjs +0 -115
  472. package/dist/llm/tokenizer/openai.d.ts +0 -41
  473. package/dist/llm/tokenizer/openai.d.ts.map +0 -1
  474. package/dist/llm/tokenizer/openai.js +0 -91
  475. package/dist/llm/tokenizer/types.d.ts +0 -18
  476. package/dist/llm/tokenizer/types.d.ts.map +0 -1
  477. package/dist/llm/tokenizer/types.js +0 -10
  478. /package/dist/llm/{formatters → executor}/types.cjs +0 -0
  479. /package/dist/llm/{formatters → executor}/types.js +0 -0
@@ -1,9 +1,11 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
+ import {
3
+ isToolMessage
4
+ } from "./types.js";
5
+ import { isValidDisplayData } from "../tools/display-types.js";
2
6
  import { validateModelFileSupport } from "../llm/registry.js";
3
- import { ContextError } from "./errors.js";
4
7
  import { safeStringify } from "../utils/safe-stringify.js";
5
8
  import { getFileMediaKind, getResourceKind } from "./media-helpers.js";
6
- const DEFAULT_OVERHEAD_PER_MESSAGE = 4;
7
9
  const MIN_BASE64_HEURISTIC_LENGTH = 512;
8
10
  const MAX_TOOL_TEXT_CHARS = 8e3;
9
11
  const MIN_TOOL_INLINE_MEDIA_BYTES = 1024;
@@ -51,60 +53,38 @@ function clonePart(part) {
51
53
  return cloned;
52
54
  }
53
55
  function coerceContentToParts(content) {
54
- if (Array.isArray(content)) {
55
- const normalized = [];
56
- for (const item of content) {
57
- if (item == null) continue;
58
- if (typeof item === "string") {
59
- normalized.push({ type: "text", text: item });
60
- continue;
56
+ if (content == null) {
57
+ return [];
58
+ }
59
+ const normalized = [];
60
+ for (const item of content) {
61
+ if (item.type === "ui-resource") {
62
+ continue;
63
+ }
64
+ if (item.type === "text") {
65
+ normalized.push({ type: "text", text: item.text });
66
+ } else if (item.type === "image") {
67
+ const cloned = {
68
+ type: "image",
69
+ image: item.image
70
+ };
71
+ if (item.mimeType) {
72
+ cloned.mimeType = item.mimeType;
61
73
  }
62
- if (typeof item === "object" && "type" in item) {
63
- const type = item.type;
64
- if (type === "text") {
65
- const textPart = item;
66
- normalized.push({ type: "text", text: textPart.text });
67
- continue;
68
- }
69
- if (type === "image") {
70
- const imagePart = item;
71
- const cloned = {
72
- type: "image",
73
- image: imagePart.image
74
- };
75
- if (imagePart.mimeType) {
76
- cloned.mimeType = imagePart.mimeType;
77
- }
78
- normalized.push(cloned);
79
- continue;
80
- }
81
- if (type === "file") {
82
- const filePart = item;
83
- const cloned = {
84
- type: "file",
85
- data: filePart.data,
86
- mimeType: filePart.mimeType ?? "application/octet-stream"
87
- };
88
- if (filePart.filename) {
89
- cloned.filename = filePart.filename;
90
- }
91
- normalized.push(cloned);
92
- continue;
93
- }
74
+ normalized.push(cloned);
75
+ } else if (item.type === "file") {
76
+ const cloned = {
77
+ type: "file",
78
+ data: item.data,
79
+ mimeType: item.mimeType ?? "application/octet-stream"
80
+ };
81
+ if (item.filename) {
82
+ cloned.filename = item.filename;
94
83
  }
84
+ normalized.push(cloned);
95
85
  }
96
- return normalized;
97
- }
98
- if (typeof content === "string") {
99
- if (content.length === 0) {
100
- return [];
101
- }
102
- return [{ type: "text", text: content }];
103
86
  }
104
- if (content == null) {
105
- return [];
106
- }
107
- return [{ type: "text", text: safeStringify(content) }];
87
+ return normalized;
108
88
  }
109
89
  function detectInlineMedia(part, index) {
110
90
  if (part.type === "text") {
@@ -270,10 +250,9 @@ async function resolveBlobReferenceToParts(resourceUri, resourceManager, logger,
270
250
  }
271
251
  const resolvedMime = mimeType ?? "application/octet-stream";
272
252
  if (resolvedMime.startsWith("image/")) {
273
- const dataUri = `data:${resolvedMime};base64,${base64Data}`;
274
253
  const imagePart = {
275
254
  type: "image",
276
- image: dataUri,
255
+ image: base64Data,
277
256
  mimeType: resolvedMime
278
257
  };
279
258
  parts.push(imagePart);
@@ -281,7 +260,7 @@ async function resolveBlobReferenceToParts(resourceUri, resourceManager, logger,
281
260
  }
282
261
  const filePart = {
283
262
  type: "file",
284
- data: resolvedMime.startsWith("audio/") ? `data:${resolvedMime};base64,${base64Data}` : base64Data,
263
+ data: base64Data,
285
264
  mimeType: resolvedMime
286
265
  };
287
266
  if (typeof item.filename === "string" && item.filename.length > 0) {
@@ -301,67 +280,17 @@ async function resolveBlobReferenceToParts(resourceUri, resourceManager, logger,
301
280
  return [{ type: "text", text: `[Attachment unavailable: ${resourceUri}]` }];
302
281
  }
303
282
  }
304
- function countMessagesTokens(history, tokenizer, overheadPerMessage = DEFAULT_OVERHEAD_PER_MESSAGE, logger) {
305
- let total = 0;
306
- logger.debug(`Counting tokens for ${history.length} messages`);
307
- try {
308
- for (const message of history) {
309
- if (message.content) {
310
- if (typeof message.content === "string") {
311
- total += tokenizer.countTokens(message.content);
312
- } else if (Array.isArray(message.content)) {
313
- message.content.forEach((part) => {
314
- if (part.type === "text" && typeof part.text === "string") {
315
- total += tokenizer.countTokens(part.text);
316
- } else if (part.type === "image") {
317
- if (typeof part.image === "string") {
318
- if (isDataUri(part.image)) {
319
- const base64Payload = extractBase64FromDataUri(part.image);
320
- const byteLength = base64LengthToBytes(base64Payload.length);
321
- total += Math.ceil(byteLength / 1024);
322
- } else {
323
- total += estimateTextTokens(part.image);
324
- }
325
- } else if (part.image instanceof Uint8Array || part.image instanceof Buffer || part.image instanceof ArrayBuffer) {
326
- const bytes = part.image instanceof ArrayBuffer ? part.image.byteLength : part.image.length;
327
- total += Math.ceil(bytes / 1024);
328
- }
329
- } else if (part.type === "file") {
330
- if (typeof part.data === "string") {
331
- if (isDataUri(part.data)) {
332
- const base64Payload = extractBase64FromDataUri(part.data);
333
- const byteLength = base64LengthToBytes(base64Payload.length);
334
- total += Math.ceil(byteLength / 1024);
335
- } else {
336
- total += estimateTextTokens(part.data);
337
- }
338
- } else if (part.data instanceof Uint8Array || part.data instanceof Buffer || part.data instanceof ArrayBuffer) {
339
- const bytes = part.data instanceof ArrayBuffer ? part.data.byteLength : part.data.length;
340
- total += Math.ceil(bytes / 1024);
341
- }
342
- }
343
- });
344
- }
345
- }
346
- if (message.toolCalls) {
347
- for (const call of message.toolCalls) {
348
- if (call.function?.name) {
349
- total += tokenizer.countTokens(call.function.name);
350
- }
351
- if (call.function?.arguments) {
352
- total += tokenizer.countTokens(call.function.arguments);
353
- }
354
- }
355
- }
356
- total += overheadPerMessage;
283
+ function estimateMessagesTokens(messages) {
284
+ return messages.reduce((sum, msg) => {
285
+ if (Array.isArray(msg.content)) {
286
+ return sum + msg.content.reduce((partSum, part) => {
287
+ if (part.type === "text") return partSum + Math.ceil(part.text.length / 4);
288
+ if (part.type === "image" || part.type === "file") return partSum + 1e3;
289
+ return partSum;
290
+ }, 0);
357
291
  }
358
- } catch (error) {
359
- logger.error(
360
- `countMessagesTokens failed: ${error instanceof Error ? error.message : String(error)}`
361
- );
362
- throw ContextError.tokenCountFailed(error instanceof Error ? error.message : String(error));
363
- }
364
- return total;
292
+ return sum;
293
+ }, 0);
365
294
  }
366
295
  function getImageData(imagePart, logger) {
367
296
  const { image } = imagePart;
@@ -429,122 +358,119 @@ async function getFileDataWithBlobSupport(filePart, resourceManager, logger) {
429
358
  }
430
359
  return getFileData(filePart, logger);
431
360
  }
432
- async function expandBlobReferences(content, resourceManager, logger, allowedMediaTypes) {
433
- if (typeof content === "string") {
434
- const blobRefPattern = /@blob:[a-f0-9]+/g;
435
- const matches = [...content.matchAll(blobRefPattern)];
436
- if (matches.length === 0) {
437
- return content;
438
- }
439
- const resolvedCache = /* @__PURE__ */ new Map();
440
- const parts = [];
441
- let lastIndex = 0;
442
- for (const match of matches) {
443
- const matchIndex = match.index ?? 0;
444
- const token = match[0];
445
- if (matchIndex > lastIndex) {
446
- const segment = content.slice(lastIndex, matchIndex);
447
- if (segment.length > 0) {
448
- parts.push({ type: "text", text: segment });
449
- }
450
- }
451
- const uri = token.substring(1);
452
- const resourceUri = uri.startsWith("blob:") ? uri : `blob:${uri}`;
453
- let resolvedParts = resolvedCache.get(resourceUri);
454
- if (!resolvedParts) {
455
- resolvedParts = await resolveBlobReferenceToParts(
456
- resourceUri,
457
- resourceManager,
458
- logger,
459
- allowedMediaTypes
460
- );
461
- resolvedCache.set(resourceUri, resolvedParts);
462
- }
463
- if (resolvedParts.length > 0) {
464
- parts.push(...resolvedParts.map((part) => ({ ...part })));
465
- } else {
466
- parts.push({ type: "text", text: token });
361
+ async function expandBlobsInText(text, resourceManager, logger, allowedMediaTypes) {
362
+ if (!text.includes("@blob:")) {
363
+ return [{ type: "text", text }];
364
+ }
365
+ const blobRefPattern = /@blob:[a-f0-9]+/g;
366
+ const matches = [...text.matchAll(blobRefPattern)];
367
+ if (matches.length === 0) {
368
+ return [{ type: "text", text }];
369
+ }
370
+ const resolvedCache = /* @__PURE__ */ new Map();
371
+ const parts = [];
372
+ let lastIndex = 0;
373
+ for (const match of matches) {
374
+ const matchIndex = match.index ?? 0;
375
+ const token = match[0];
376
+ if (matchIndex > lastIndex) {
377
+ const segment = text.slice(lastIndex, matchIndex);
378
+ if (segment.length > 0) {
379
+ parts.push({ type: "text", text: segment });
467
380
  }
468
- lastIndex = matchIndex + token.length;
469
381
  }
470
- if (lastIndex < content.length) {
471
- const trailing = content.slice(lastIndex);
472
- if (trailing.length > 0) {
473
- parts.push({ type: "text", text: trailing });
474
- }
382
+ const uri = token.substring(1);
383
+ const resourceUri = uri.startsWith("blob:") ? uri : `blob:${uri}`;
384
+ let resolvedParts = resolvedCache.get(resourceUri);
385
+ if (!resolvedParts) {
386
+ resolvedParts = await resolveBlobReferenceToParts(
387
+ resourceUri,
388
+ resourceManager,
389
+ logger,
390
+ allowedMediaTypes
391
+ );
392
+ resolvedCache.set(resourceUri, resolvedParts);
475
393
  }
476
- const normalized = parts.filter((part) => part.type !== "text" || part.text.length > 0);
477
- if (normalized.length === 1 && normalized[0]?.type === "text") {
478
- return normalized[0].text;
394
+ if (resolvedParts.length > 0) {
395
+ parts.push(...resolvedParts.map((p) => ({ ...p })));
396
+ } else {
397
+ parts.push({ type: "text", text: token });
479
398
  }
480
- return normalized;
399
+ lastIndex = matchIndex + token.length;
481
400
  }
482
- if (Array.isArray(content)) {
483
- const expandedParts = [];
484
- for (const part of content) {
485
- if (part.type === "image" && typeof part.image === "string" && part.image.startsWith("@blob:")) {
486
- const uri = part.image.substring(1);
487
- const resourceUri = uri.startsWith("blob:") ? uri : `blob:${uri}`;
488
- const resolved = await resolveBlobReferenceToParts(
489
- resourceUri,
490
- resourceManager,
491
- logger,
492
- allowedMediaTypes
493
- );
494
- if (resolved.length > 0) {
495
- expandedParts.push(...resolved.map((part2) => ({ ...part2 })));
496
- } else {
497
- expandedParts.push(part);
498
- }
499
- continue;
500
- }
501
- if (part.type === "file" && typeof part.data === "string" && part.data.startsWith("@blob:")) {
502
- const uri = part.data.substring(1);
503
- const resourceUri = uri.startsWith("blob:") ? uri : `blob:${uri}`;
504
- const resolved = await resolveBlobReferenceToParts(
505
- resourceUri,
506
- resourceManager,
507
- logger,
508
- allowedMediaTypes
509
- );
510
- if (resolved.length > 0) {
511
- expandedParts.push(...resolved.map((part2) => ({ ...part2 })));
512
- } else {
513
- try {
514
- const resolvedData = await getFileDataWithBlobSupport(
515
- part,
516
- resourceManager,
517
- logger
518
- );
519
- expandedParts.push({ ...part, data: resolvedData });
520
- } catch (error) {
521
- logger.warn(`Failed to resolve file blob reference: ${String(error)}`);
522
- expandedParts.push(part);
523
- }
524
- }
525
- continue;
401
+ if (lastIndex < text.length) {
402
+ const trailing = text.slice(lastIndex);
403
+ if (trailing.length > 0) {
404
+ parts.push({ type: "text", text: trailing });
405
+ }
406
+ }
407
+ return parts.filter((p) => p.type !== "text" || p.text.length > 0);
408
+ }
409
+ async function expandBlobReferences(content, resourceManager, logger, allowedMediaTypes) {
410
+ if (content == null || !Array.isArray(content)) {
411
+ return [];
412
+ }
413
+ const expandedParts = [];
414
+ for (const part of content) {
415
+ if (part.type === "ui-resource") {
416
+ expandedParts.push(part);
417
+ continue;
418
+ }
419
+ if (part.type === "image" && typeof part.image === "string" && part.image.startsWith("@blob:")) {
420
+ const uri = part.image.substring(1);
421
+ const resourceUri = uri.startsWith("blob:") ? uri : `blob:${uri}`;
422
+ const resolved = await resolveBlobReferenceToParts(
423
+ resourceUri,
424
+ resourceManager,
425
+ logger,
426
+ allowedMediaTypes
427
+ );
428
+ if (resolved.length > 0) {
429
+ expandedParts.push(...resolved.map((p) => ({ ...p })));
430
+ } else {
431
+ expandedParts.push(part);
526
432
  }
527
- if (part.type === "text" && part.text.includes("@blob:")) {
528
- const expanded = await expandBlobReferences(
529
- part.text,
530
- resourceManager,
531
- logger,
532
- allowedMediaTypes
533
- );
534
- if (typeof expanded === "string") {
535
- expandedParts.push({ ...part, text: expanded });
536
- } else if (Array.isArray(expanded)) {
537
- expandedParts.push(...expanded.map((part2) => ({ ...part2 })));
538
- } else {
433
+ continue;
434
+ }
435
+ if (part.type === "file" && typeof part.data === "string" && part.data.startsWith("@blob:")) {
436
+ const uri = part.data.substring(1);
437
+ const resourceUri = uri.startsWith("blob:") ? uri : `blob:${uri}`;
438
+ const resolved = await resolveBlobReferenceToParts(
439
+ resourceUri,
440
+ resourceManager,
441
+ logger,
442
+ allowedMediaTypes
443
+ );
444
+ if (resolved.length > 0) {
445
+ expandedParts.push(...resolved.map((p) => ({ ...p })));
446
+ } else {
447
+ try {
448
+ const resolvedData = await getFileDataWithBlobSupport(
449
+ part,
450
+ resourceManager,
451
+ logger
452
+ );
453
+ expandedParts.push({ ...part, data: resolvedData });
454
+ } catch (error) {
455
+ logger.warn(`Failed to resolve file blob reference: ${String(error)}`);
539
456
  expandedParts.push(part);
540
457
  }
541
- continue;
542
458
  }
543
- expandedParts.push(part);
459
+ continue;
460
+ }
461
+ if (part.type === "text" && part.text.includes("@blob:")) {
462
+ const expanded = await expandBlobsInText(
463
+ part.text,
464
+ resourceManager,
465
+ logger,
466
+ allowedMediaTypes
467
+ );
468
+ expandedParts.push(...expanded);
469
+ continue;
544
470
  }
545
- return expandedParts;
471
+ expandedParts.push(part);
546
472
  }
547
- return content;
473
+ return expandedParts;
548
474
  }
549
475
  function filterMessagesByLLMCapabilities(messages, config, logger) {
550
476
  try {
@@ -688,7 +614,25 @@ async function normalizeToolResult(result, logger) {
688
614
  void 0,
689
615
  void 0
690
616
  );
691
- const parts = coerceContentToParts(content);
617
+ const uiResources = [];
618
+ const otherContent = [];
619
+ if (Array.isArray(content)) {
620
+ for (const item of content) {
621
+ if (item && typeof item === "object" && "type" in item && item.type === "ui-resource") {
622
+ uiResources.push(item);
623
+ } else {
624
+ otherContent.push(item);
625
+ }
626
+ }
627
+ } else {
628
+ otherContent.push(content);
629
+ }
630
+ if (uiResources.length > 0) {
631
+ logger.debug(
632
+ `normalizeToolResult: extracted ${uiResources.length} UI resource(s): ${uiResources.map((r) => r.uri).join(", ")}`
633
+ );
634
+ }
635
+ const parts = coerceContentToParts(otherContent);
692
636
  const inlineMedia = [];
693
637
  parts.forEach((part, index) => {
694
638
  const hint = detectInlineMedia(part, index);
@@ -698,6 +642,7 @@ async function normalizeToolResult(result, logger) {
698
642
  });
699
643
  return {
700
644
  parts,
645
+ uiResources,
701
646
  inlineMedia
702
647
  };
703
648
  }
@@ -749,6 +694,7 @@ async function persistToolMedia(normalized, options, logger) {
749
694
  const resources = extractResourceDescriptors(parts);
750
695
  return {
751
696
  parts,
697
+ uiResources: normalized.uiResources,
752
698
  ...resources ? { resources } : {}
753
699
  };
754
700
  }
@@ -795,53 +741,22 @@ async function sanitizeToolResultToContentWithBlobs(result, logger, blobStore, n
795
741
  }
796
742
  ];
797
743
  }
798
- if (isLikelyBase64String(result)) {
799
- logger.debug("sanitizeToolResultToContentWithBlobs: detected base64-like string");
800
- const approxSize = Math.floor(result.length * 3 / 4);
801
- const shouldStoreAsBlob = blobStore && approxSize > 1024;
802
- if (shouldStoreAsBlob) {
803
- try {
804
- const blobRef = await blobStore.store(result, {
805
- mimeType: "application/octet-stream",
806
- source: "tool",
807
- originalName: buildToolBlobName("output", void 0, namingOptions)
808
- });
809
- logger.debug(
810
- `Stored tool result as blob: ${blobRef.uri} (${approxSize} bytes)`
811
- );
812
- return [
813
- createBlobFilePart(
814
- blobRef.uri,
815
- "application/octet-stream",
816
- "tool-output.bin"
817
- )
818
- ];
819
- } catch (error) {
820
- logger.warn(
821
- `Failed to store blob, falling back to inline: ${String(error)}`
822
- );
823
- }
824
- }
825
- return [
826
- {
827
- type: "file",
828
- data: result,
829
- mimeType: "application/octet-stream",
830
- filename: "tool-output.bin"
831
- }
832
- ];
833
- }
834
744
  if (result.length > MAX_TOOL_TEXT_CHARS) {
835
745
  const head = result.slice(0, 4e3);
836
746
  const tail = result.slice(-1e3);
837
747
  logger.debug(
838
748
  `sanitizeToolResultToContentWithBlobs: truncating long text tool output (len=${result.length})`
839
749
  );
840
- return `${head}
750
+ return [
751
+ {
752
+ type: "text",
753
+ text: `${head}
841
754
  ... [${result.length - 5e3} chars omitted] ...
842
- ${tail}`;
755
+ ${tail}`
756
+ }
757
+ ];
843
758
  }
844
- return result;
759
+ return [{ type: "text", text: result }];
845
760
  }
846
761
  if (Array.isArray(result)) {
847
762
  const parts = [];
@@ -853,10 +768,10 @@ ${tail}`;
853
768
  blobStore,
854
769
  namingOptions
855
770
  );
856
- if (typeof processedItem === "string") {
857
- parts.push({ type: "text", text: processedItem });
858
- } else if (Array.isArray(processedItem)) {
859
- parts.push(...processedItem);
771
+ if (Array.isArray(processedItem)) {
772
+ parts.push(
773
+ ...processedItem
774
+ );
860
775
  }
861
776
  }
862
777
  return parts;
@@ -870,6 +785,34 @@ ${tail}`;
870
785
  const processedContent = [];
871
786
  for (const item of anyObj.content) {
872
787
  if (item && typeof item === "object") {
788
+ if (item.type === "resource" && item.resource) {
789
+ const resource = item.resource;
790
+ const resourceUri = resource.uri;
791
+ if (resourceUri && resourceUri.startsWith("ui://")) {
792
+ logger.debug(
793
+ `Detected MCP-UI resource: ${resourceUri} (${resource.mimeType})`
794
+ );
795
+ const resourceMeta = resource._meta || {};
796
+ const title = resourceMeta.title || resource.title;
797
+ const preferredSize = resourceMeta.preferredSize || resource.preferredSize;
798
+ const uiPart = {
799
+ type: "ui-resource",
800
+ uri: resourceUri,
801
+ mimeType: resource.mimeType || "text/html",
802
+ content: resource.text,
803
+ blob: resource.blob,
804
+ metadata: {
805
+ title,
806
+ preferredSize
807
+ }
808
+ };
809
+ if (!uiPart.metadata?.title && !uiPart.metadata?.preferredSize) {
810
+ delete uiPart.metadata;
811
+ }
812
+ processedContent.push(uiPart);
813
+ continue;
814
+ }
815
+ }
873
816
  if (item.type === "resource" && item.resource) {
874
817
  const resource = item.resource;
875
818
  if (resource.text && resource.mimeType) {
@@ -1066,17 +1009,17 @@ ${tail}`;
1066
1009
  ];
1067
1010
  }
1068
1011
  const cleaned = sanitizeDeepObject(anyObj, logger);
1069
- return safeStringify(cleaned);
1012
+ return [{ type: "text", text: safeStringify(cleaned) }];
1070
1013
  }
1071
- return safeStringify(result ?? "");
1014
+ return [{ type: "text", text: safeStringify(result ?? "") }];
1072
1015
  } catch (err) {
1073
1016
  logger.warn(
1074
1017
  `sanitizeToolResultToContentWithBlobs failed, falling back to string: ${String(err)}`
1075
1018
  );
1076
1019
  try {
1077
- return safeStringify(result ?? "");
1020
+ return [{ type: "text", text: safeStringify(result ?? "") }];
1078
1021
  } catch {
1079
- return String(result ?? "");
1022
+ return [{ type: "text", text: String(result ?? "") }];
1080
1023
  }
1081
1024
  }
1082
1025
  }
@@ -1120,7 +1063,19 @@ function extractResourceDescriptors(parts) {
1120
1063
  return resources.length > 0 ? resources : void 0;
1121
1064
  }
1122
1065
  async function sanitizeToolResult(result, options, logger) {
1123
- const normalized = await normalizeToolResult(result, logger);
1066
+ let display;
1067
+ let resultForNormalization = result;
1068
+ if (result && typeof result === "object" && "_display" in result) {
1069
+ const { _display: rawDisplay, ...rest } = result;
1070
+ if (isValidDisplayData(rawDisplay)) {
1071
+ display = rawDisplay;
1072
+ logger.debug(
1073
+ `sanitizeToolResult: extracted display data (type=${display.type}) for ${options.toolName}`
1074
+ );
1075
+ }
1076
+ resultForNormalization = rest;
1077
+ }
1078
+ const normalized = await normalizeToolResult(resultForNormalization, logger);
1124
1079
  const persisted = await persistToolMedia(
1125
1080
  normalized,
1126
1081
  {
@@ -1131,14 +1086,24 @@ async function sanitizeToolResult(result, options, logger) {
1131
1086
  logger
1132
1087
  );
1133
1088
  const fallbackContent = [{ type: "text", text: "" }];
1134
- const content = persisted.parts.length > 0 ? persisted.parts : fallbackContent;
1089
+ const allContent = [
1090
+ ...persisted.parts,
1091
+ ...persisted.uiResources
1092
+ ];
1093
+ const content = allContent.length > 0 ? allContent : fallbackContent;
1094
+ if (persisted.uiResources.length > 0) {
1095
+ logger.debug(
1096
+ `sanitizeToolResult: including ${persisted.uiResources.length} UI resource(s) in final content for ${options.toolName}`
1097
+ );
1098
+ }
1135
1099
  return {
1136
1100
  content,
1137
1101
  ...persisted.resources ? { resources: persisted.resources } : {},
1138
1102
  meta: {
1139
1103
  toolName: options.toolName,
1140
1104
  toolCallId: options.toolCallId,
1141
- ...typeof options.success === "boolean" ? { success: options.success } : {}
1105
+ success: options.success,
1106
+ ...display ? { display } : {}
1142
1107
  }
1143
1108
  };
1144
1109
  }
@@ -1171,16 +1136,6 @@ function summarizeToolContentForText(content) {
1171
1136
  function base64LengthToBytes(charLength) {
1172
1137
  return Math.floor(charLength * 3 / 4);
1173
1138
  }
1174
- function isDataUri(str) {
1175
- return str.startsWith("data:") && str.includes(";base64,");
1176
- }
1177
- function extractBase64FromDataUri(dataUri) {
1178
- const commaIndex = dataUri.indexOf(",");
1179
- return commaIndex !== -1 ? dataUri.substring(commaIndex + 1) : "";
1180
- }
1181
- function estimateTextTokens(text) {
1182
- return Math.ceil(text.length / 4);
1183
- }
1184
1139
  function toTextForToolMessage(content) {
1185
1140
  if (Array.isArray(content)) {
1186
1141
  return summarizeToolContentForText(content);
@@ -1190,11 +1145,39 @@ function toTextForToolMessage(content) {
1190
1145
  }
1191
1146
  return String(content ?? "");
1192
1147
  }
1148
+ function filterCompacted(history) {
1149
+ let summaryIndex = -1;
1150
+ for (let i = history.length - 1; i >= 0; i--) {
1151
+ const msg = history[i];
1152
+ if (msg?.metadata?.isSummary === true) {
1153
+ summaryIndex = i;
1154
+ break;
1155
+ }
1156
+ }
1157
+ if (summaryIndex === -1) {
1158
+ return history.slice();
1159
+ }
1160
+ return history.slice(summaryIndex);
1161
+ }
1162
+ function formatToolOutputForDisplay(message) {
1163
+ if (isToolMessage(message) && message.compactedAt) {
1164
+ return "[Old tool result content cleared]";
1165
+ }
1166
+ if (typeof message.content === "string") {
1167
+ return message.content;
1168
+ }
1169
+ if (Array.isArray(message.content)) {
1170
+ return message.content.filter((part) => part.type === "text").map((part) => part.text).join("\n");
1171
+ }
1172
+ return "[no content]";
1173
+ }
1193
1174
  export {
1194
- countMessagesTokens,
1175
+ estimateMessagesTokens,
1195
1176
  expandBlobReferences,
1196
1177
  fileTypesToMimePatterns,
1178
+ filterCompacted,
1197
1179
  filterMessagesByLLMCapabilities,
1180
+ formatToolOutputForDisplay,
1198
1181
  getFileData,
1199
1182
  getFileDataWithBlobSupport,
1200
1183
  getFileMediaKind,