@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,5 +1,5 @@
1
1
  import type { ContextManager } from '../context/index.js';
2
- import type { ILLMService } from '../llm/services/types.js';
2
+ import type { VercelLLMService } from '../llm/services/vercel.js';
3
3
  import type { SystemPromptManager } from '../systemPrompt/manager.js';
4
4
  import type { ToolManager } from '../tools/tool-manager.js';
5
5
  import type { ValidatedLLMConfig } from '../llm/schemas.js';
@@ -10,6 +10,8 @@ import type { MCPManager } from '../mcp/manager.js';
10
10
  import { SessionEventBus, AgentEventBus } from '../events/index.js';
11
11
  import type { IDextoLogger } from '../logger/v2/types.js';
12
12
  import type { InternalMessage } from '../context/types.js';
13
+ import type { UserMessageInput } from './message-queue.js';
14
+ import type { ContentInput } from '../agent/types.js';
13
15
  /**
14
16
  * Represents an isolated conversation session within a Dexto agent.
15
17
  *
@@ -52,7 +54,7 @@ import type { InternalMessage } from '../context/types.js';
52
54
  *
53
55
  * @see {@link SessionManager} for session lifecycle management
54
56
  * @see {@link ContextManager} for conversation history management
55
- * @see {@link ILLMService} for AI model interaction interface
57
+ * @see {@link VercelLLMService} for AI model interaction
56
58
  */
