@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
@@ -0,0 +1,753 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
9
+ var __typeError = (msg) => {
10
+ throw TypeError(msg);
11
+ };
12
+ var __export = (target, all) => {
13
+ for (var name in all)
14
+ __defProp(target, name, { get: all[name], enumerable: true });
15
+ };
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") {
18
+ for (let key of __getOwnPropNames(from))
19
+ if (!__hasOwnProp.call(to, key) && key !== except)
20
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25
+ // If the importer is in node compatibility mode or this is not an ESM
26
+ // file that has been converted to a CommonJS file using a Babel-
27
+ // compatible transform (i.e. "__esModule" has not been set), then set
28
+ // "default" to the CommonJS "module.exports" for node compatibility.
29
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30
+ mod
31
+ ));
32
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
+ var __using = (stack, value, async) => {
34
+ if (value != null) {
35
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
36
+ var dispose, inner;
37
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
38
+ if (dispose === void 0) {
39
+ dispose = value[__knownSymbol("dispose")];
40
+ if (async) inner = dispose;
41
+ }
42
+ if (typeof dispose !== "function") __typeError("Object not disposable");
43
+ if (inner) dispose = function() {
44
+ try {
45
+ inner.call(this);
46
+ } catch (e) {
47
+ return Promise.reject(e);
48
+ }
49
+ };
50
+ stack.push([async, dispose, value]);
51
+ } else if (async) {
52
+ stack.push([async]);
53
+ }
54
+ return value;
55
+ };
56
+ var __callDispose = (stack, error, hasError) => {
57
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
58
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
59
+ };
60
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
61
+ var next = (it) => {
62
+ while (it = stack.pop()) {
63
+ try {
64
+ var result = it[1] && it[1].call(it[2]);
65
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
66
+ } catch (e) {
67
+ fail(e);
68
+ }
69
+ }
70
+ if (hasError) throw error;
71
+ };
72
+ return next();
73
+ };
74
+ var turn_executor_exports = {};
75
+ __export(turn_executor_exports, {
76
+ TurnExecutor: () => TurnExecutor
77
+ });
78
+ module.exports = __toCommonJS(turn_executor_exports);
79
+ var import_ai = require("ai");
80
+ var import_api = require("@opentelemetry/api");
81
+ var import_stream_processor = require("./stream-processor.js");
82
+ var import_types4 = require("../../logger/v2/types.js");
83
+ var import_defer = require("../../utils/defer.js");
84
+ var import_DextoRuntimeError = require("../../errors/DextoRuntimeError.js");
85
+ var import_types7 = require("../../errors/types.js");
86
+ var import_error_codes = require("../error-codes.js");
87
+ var import_error_conversion = require("../../utils/error-conversion.js");
88
+ var import_overflow = require("../../context/compression/overflow.js");
89
+ var import_reactive_overflow = require("../../context/compression/reactive-overflow.js");
90
+ const toolSupportCache = /* @__PURE__ */ new Map();
91
+ class TurnExecutor {
92
+ constructor(model, toolManager, contextManager, eventBus, resourceManager, sessionId, config, llmContext, logger, messageQueue, modelLimits, externalSignal) {
93
+ this.model = model;
94
+ this.toolManager = toolManager;
95
+ this.contextManager = contextManager;
96
+ this.eventBus = eventBus;
97
+ this.resourceManager = resourceManager;
98
+ this.sessionId = sessionId;
99
+ this.config = config;
100
+ this.llmContext = llmContext;
101
+ this.messageQueue = messageQueue;
102
+ this.modelLimits = modelLimits;
103
+ this.externalSignal = externalSignal;
104
+ this.logger = logger.createChild(import_types4.DextoLogComponent.EXECUTOR);
105
+ this.stepAbortController = new AbortController();
106
+ if (modelLimits) {
107
+ this.compressionStrategy = new import_reactive_overflow.ReactiveOverflowStrategy(model, {}, this.logger);
108
+ }
109
+ }
110
+ logger;
111
+ /**
112
+ * Per-step abort controller. Created fresh for each iteration of the loop.
113
+ * This allows soft cancel (abort current step) while still continuing with queued messages.
114
+ */
115
+ stepAbortController;
116
+ // TODO: improve compression configurability
117
+ compressionStrategy = null;
118
+ /**
119
+ * Map to track approval metadata by toolCallId.
120
+ * Used to pass approval info from tool execution to result persistence.
121
+ */
122
+ approvalMetadata = /* @__PURE__ */ new Map();
123
+ /**
124
+ * Get StreamProcessor config from TurnExecutor state.
125
+ */
126
+ getStreamProcessorConfig() {
127
+ return {
128
+ provider: this.llmContext.provider,
129
+ model: this.llmContext.model
130
+ };
131
+ }
132
+ /**
133
+ * Main agent execution loop.
134
+ * Uses stopWhen: stepCountIs(1) to regain control after each step.
135
+ *
136
+ * @param contributorContext Context for system prompt contributors
137
+ * @param streaming If true, emits llm:chunk events during streaming. Default true.
138
+ */
139
+ async execute(contributorContext, streaming = true) {
140
+ var _stack = [];
141
+ try {
142
+ const _ = __using(_stack, (0, import_defer.defer)(() => this.cleanup()));
143
+ const startTime = Date.now();
144
+ let stepCount = 0;
145
+ let lastStepTokens = null;
146
+ let lastFinishReason = "unknown";
147
+ let lastText = "";
148
+ this.eventBus.emit("llm:thinking");
149
+ const supportsTools = await this.validateToolSupport();
150
+ let currentAbortHandler = null;
151
+ try {
152
+ while (true) {
153
+ if (currentAbortHandler && this.externalSignal) {
154
+ this.externalSignal.removeEventListener("abort", currentAbortHandler);
155
+ }
156
+ this.stepAbortController = new AbortController();
157
+ currentAbortHandler = () => this.stepAbortController.abort();
158
+ if (this.externalSignal && !this.externalSignal.aborted) {
159
+ this.externalSignal.addEventListener("abort", currentAbortHandler, {
160
+ once: true
161
+ });
162
+ }
163
+ const coalesced = this.messageQueue.dequeueAll();
164
+ if (coalesced) {
165
+ await this.injectQueuedMessages(coalesced);
166
+ }
167
+ if (lastStepTokens && this.checkAndHandleOverflow(lastStepTokens)) {
168
+ await this.compress(lastStepTokens.inputTokens ?? 0);
169
+ }
170
+ const prepared = await this.contextManager.getFormattedMessagesWithCompression(
171
+ contributorContext,
172
+ this.llmContext
173
+ );
174
+ this.logger.debug(`Step ${stepCount}: Starting`);
175
+ const tools = supportsTools ? await this.createTools() : {};
176
+ const streamProcessor = new import_stream_processor.StreamProcessor(
177
+ this.contextManager,
178
+ this.eventBus,
179
+ this.resourceManager,
180
+ this.stepAbortController.signal,
181
+ this.getStreamProcessorConfig(),
182
+ this.logger,
183
+ streaming,
184
+ this.approvalMetadata
185
+ );
186
+ const result = await streamProcessor.process(
187
+ () => (0, import_ai.streamText)({
188
+ model: this.model,
189
+ stopWhen: (0, import_ai.stepCountIs)(1),
190
+ tools,
191
+ abortSignal: this.stepAbortController.signal,
192
+ messages: prepared.formattedMessages,
193
+ ...this.config.maxOutputTokens !== void 0 && {
194
+ maxOutputTokens: this.config.maxOutputTokens
195
+ },
196
+ ...this.config.temperature !== void 0 && {
197
+ temperature: this.config.temperature
198
+ },
199
+ // Log stream-level errors (tool errors, API errors during streaming)
200
+ onError: (error) => {
201
+ this.logger.error("Stream error", { error });
202
+ }
203
+ })
204
+ );
205
+ lastStepTokens = result.usage;
206
+ lastFinishReason = result.finishReason;
207
+ lastText = result.text;
208
+ this.logger.debug(
209
+ `Step ${stepCount}: Finished with reason="${result.finishReason}", tokens=${JSON.stringify(result.usage)}`
210
+ );
211
+ if (result.finishReason !== "tool-calls") {
212
+ const queuedOnTerminate = this.messageQueue.dequeueAll();
213
+ if (queuedOnTerminate) {
214
+ this.logger.debug(
215
+ `Continuing: ${queuedOnTerminate.messages.length} queued message(s) to process`
216
+ );
217
+ await this.injectQueuedMessages(queuedOnTerminate);
218
+ continue;
219
+ }
220
+ this.logger.debug(`Terminating: finishReason is "${result.finishReason}"`);
221
+ break;
222
+ }
223
+ if (this.externalSignal?.aborted && !this.messageQueue.hasPending()) {
224
+ this.logger.debug("Terminating: hard cancel - external abort signal received");
225
+ lastFinishReason = "cancelled";
226
+ break;
227
+ }
228
+ if (++stepCount >= this.config.maxSteps) {
229
+ this.logger.debug(`Terminating: reached maxSteps (${this.config.maxSteps})`);
230
+ lastFinishReason = "max-steps";
231
+ break;
232
+ }
233
+ await this.pruneOldToolOutputs();
234
+ }
235
+ } catch (error) {
236
+ const mappedError = this.mapProviderError(error);
237
+ this.logger.error("TurnExecutor failed", { error: mappedError });
238
+ this.eventBus.emit("llm:error", {
239
+ error: mappedError,
240
+ context: "TurnExecutor",
241
+ recoverable: false
242
+ });
243
+ await this.contextManager.flush();
244
+ this.eventBus.emit("run:complete", {
245
+ finishReason: "error",
246
+ stepCount,
247
+ durationMs: Date.now() - startTime,
248
+ error: mappedError
249
+ });
250
+ throw mappedError;
251
+ }
252
+ await this.contextManager.flush();
253
+ this.setTelemetryAttributes(lastStepTokens);
254
+ this.eventBus.emit("run:complete", {
255
+ finishReason: lastFinishReason,
256
+ stepCount,
257
+ durationMs: Date.now() - startTime
258
+ });
259
+ return {
260
+ text: lastText,
261
+ stepCount,
262
+ usage: lastStepTokens,
263
+ finishReason: lastFinishReason
264
+ };
265
+ } catch (_2) {
266
+ var _error = _2, _hasError = true;
267
+ } finally {
268
+ __callDispose(_stack, _error, _hasError);
269
+ }
270
+ }
271
+ /**
272
+ * Abort the current step execution.
273
+ * Note: For full run cancellation, use the external abort signal.
274
+ */
275
+ abort() {
276
+ this.stepAbortController.abort();
277
+ }
278
+ /**
279
+ * Inject coalesced queued messages into the context as a single user message.
280
+ * This enables mid-task user guidance.
281
+ */
282
+ async injectQueuedMessages(coalesced) {
283
+ await this.contextManager.addMessage({
284
+ role: "user",
285
+ content: coalesced.combinedContent,
286
+ metadata: {
287
+ coalesced: coalesced.messages.length > 1,
288
+ messageCount: coalesced.messages.length,
289
+ originalMessageIds: coalesced.messages.map((m) => m.id)
290
+ }
291
+ });
292
+ this.logger.info(`Injected ${coalesced.messages.length} queued message(s) into context`, {
293
+ count: coalesced.messages.length,
294
+ firstQueued: coalesced.firstQueuedAt,
295
+ lastQueued: coalesced.lastQueuedAt
296
+ });
297
+ }
298
+ /**
299
+ * Validates if the current model supports tools.
300
+ * Uses a static cache to avoid repeated validation calls.
301
+ *
302
+ * For models using custom baseURL endpoints, makes a test call to verify tool support.
303
+ * Built-in providers without baseURL are assumed to support tools.
304
+ */
305
+ async validateToolSupport() {
306
+ const modelKey = `${this.llmContext.provider}:${this.llmContext.model}:${this.config.baseURL ?? ""}`;
307
+ if (toolSupportCache.has(modelKey)) {
308
+ return toolSupportCache.get(modelKey);
309
+ }
310
+ if (!this.config.baseURL) {
311
+ this.logger.debug(`Skipping tool validation for ${modelKey} - no custom baseURL`);
312
+ toolSupportCache.set(modelKey, true);
313
+ return true;
314
+ }
315
+ this.logger.debug(`Testing tool support for custom endpoint model: ${modelKey}`);
316
+ const testTool = {
317
+ test_tool: {
318
+ inputSchema: (0, import_ai.jsonSchema)({
319
+ type: "object",
320
+ properties: {},
321
+ additionalProperties: false
322
+ }),
323
+ execute: async () => ({ result: "test" })
324
+ }
325
+ };
326
+ const testAbort = new AbortController();
327
+ const testTimeout = setTimeout(() => testAbort.abort(), 5e3);
328
+ try {
329
+ await (0, import_ai.generateText)({
330
+ model: this.model,
331
+ messages: [{ role: "user", content: "Hello" }],
332
+ tools: testTool,
333
+ stopWhen: (0, import_ai.stepCountIs)(1),
334
+ abortSignal: testAbort.signal
335
+ });
336
+ clearTimeout(testTimeout);
337
+ toolSupportCache.set(modelKey, true);
338
+ this.logger.debug(`Model ${modelKey} supports tools`);
339
+ return true;
340
+ } catch (error) {
341
+ clearTimeout(testTimeout);
342
+ const errorMessage = error instanceof Error ? error.message : String(error);
343
+ if (errorMessage.includes("does not support tools")) {
344
+ toolSupportCache.set(modelKey, false);
345
+ this.logger.debug(`Model ${modelKey} does not support tools`);
346
+ return false;
347
+ }
348
+ this.logger.debug(
349
+ `Tool validation error for ${modelKey}, assuming supported: ${errorMessage}`
350
+ );
351
+ toolSupportCache.set(modelKey, true);
352
+ return true;
353
+ }
354
+ }
355
+ /**
356
+ * Creates tools with execute callbacks and toModelOutput.
357
+ *
358
+ * Key design decisions:
359
+ * - execute() returns raw result with inline images (async)
360
+ * - toModelOutput() formats for LLM consumption (sync)
361
+ * - StreamProcessor handles persistence via tool-result events
362
+ */
363
+ async createTools() {
364
+ const tools = await this.toolManager.getAllTools();
365
+ return Object.fromEntries(
366
+ Object.entries(tools).map(([name, tool]) => [
367
+ name,
368
+ {
369
+ inputSchema: (0, import_ai.jsonSchema)(tool.parameters),
370
+ ...tool.description && { description: tool.description },
371
+ /**
372
+ * Execute callback - runs the tool and returns raw result.
373
+ * Does NOT persist - StreamProcessor handles that on tool-result event.
374
+ *
375
+ * Uses Promise.race to ensure we return quickly on abort, even if the
376
+ * underlying tool (especially MCP tools we don't control) keeps running.
377
+ */
378
+ execute: async (args, options) => {
379
+ this.logger.debug(
380
+ `Executing tool: ${name} (toolCallId: ${options.toolCallId})`
381
+ );
382
+ const abortSignal = this.stepAbortController.signal;
383
+ if (abortSignal.aborted) {
384
+ this.logger.debug(`Tool ${name} cancelled before execution`);
385
+ return { error: "Cancelled by user", cancelled: true };
386
+ }
387
+ let abortHandler = null;
388
+ const abortPromise = new Promise(
389
+ (resolve) => {
390
+ abortHandler = () => {
391
+ this.logger.debug(`Tool ${name} cancelled during execution`);
392
+ resolve({ error: "Cancelled by user", cancelled: true });
393
+ };
394
+ abortSignal.addEventListener("abort", abortHandler, { once: true });
395
+ }
396
+ );
397
+ try {
398
+ const result = await Promise.race([
399
+ (async () => {
400
+ const executionResult = await this.toolManager.executeTool(
401
+ name,
402
+ args,
403
+ options.toolCallId,
404
+ this.sessionId,
405
+ abortSignal
406
+ );
407
+ if (executionResult.requireApproval !== void 0) {
408
+ const metadata = {
409
+ requireApproval: executionResult.requireApproval
410
+ };
411
+ if (executionResult.approvalStatus !== void 0) {
412
+ metadata.approvalStatus = executionResult.approvalStatus;
413
+ }
414
+ this.approvalMetadata.set(options.toolCallId, metadata);
415
+ }
416
+ return executionResult.result;
417
+ })(),
418
+ abortPromise
419
+ ]);
420
+ return result;
421
+ } finally {
422
+ if (abortHandler) {
423
+ abortSignal.removeEventListener("abort", abortHandler);
424
+ }
425
+ }
426
+ },
427
+ /**
428
+ * toModelOutput - formats raw result for LLM consumption.
429
+ * Called by Vercel SDK when preparing messages for next LLM call.
430
+ * SYNC - images are already inline in the raw result.
431
+ */
432
+ toModelOutput: (result) => {
433
+ return this.formatToolResultForLLM(result, name);
434
+ }
435
+ }
436
+ ])
437
+ );
438
+ }
439
+ /**
440
+ * Format tool result for LLM consumption.
441
+ * Handles multimodal content (text + images).
442
+ *
443
+ * This handles RAW tool results - the structure may vary.
444
+ */
445
+ formatToolResultForLLM(result, toolName) {
446
+ if (result && typeof result === "object" && "error" in result) {
447
+ const errorResult = result;
448
+ let errorFlags = "";
449
+ if (errorResult.denied) errorFlags += " (denied)";
450
+ if (errorResult.timeout) errorFlags += " (timeout)";
451
+ return {
452
+ type: "text",
453
+ value: `Tool ${toolName} failed${errorFlags}: ${errorResult.error}`
454
+ };
455
+ }
456
+ if (this.hasMultimodalContent(result)) {
457
+ const contentArray = result.content;
458
+ const contentValue = [];
459
+ for (const part of contentArray) {
460
+ if (part.type === "text" && typeof part.text === "string") {
461
+ contentValue.push({ type: "text", text: part.text });
462
+ } else if (part.type === "image") {
463
+ const imageData = this.extractImageData(part);
464
+ if (imageData) {
465
+ contentValue.push({
466
+ type: "media",
467
+ data: imageData,
468
+ mediaType: part.mimeType || "image/jpeg"
469
+ });
470
+ }
471
+ } else if (part.type === "file") {
472
+ const fileData = this.extractFileData(part);
473
+ if (fileData) {
474
+ contentValue.push({
475
+ type: "media",
476
+ data: fileData,
477
+ mediaType: part.mimeType || "application/octet-stream"
478
+ });
479
+ }
480
+ }
481
+ }
482
+ if (contentValue.length > 0 && contentValue.some((v) => v.type === "media")) {
483
+ return { type: "content", value: contentValue };
484
+ }
485
+ const textParts = contentArray.filter((p) => p.type === "text" && typeof p.text === "string").map((p) => p.text);
486
+ return {
487
+ type: "text",
488
+ value: textParts.join("\n") || "[empty result]"
489
+ };
490
+ }
491
+ if (typeof result === "string") {
492
+ return { type: "text", value: result };
493
+ }
494
+ return {
495
+ type: "text",
496
+ value: typeof result === "object" && result !== null ? JSON.stringify(result) : String(result)
497
+ };
498
+ }
499
+ /**
500
+ * Extract image data from a part, handling various formats.
501
+ */
502
+ extractImageData(part) {
503
+ if (typeof part.image === "string") {
504
+ return part.image;
505
+ }
506
+ if (typeof part.data === "string") {
507
+ return part.data;
508
+ }
509
+ if (part.image instanceof Buffer) {
510
+ return part.image.toString("base64");
511
+ }
512
+ if (part.data instanceof Buffer) {
513
+ return part.data.toString("base64");
514
+ }
515
+ if (part.image instanceof ArrayBuffer) {
516
+ return Buffer.from(new Uint8Array(part.image)).toString("base64");
517
+ }
518
+ if (part.data instanceof ArrayBuffer) {
519
+ return Buffer.from(new Uint8Array(part.data)).toString("base64");
520
+ }
521
+ return null;
522
+ }
523
+ /**
524
+ * Extract file data from a part.
525
+ */
526
+ extractFileData(part) {
527
+ if (typeof part.data === "string") {
528
+ return part.data;
529
+ }
530
+ if (part.data instanceof Buffer) {
531
+ return part.data.toString("base64");
532
+ }
533
+ if (part.data instanceof ArrayBuffer) {
534
+ return Buffer.from(new Uint8Array(part.data)).toString("base64");
535
+ }
536
+ return null;
537
+ }
538
+ /**
539
+ * Check if result has multimodal content array
540
+ */
541
+ hasMultimodalContent(result) {
542
+ return result !== null && typeof result === "object" && "content" in result && Array.isArray(result.content);
543
+ }
544
+ /**
545
+ * Constants for pruning thresholds
546
+ */
547
+ static PRUNE_PROTECT = 4e4;
548
+ // Keep last 40K tokens of tool outputs
549
+ static PRUNE_MINIMUM = 2e4;
550
+ // Only prune if we can save 20K+
551
+ /**
552
+ * Prunes old tool outputs by marking them with compactedAt timestamp.
553
+ * Does NOT modify content - transformation happens at format time in
554
+ * ContextManager.getFormattedMessagesWithCompression().
555
+ *
556
+ * Algorithm:
557
+ * 1. Go backwards through history (most recent first)
558
+ * 2. Stop at summary message (only process post-summary messages)
559
+ * 3. Count tool message tokens
560
+ * 4. If total exceeds PRUNE_PROTECT, mark older ones for pruning
561
+ * 5. Only prune if savings exceed PRUNE_MINIMUM
562
+ */
563
+ async pruneOldToolOutputs() {
564
+ const history = await this.contextManager.getHistory();
565
+ let totalToolTokens = 0;
566
+ let prunedTokens = 0;
567
+ const toPrune = [];
568
+ for (let i = history.length - 1; i >= 0; i--) {
569
+ const msg = history[i];
570
+ if (!msg) continue;
571
+ if (msg.metadata?.isSummary === true) break;
572
+ if (msg.role !== "tool") continue;
573
+ if (msg.compactedAt) continue;
574
+ if (!Array.isArray(msg.content)) continue;
575
+ const tokens = this.estimateToolTokens(msg.content);
576
+ totalToolTokens += tokens;
577
+ if (totalToolTokens > TurnExecutor.PRUNE_PROTECT && msg.id) {
578
+ prunedTokens += tokens;
579
+ toPrune.push(msg.id);
580
+ }
581
+ }
582
+ if (prunedTokens > TurnExecutor.PRUNE_MINIMUM && toPrune.length > 0) {
583
+ const markedCount = await this.contextManager.markMessagesAsCompacted(toPrune);
584
+ this.eventBus.emit("context:pruned", {
585
+ prunedCount: markedCount,
586
+ savedTokens: prunedTokens
587
+ });
588
+ this.logger.debug(`Pruned ${markedCount} tool outputs, saving ~${prunedTokens} tokens`);
589
+ return { prunedCount: markedCount, savedTokens: prunedTokens };
590
+ }
591
+ return { prunedCount: 0, savedTokens: 0 };
592
+ }
593
+ /**
594
+ * Estimates tokens for tool message content using simple heuristic (length/4).
595
+ * Used for pruning decisions only - actual token counts come from API.
596
+ *
597
+ * Tool message content is always Array<TextPart | ImagePart | FilePart | UIResourcePart>
598
+ * after sanitization via SanitizedToolResult.
599
+ */
600
+ estimateToolTokens(content) {
601
+ return content.reduce((sum, part) => {
602
+ if (part.type === "text") {
603
+ return sum + Math.ceil(part.text.length / 4);
604
+ }
605
+ if (part.type === "image" || part.type === "file") {
606
+ return sum + 1e3;
607
+ }
608
+ return sum;
609
+ }, 0);
610
+ }
611
+ /**
612
+ * Cleanup resources when execution scope exits.
613
+ * Called automatically via defer() on normal exit, throw, or abort.
614
+ */
615
+ cleanup() {
616
+ this.logger.debug("TurnExecutor cleanup triggered");
617
+ if (!this.stepAbortController.signal.aborted) {
618
+ this.stepAbortController.abort();
619
+ }
620
+ this.messageQueue.clear();
621
+ }
622
+ /**
623
+ * Check if context has overflowed based on actual token usage from API.
624
+ */
625
+ checkAndHandleOverflow(tokens) {
626
+ if (!this.modelLimits || !this.compressionStrategy) {
627
+ return false;
628
+ }
629
+ return (0, import_overflow.isOverflow)(tokens, this.modelLimits);
630
+ }
631
+ /**
632
+ * Compress context using ReactiveOverflowStrategy.
633
+ *
634
+ * Generates a summary of older messages and adds it to history.
635
+ * The actual token reduction happens at read-time via filterCompacted()
636
+ * in getFormattedMessagesWithCompression().
637
+ *
638
+ * @param originalTokens The actual input token count from API that triggered overflow
639
+ */
640
+ async compress(originalTokens) {
641
+ if (!this.compressionStrategy) {
642
+ return;
643
+ }
644
+ this.logger.info(
645
+ `Context overflow detected (${originalTokens} tokens), running compression`
646
+ );
647
+ const history = await this.contextManager.getHistory();
648
+ const summaryMessages = await this.compressionStrategy.compress(history);
649
+ if (summaryMessages.length === 0) {
650
+ this.logger.debug("Compression returned no summary (history too short)");
651
+ return;
652
+ }
653
+ for (const summary of summaryMessages) {
654
+ await this.contextManager.addMessage(summary);
655
+ }
656
+ const { filterCompacted, estimateMessagesTokens } = await import("../../context/utils.js");
657
+ const updatedHistory = await this.contextManager.getHistory();
658
+ const filteredHistory = filterCompacted(updatedHistory);
659
+ const compressedTokens = estimateMessagesTokens(filteredHistory);
660
+ this.eventBus.emit("context:compressed", {
661
+ originalTokens,
662
+ compressedTokens,
663
+ originalMessages: history.length,
664
+ compressedMessages: filteredHistory.length,
665
+ strategy: this.compressionStrategy.name,
666
+ reason: "overflow"
667
+ });
668
+ this.logger.info(
669
+ `Compression complete: ${originalTokens} \u2192 ~${compressedTokens} tokens (${history.length} \u2192 ${filteredHistory.length} messages after filtering)`
670
+ );
671
+ }
672
+ /**
673
+ * Set telemetry span attributes for token usage.
674
+ */
675
+ setTelemetryAttributes(usage) {
676
+ const activeSpan = import_api.trace.getActiveSpan();
677
+ if (!activeSpan || !usage) {
678
+ return;
679
+ }
680
+ if (usage.inputTokens !== void 0) {
681
+ activeSpan.setAttribute("gen_ai.usage.input_tokens", usage.inputTokens);
682
+ }
683
+ if (usage.outputTokens !== void 0) {
684
+ activeSpan.setAttribute("gen_ai.usage.output_tokens", usage.outputTokens);
685
+ }
686
+ if (usage.totalTokens !== void 0) {
687
+ activeSpan.setAttribute("gen_ai.usage.total_tokens", usage.totalTokens);
688
+ }
689
+ if (usage.reasoningTokens !== void 0) {
690
+ activeSpan.setAttribute("gen_ai.usage.reasoning_tokens", usage.reasoningTokens);
691
+ }
692
+ }
693
+ /**
694
+ * Map provider errors to DextoRuntimeError.
695
+ */
696
+ mapProviderError(err) {
697
+ if (import_ai.APICallError.isInstance?.(err)) {
698
+ const status = err.statusCode;
699
+ const headers = err.responseHeaders || {};
700
+ const retryAfter = headers["retry-after"] ? Number(headers["retry-after"]) : void 0;
701
+ const body = typeof err.responseBody === "string" ? err.responseBody : JSON.stringify(err.responseBody ?? "");
702
+ if (status === 429) {
703
+ return new import_DextoRuntimeError.DextoRuntimeError(
704
+ import_error_codes.LLMErrorCode.RATE_LIMIT_EXCEEDED,
705
+ import_types7.ErrorScope.LLM,
706
+ import_types7.ErrorType.RATE_LIMIT,
707
+ `Rate limit exceeded${body ? ` - ${body}` : ""}`,
708
+ {
709
+ sessionId: this.sessionId,
710
+ provider: this.llmContext.provider,
711
+ model: this.llmContext.model,
712
+ status,
713
+ retryAfter,
714
+ body
715
+ }
716
+ );
717
+ }
718
+ if (status === 408) {
719
+ return new import_DextoRuntimeError.DextoRuntimeError(
720
+ import_error_codes.LLMErrorCode.GENERATION_FAILED,
721
+ import_types7.ErrorScope.LLM,
722
+ import_types7.ErrorType.TIMEOUT,
723
+ `Provider timed out${body ? ` - ${body}` : ""}`,
724
+ {
725
+ sessionId: this.sessionId,
726
+ provider: this.llmContext.provider,
727
+ model: this.llmContext.model,
728
+ status,
729
+ body
730
+ }
731
+ );
732
+ }
733
+ return new import_DextoRuntimeError.DextoRuntimeError(
734
+ import_error_codes.LLMErrorCode.GENERATION_FAILED,
735
+ import_types7.ErrorScope.LLM,
736
+ import_types7.ErrorType.THIRD_PARTY,
737
+ `Provider error ${status}${body ? ` - ${body}` : ""}`,
738
+ {
739
+ sessionId: this.sessionId,
740
+ provider: this.llmContext.provider,
741
+ model: this.llmContext.model,
742
+ status,
743
+ body
744
+ }
745
+ );
746
+ }
747
+ return (0, import_error_conversion.toError)(err, this.logger);
748
+ }
749
+ }
750
+ // Annotate the CommonJS export names for ESM import in node:
751
+ 0 && (module.exports = {
752
+ TurnExecutor
753
+ });