57
59
  export declare class ChatSession {
58
60
  private services;
@@ -86,6 +88,10 @@ export declare class ChatSession {
86
88
  * Stores the bound functions so they can be removed from the event bus.
87
89
  */
88
90
  private forwarders;
91
+ /**
92
+ * Token accumulator listener for cleanup.
93
+ */
94
+ private tokenAccumulatorListener;
89
95
  /**
90
96
  * AbortController for the currently running turn, if any.
91
97
  * Calling cancel() aborts the in-flight LLM request and tool execution checks.
@@ -129,6 +135,11 @@ export declare class ChatSession {
129
135
  * information when needed.
130
136
  */
131
137
  private setupEventForwarding;
138
+ /**
139
+ * Sets up token usage accumulation by listening to llm:response events.
140
+ * Accumulates token usage and cost to session metadata for /stats tracking.
141
+ */
142
+ private setupTokenAccumulation;
132
143
  /**
133
144
  * Initializes session-specific services.
134
145
  */
@@ -146,36 +157,33 @@ export declare class ChatSession {
146
157
  */
147
158
  private saveBlockedInteraction;
148
159
  /**
149
- * Processes user input through the session's LLM service and returns the response.
150
- *
151
- * This method:
152
- * 1. Takes user input (text, optionally with image or file data)
153
- * 2. Passes it to the LLM service for processing
154
- * 3. Returns the AI's response text
160
+ * Stream a response for the given content.
161
+ * Primary method for running conversations with multi-image support.
155
162
  *
156
- * The method handles both text-only and multimodal input (text + images/files).
157
- * Tool calls and conversation management are handled internally by the LLM service.
158
- *
159
- * @param input - The user's text input
160
- * @param imageDataInput - Optional image data for multimodal input
161
- * @param fileDataInput - Optional file data for file input
162
- * @param stream - Optional flag to enable streaming responses
163
+ * @param content - String or ContentPart[] (text, images, files)
164
+ * @param options - { signal?: AbortSignal }
163
165
  * @returns Promise that resolves to the AI's response text
164
166
  *
165
167
  * @example
166
168
  * ```typescript
167
- * const response = await session.run('What is the weather like today?');
168
- * console.log(response); // "I'll check the weather for you..."
169
+ * // Text only
170
+ * const response = await session.stream('What is the weather?');
171
+ *
172
+ * // Multiple images
173
+ * const response = await session.stream([
174
+ * { type: 'text', text: 'Compare these images' },
175
+ * { type: 'image', image: base64Data1, mimeType: 'image/png' },
176
+ * { type: 'image', image: base64Data2, mimeType: 'image/png' }
177
+ * ]);
169
178
  * ```
170
179
  */
171
- run(input: string, imageDataInput?: {
172
- image: string;
173
- mimeType: string;
174
- }, fileDataInput?: {
175
- data: string;
176
- mimeType: string;
177
- filename?: string;
178
- }, stream?: boolean): Promise<string>;
180
+ stream(content: ContentInput, options?: {
181
+ signal?: AbortSignal;
182
+ }): Promise<string>;
183
+ /**
184
+ * Combine multiple abort signals into one.
185
+ */
186
+ private combineSignals;
179
187
  /**
180
188
  * Retrieves the complete conversation history for this session.
181
189
  *
@@ -231,15 +239,15 @@ export declare class ChatSession {
231
239
  *
232
240
  * @returns The LLMService for this session
233
241
  */
234
- getLLMService(): ILLMService;
242
+ getLLMService(): VercelLLMService;
235
243
  /**
236
244
  * Switches the LLM service for this session while preserving conversation history.
237
245
  *
238
- * This method creates a new LLM service with the specified configuration and router,
246
+ * This method creates a new LLM service with the specified configuration,
239
247
  * while maintaining the existing ContextManager and conversation history. This allows
240
248
  * users to change AI models mid-conversation without losing context.
241
249
  *
242
- * @param newLLMConfig The new LLM configuration to use (includes router)
250
+ * @param newLLMConfig The new LLM configuration to use
243
251
  *
244
252
  * @example
245
253
  * ```typescript
@@ -248,7 +256,6 @@ export declare class ChatSession {
248
256
  * provider: 'openai',
249
257
  * model: 'gpt-5',
250
258
  * apiKey: process.env.OPENAI_API_KEY,
251
- * router: 'in-built'
252
259
  * });
253
260
  * ```
254
261
  */
@@ -267,6 +274,39 @@ export declare class ChatSession {
267
274
  * Without this cleanup, sessions would remain in memory due to listener references.
268
275
  */
269
276
  dispose(): void;
277
+ /**
278
+ * Check if this session is currently processing a message.
279
+ * Returns true if a run is in progress and has not been aborted.
280
+ */
281
+ isBusy(): boolean;
282
+ /**
283
+ * Queue a message for processing when the session is busy.
284
+ * The message will be injected into the conversation when the current turn completes.
285
+ *
286
+ * @param message The user message to queue
287
+ * @returns Queue position and message ID
288
+ */
289
+ queueMessage(message: UserMessageInput): {
290
+ queued: true;
291
+ position: number;
292
+ id: string;
293
+ };
294
+ /**
295
+ * Get all messages currently in the queue.
296
+ * @returns Array of queued messages
297
+ */
298
+ getQueuedMessages(): import('./types.js').QueuedMessage[];
299
+ /**
300
+ * Remove a queued message.
301
+ * @param id Message ID to remove
302
+ * @returns true if message was found and removed; false otherwise
303
+ */
304
+ removeQueuedMessage(id: string): boolean;
305
+ /**
306
+ * Clear all queued messages.
307
+ * @returns Number of messages that were cleared
308
+ */
309
+ clearMessageQueue(): number;
270
310
  /**
271
311
  * Cancel the currently running turn for this session, if any.
272
312
  * Returns true if a run was in progress and was signaled to abort.
@@ -1 +1 @@
1
- {"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
2
  import { createDatabaseHistoryProvider } from "./history/factory.js";
3
3
  import { createLLMService } from "../llm/services/factory.js";
4
4
  import {
@@ -8,6 +8,7 @@ import {
8
8
  import { DextoLogComponent } from "../logger/v2/types.js";
9
9
  import { DextoRuntimeError, ErrorScope, ErrorType } from "../errors/index.js";
10
10
  import { PluginErrorCode } from "../plugins/error-codes.js";
11
+ import { getModelPricing, calculateCost } from "../llm/registry.js";
11
12
  class ChatSession {
12
13
  /**
13
14
  * Creates a new ChatSession instance.
@@ -58,6 +59,10 @@ class ChatSession {
58
59
  * Stores the bound functions so they can be removed from the event bus.
59
60
  */
60
61
  forwarders = /* @__PURE__ */ new Map();
62
+ /**
63
+ * Token accumulator listener for cleanup.
64
+ */
65
+ tokenAccumulatorListener = null;
61
66
  /**
62
67
  * AbortController for the currently running turn, if any.
63
68
  * Calling cancel() aborts the in-flight LLM request and tool execution checks.
@@ -88,10 +93,33 @@ class ChatSession {
88
93
  this.forwarders.set(eventName, forwarder);
89
94
  this.eventBus.on(eventName, forwarder);
90
95
  });
96
+ this.setupTokenAccumulation();
91
97
  this.logger.debug(
92
98
  `[setupEventForwarding] Event forwarding setup complete for session=${this.id}`
93
99
  );
94
100
  }
101
+ /**
102
+ * Sets up token usage accumulation by listening to llm:response events.
103
+ * Accumulates token usage and cost to session metadata for /stats tracking.
104
+ */
105
+ setupTokenAccumulation() {
106
+ this.tokenAccumulatorListener = (payload) => {
107
+ if (payload.tokenUsage) {
108
+ let cost;
109
+ const llmConfig = this.services.stateManager.getLLMConfig(this.id);
110
+ const pricing = getModelPricing(llmConfig.provider, llmConfig.model);
111
+ if (pricing) {
112
+ cost = calculateCost(payload.tokenUsage, pricing);
113
+ }
114
+ this.services.sessionManager.accumulateTokenUsage(this.id, payload.tokenUsage, cost).catch((err) => {
115
+ this.logger.warn(
116
+ `Failed to accumulate token usage: ${err instanceof Error ? err.message : String(err)}`
117
+ );
118
+ });
119
+ }
120
+ };
121
+ this.eventBus.on("llm:response", this.tokenAccumulatorListener);
122
+ }
95
123
  /**
96
124
  * Initializes session-specific services.
97
125
  */
@@ -104,7 +132,6 @@ class ChatSession {
104
132
  );
105
133
  this.llmService = createLLMService(
106
134
  llmConfig,
107
- llmConfig.router,
108
135
  this.services.toolManager,
109
136
  this.services.systemPromptManager,
110
137
  this.historyProvider,
@@ -133,12 +160,12 @@ class ChatSession {
133
160
  async saveBlockedInteraction(userInput, errorMessage, _imageData, _fileData) {
134
161
  const userMessage = {
135
162
  role: "user",
136
- content: "[Blocked by content policy: input redacted]"
163
+ content: [{ type: "text", text: "[Blocked by content policy: input redacted]" }]
137
164
  };
138
165
  const errorContent = `Error: ${errorMessage}`;
139
166
  const assistantMessage = {
140
167
  role: "assistant",
141
- content: errorContent
168
+ content: [{ type: "text", text: errorContent }]
142
169
  };
143
170
  await this.historyProvider.saveMessage(userMessage);
144
171
  await this.historyProvider.saveMessage(assistantMessage);
@@ -146,44 +173,61 @@ class ChatSession {
146
173
  this.eventBus.emit("llm:response", {
147
174
  content: errorContent,
148
175
  provider: llmConfig.provider,
149
- model: llmConfig.model,
150
- router: llmConfig.router
176
+ model: llmConfig.model
151
177
  });
152
178
  }
153
179
  /**
154
- * Processes user input through the session's LLM service and returns the response.
180
+ * Stream a response for the given content.
181
+ * Primary method for running conversations with multi-image support.
155
182
  *
156
- * This method:
157
- * 1. Takes user input (text, optionally with image or file data)
158
- * 2. Passes it to the LLM service for processing
159
- * 3. Returns the AI's response text
160
- *
161
- * The method handles both text-only and multimodal input (text + images/files).
162
- * Tool calls and conversation management are handled internally by the LLM service.
163
- *
164
- * @param input - The user's text input
165
- * @param imageDataInput - Optional image data for multimodal input
166
- * @param fileDataInput - Optional file data for file input
167
- * @param stream - Optional flag to enable streaming responses
183
+ * @param content - String or ContentPart[] (text, images, files)
184
+ * @param options - { signal?: AbortSignal }
168
185
  * @returns Promise that resolves to the AI's response text
169
186
  *
170
187
  * @example
171
188
  * ```typescript
172
- * const response = await session.run('What is the weather like today?');
173
- * console.log(response); // "I'll check the weather for you..."
189
+ * // Text only
190
+ * const response = await session.stream('What is the weather?');
191
+ *
192
+ * // Multiple images
193
+ * const response = await session.stream([
194
+ * { type: 'text', text: 'Compare these images' },
195
+ * { type: 'image', image: base64Data1, mimeType: 'image/png' },
196
+ * { type: 'image', image: base64Data2, mimeType: 'image/png' }
197
+ * ]);
174
198
  * ```
175
199
  */
176
- async run(input, imageDataInput, fileDataInput, stream) {
200
+ async stream(content, options) {
201
+ const parts = typeof content === "string" ? [{ type: "text", text: content }] : content;
202
+ const textParts = parts.filter(
203
+ (p) => p.type === "text"
204
+ );
205
+ const imageParts = parts.filter((p) => p.type === "image");
206
+ const fileParts = parts.filter((p) => p.type === "file");
177
207
  this.logger.debug(
178
- `Running session ${this.id} | input.len=${input?.length ?? 0} | image=${imageDataInput ? imageDataInput.mimeType : "none"} | file=${fileDataInput ? `${fileDataInput.mimeType}:${fileDataInput.filename ?? "unknown"}` : "none"}`
208
+ `Streaming session ${this.id} | textParts=${textParts.length} | images=${imageParts.length} | files=${fileParts.length}`
179
209
  );
180
210
  this.currentRunController = new AbortController();
181
- const signal = this.currentRunController.signal;
211
+ const signal = options?.signal ? this.combineSignals(options.signal, this.currentRunController.signal) : this.currentRunController.signal;
182
212
  try {
213
+ const textContent = textParts.map((p) => p.text).join("\n");
214
+ const firstImage = imageParts[0];
215
+ const firstFile = fileParts[0];
183
216
  const beforeLLMPayload = {
184
- text: input,
185
- ...imageDataInput !== void 0 && { imageData: imageDataInput },
186
- ...fileDataInput !== void 0 && { fileData: fileDataInput },
217
+ text: textContent,
218
+ ...firstImage && {
219
+ imageData: {
220
+ image: typeof firstImage.image === "string" ? firstImage.image : "[binary]",
221
+ mimeType: firstImage.mimeType || "image/jpeg"
222
+ }
223
+ },
224
+ ...firstFile && {
225
+ fileData: {
226
+ data: typeof firstFile.data === "string" ? firstFile.data : "[binary]",
227
+ mimeType: firstFile.mimeType,
228
+ ...firstFile.filename && { filename: firstFile.filename }
229
+ }
230
+ },
187
231
  sessionId: this.id
188
232
  };
189
233
  const modifiedBeforePayload = await this.services.pluginManager.executePlugins(
@@ -198,22 +242,17 @@ class ChatSession {
198
242
  abortSignal: signal
199
243
  }
200
244
  );
201
- const finalInput = modifiedBeforePayload.text;
202
- const finalImageData = modifiedBeforePayload.imageData;
203
- const finalFileData = modifiedBeforePayload.fileData;
204
- const response = await this.llmService.completeTask(
205
- finalInput,
206
- { signal },
207
- finalImageData,
208
- finalFileData,
209
- stream
210
- );
245
+ let modifiedParts = [...parts];
246
+ if (modifiedBeforePayload.text !== textContent && textParts.length > 0) {
247
+ modifiedParts = modifiedParts.filter((p) => p.type !== "text");
248
+ modifiedParts.unshift({ type: "text", text: modifiedBeforePayload.text });
249
+ }
250
+ const response = await this.llmService.stream(modifiedParts, { signal });
211
251
  const llmConfig = this.services.stateManager.getLLMConfig(this.id);
212
252
  const beforeResponsePayload = {
213
253
  content: response,
214
254
  provider: llmConfig.provider,
215
255
  model: llmConfig.model,
216
- router: llmConfig.router,
217
256
  sessionId: this.id
218
257
  };
219
258
  const modifiedResponsePayload = await this.services.pluginManager.executePlugins(
@@ -237,16 +276,21 @@ class ChatSession {
237
276
  context: "user_cancelled",
238
277
  recoverable: true
239
278
  });
279
+ try {
280
+ const history = await this.getHistory();
281
+ const lastAssistant = history.filter((m) => m.role === "assistant").pop();
282
+ if (lastAssistant && typeof lastAssistant.content === "string") {
283
+ return lastAssistant.content;
284
+ }
285
+ } catch {
286
+ this.logger.debug("Failed to retrieve partial response from history on cancel");
287
+ }
240
288
  return "";
241
289
  }
242
290
  if (error instanceof DextoRuntimeError && error.code === PluginErrorCode.PLUGIN_BLOCKED_EXECUTION && error.scope === ErrorScope.PLUGIN && error.type === ErrorType.FORBIDDEN) {
291
+ const textContent = parts.filter((p) => p.type === "text").map((p) => p.text).join("\n");
243
292
  try {
244
- await this.saveBlockedInteraction(
245
- input,
246
- error.message,
247
- imageDataInput,
248
- fileDataInput
249
- );
293
+ await this.saveBlockedInteraction(textContent, error.message);
250
294
  this.logger.debug(
251
295
  `ChatSession ${this.id}: Saved blocked interaction to history`
252
296
  );
@@ -257,15 +301,27 @@ class ChatSession {
257
301
  }
258
302
  return error.message;
259
303
  }
260
- const errortype = error instanceof Error ? "object" : "string";
261
304
  this.logger.error(
262
- `Error in ChatSession.run: errortype=${errortype}: ${error instanceof Error ? error.message : String(error)}`
305
+ `Error in ChatSession.stream: ${error instanceof Error ? error.message : String(error)}`
263
306
  );
264
307
  throw error;
265
308
  } finally {
266
309
  this.currentRunController = null;
267
310
  }
268
311
  }
312
+ /**
313
+ * Combine multiple abort signals into one.
314
+ */
315
+ combineSignals(signal1, signal2) {
316
+ const controller = new AbortController();
317
+ const onAbort = () => controller.abort();
318
+ signal1.addEventListener("abort", onAbort);
319
+ signal2.addEventListener("abort", onAbort);
320
+ if (signal1.aborted || signal2.aborted) {
321
+ controller.abort();
322
+ }
323
+ return controller.signal;
324
+ }
269
325
  /**
270
326
  * Retrieves the complete conversation history for this session.
271
327
  *
@@ -336,11 +392,11 @@ class ChatSession {
336
392
  /**
337
393
  * Switches the LLM service for this session while preserving conversation history.
338
394
  *
339
- * This method creates a new LLM service with the specified configuration and router,
395
+ * This method creates a new LLM service with the specified configuration,
340
396
  * while maintaining the existing ContextManager and conversation history. This allows
341
397
  * users to change AI models mid-conversation without losing context.
342
398
  *
343
- * @param newLLMConfig The new LLM configuration to use (includes router)
399
+ * @param newLLMConfig The new LLM configuration to use
344
400
  *
345
401
  * @example
346
402
  * ```typescript
@@ -349,16 +405,13 @@ class ChatSession {
349
405
  * provider: 'openai',
350
406
  * model: 'gpt-5',
351
407
  * apiKey: process.env.OPENAI_API_KEY,
352
- * router: 'in-built'
353
408
  * });
354
409
  * ```
355
410
  */
356
411
  async switchLLM(newLLMConfig) {
357
412
  try {
358
- const router = newLLMConfig.router;
359
413
  const newLLMService = createLLMService(
360
414
  newLLMConfig,
361
- router,
362
415
  this.services.toolManager,
363
416
  this.services.systemPromptManager,
364
417
  this.historyProvider,
@@ -375,7 +428,6 @@ class ChatSession {
375
428
  );
376
429
  this.eventBus.emit("llm:switched", {
377
430
  newConfig: newLLMConfig,
378
- router,
379
431
  historyRetained: true
380
432
  });
381
433
  } catch (error) {
@@ -416,8 +468,54 @@ class ChatSession {
416
468
  this.eventBus.off(eventName, forwarder);
417
469
  });
418
470
  this.forwarders.clear();
471
+ if (this.tokenAccumulatorListener) {
472
+ this.eventBus.off("llm:response", this.tokenAccumulatorListener);
473
+ this.tokenAccumulatorListener = null;
474
+ }
419
475
  this.logger.debug(`Session ${this.id} disposed successfully`);
420
476
  }
477
+ /**
478
+ * Check if this session is currently processing a message.
479
+ * Returns true if a run is in progress and has not been aborted.
480
+ */
481
+ isBusy() {
482
+ return this.currentRunController !== null && !this.currentRunController.signal.aborted;
483
+ }
484
+ /**
485
+ * Queue a message for processing when the session is busy.
486
+ * The message will be injected into the conversation when the current turn completes.
487
+ *
488
+ * @param message The user message to queue
489
+ * @returns Queue position and message ID
490
+ */
491
+ queueMessage(message) {
492
+ return this.llmService.getMessageQueue().enqueue(message);
493
+ }
494
+ /**
495
+ * Get all messages currently in the queue.
496
+ * @returns Array of queued messages
497
+ */
498
+ getQueuedMessages() {
499
+ return this.llmService.getMessageQueue().getAll();
500
+ }
501
+ /**
502
+ * Remove a queued message.
503
+ * @param id Message ID to remove
504
+ * @returns true if message was found and removed; false otherwise
505
+ */
506
+ removeQueuedMessage(id) {
507
+ return this.llmService.getMessageQueue().remove(id);
508
+ }
509
+ /**
510
+ * Clear all queued messages.
511
+ * @returns Number of messages that were cleared
512
+ */
513
+ clearMessageQueue() {
514
+ const queue = this.llmService.getMessageQueue();
515
+ const count = queue.pendingCount();
516
+ queue.clear();
517
+ return count;
518
+ }
421
519
  /**
422
520
  * Cancel the currently running turn for this session, if any.
423
521
  * Returns true if a run was in progress and was signaled to abort.
@@ -1,4 +1,4 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
2
  var SessionErrorCode = /* @__PURE__ */ ((SessionErrorCode2) => {
3
3
  SessionErrorCode2["SESSION_NOT_FOUND"] = "session_not_found";
4
4
  SessionErrorCode2["SESSION_INITIALIZATION_FAILED"] = "session_initialization_failed";
@@ -1,4 +1,4 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
2
  import { DextoRuntimeError } from "../errors/DextoRuntimeError.js";
3
3
  import { ErrorScope, ErrorType } from "../errors/types.js";
4
4
  import { SessionErrorCode } from "./error-codes.js";