@dexto/core 1.2.6 → 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 (515) hide show
  1. package/README.md +55 -13
  2. package/dist/agent/DextoAgent.cjs +627 -228
  3. package/dist/agent/DextoAgent.d.ts +157 -34
  4. package/dist/agent/DextoAgent.d.ts.map +1 -1
  5. package/dist/agent/DextoAgent.js +625 -227
  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 +4 -1
  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 +7 -3
  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 -11
  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 +20 -5
  36. package/dist/approval/schemas.d.ts +127 -52
  37. package/dist/approval/schemas.d.ts.map +1 -1
  38. package/dist/approval/schemas.js +21 -6
  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/factory.cjs → context/compression/overflow.cjs} +20 -21
  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 +287 -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 +287 -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 +185 -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.cjs +1 -0
  81. package/dist/errors/types.d.ts +4 -2
  82. package/dist/errors/types.d.ts.map +1 -1
  83. package/dist/errors/types.js +2 -1
  84. package/dist/events/index.cjs +22 -2
  85. package/dist/events/index.d.ts +170 -62
  86. package/dist/events/index.d.ts.map +1 -1
  87. package/dist/events/index.js +23 -3
  88. package/dist/filesystem/error-codes.js +1 -1
  89. package/dist/filesystem/errors.js +1 -1
  90. package/dist/filesystem/filesystem-service.js +1 -1
  91. package/dist/filesystem/index.js +1 -1
  92. package/dist/filesystem/path-validator.js +1 -1
  93. package/dist/index.browser.cjs +23 -8
  94. package/dist/index.browser.d.ts +4 -3
  95. package/dist/index.browser.d.ts.map +1 -1
  96. package/dist/index.browser.js +20 -3
  97. package/dist/index.js +1 -1
  98. package/dist/llm/error-codes.cjs +0 -1
  99. package/dist/llm/error-codes.d.ts +0 -1
  100. package/dist/llm/error-codes.d.ts.map +1 -1
  101. package/dist/llm/error-codes.js +1 -2
  102. package/dist/llm/errors.cjs +10 -10
  103. package/dist/llm/errors.d.ts +5 -6
  104. package/dist/llm/errors.d.ts.map +1 -1
  105. package/dist/llm/errors.js +12 -12
  106. package/dist/llm/executor/stream-processor.cjs +367 -0
  107. package/dist/llm/executor/stream-processor.d.ts +55 -0
  108. package/dist/llm/executor/stream-processor.d.ts.map +1 -0
  109. package/dist/llm/executor/stream-processor.js +344 -0
  110. package/dist/llm/executor/tool-output-truncator.cjs +75 -0
  111. package/dist/llm/executor/tool-output-truncator.d.ts +27 -0
  112. package/dist/llm/executor/tool-output-truncator.d.ts.map +1 -0
  113. package/dist/llm/executor/tool-output-truncator.js +48 -0
  114. package/dist/llm/executor/turn-executor.cjs +753 -0
  115. package/dist/llm/executor/turn-executor.d.ts +166 -0
  116. package/dist/llm/executor/turn-executor.d.ts.map +1 -0
  117. package/dist/llm/executor/turn-executor.js +684 -0
  118. package/dist/llm/executor/types.d.ts +27 -0
  119. package/dist/llm/executor/types.d.ts.map +1 -0
  120. package/dist/llm/formatters/vercel.cjs +20 -186
  121. package/dist/llm/formatters/vercel.d.ts +2 -14
  122. package/dist/llm/formatters/vercel.d.ts.map +1 -1
  123. package/dist/llm/formatters/vercel.js +19 -185
  124. package/dist/llm/registry.cjs +36 -45
  125. package/dist/llm/registry.d.ts +53 -39
  126. package/dist/llm/registry.d.ts.map +1 -1
  127. package/dist/llm/registry.js +34 -42
  128. package/dist/llm/resolver.cjs +1 -31
  129. package/dist/llm/resolver.d.ts.map +1 -1
  130. package/dist/llm/resolver.js +2 -34
  131. package/dist/llm/schemas.cjs +2 -17
  132. package/dist/llm/schemas.d.ts +10 -23
  133. package/dist/llm/schemas.d.ts.map +1 -1
  134. package/dist/llm/schemas.js +5 -22
  135. package/dist/llm/services/factory.cjs +3 -92
  136. package/dist/llm/services/factory.d.ts +14 -4
  137. package/dist/llm/services/factory.d.ts.map +1 -1
  138. package/dist/llm/services/factory.js +4 -83
  139. package/dist/llm/services/test-utils.integration.cjs +6 -8
  140. package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
  141. package/dist/llm/services/test-utils.integration.js +7 -9
  142. package/dist/llm/services/types.d.ts +1 -28
  143. package/dist/llm/services/types.d.ts.map +1 -1
  144. package/dist/llm/services/vercel.cjs +54 -468
  145. package/dist/llm/services/vercel.d.ts +38 -21
  146. package/dist/llm/services/vercel.d.ts.map +1 -1
  147. package/dist/llm/services/vercel.js +56 -475
  148. package/dist/llm/types.cjs +0 -3
  149. package/dist/llm/types.d.ts +8 -8
  150. package/dist/llm/types.d.ts.map +1 -1
  151. package/dist/llm/types.js +1 -3
  152. package/dist/llm/validation.js +1 -1
  153. package/dist/logger/browser.js +1 -1
  154. package/dist/logger/factory.js +1 -1
  155. package/dist/logger/index.js +1 -1
  156. package/dist/logger/logger.js +1 -1
  157. package/dist/logger/v2/dexto-logger.cjs +34 -6
  158. package/dist/logger/v2/dexto-logger.d.ts +20 -2
  159. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  160. package/dist/logger/v2/dexto-logger.js +35 -7
  161. package/dist/logger/v2/error-codes.js +1 -1
  162. package/dist/logger/v2/errors.js +1 -1
  163. package/dist/logger/v2/schemas.cjs +1 -1
  164. package/dist/logger/v2/schemas.js +2 -2
  165. package/dist/logger/v2/test-utils.cjs +70 -0
  166. package/dist/logger/v2/test-utils.d.ts +17 -0
  167. package/dist/logger/v2/test-utils.d.ts.map +1 -0
  168. package/dist/logger/v2/test-utils.js +46 -0
  169. package/dist/logger/v2/transport-factory.js +1 -1
  170. package/dist/logger/v2/transports/console-transport.js +1 -1
  171. package/dist/logger/v2/transports/file-transport.cjs +6 -0
  172. package/dist/logger/v2/transports/file-transport.d.ts +4 -0
  173. package/dist/logger/v2/transports/file-transport.d.ts.map +1 -1
  174. package/dist/logger/v2/transports/file-transport.js +7 -1
  175. package/dist/logger/v2/types.cjs +1 -0
  176. package/dist/logger/v2/types.d.ts +18 -2
  177. package/dist/logger/v2/types.d.ts.map +1 -1
  178. package/dist/logger/v2/types.js +2 -1
  179. package/dist/mcp/error-codes.cjs +1 -0
  180. package/dist/mcp/error-codes.d.ts +1 -0
  181. package/dist/mcp/error-codes.d.ts.map +1 -1
  182. package/dist/mcp/error-codes.js +2 -1
  183. package/dist/mcp/errors.cjs +13 -0
  184. package/dist/mcp/errors.d.ts +7 -0
  185. package/dist/mcp/errors.d.ts.map +1 -1
  186. package/dist/mcp/errors.js +14 -1
  187. package/dist/mcp/manager.cjs +4 -0
  188. package/dist/mcp/manager.d.ts.map +1 -1
  189. package/dist/mcp/manager.js +5 -1
  190. package/dist/mcp/mcp-client.js +1 -1
  191. package/dist/mcp/resolver.js +1 -1
  192. package/dist/mcp/schemas.cjs +6 -0
  193. package/dist/mcp/schemas.d.ts +52 -0
  194. package/dist/mcp/schemas.d.ts.map +1 -1
  195. package/dist/mcp/schemas.js +6 -1
  196. package/dist/memory/error-codes.js +1 -1
  197. package/dist/memory/errors.js +1 -1
  198. package/dist/memory/index.js +1 -1
  199. package/dist/memory/manager.js +1 -1
  200. package/dist/memory/schemas.d.ts +2 -2
  201. package/dist/memory/schemas.js +1 -1
  202. package/dist/plugins/builtins/content-policy.js +1 -1
  203. package/dist/plugins/builtins/response-sanitizer.js +1 -1
  204. package/dist/plugins/error-codes.cjs +1 -0
  205. package/dist/plugins/error-codes.d.ts +3 -1
  206. package/dist/plugins/error-codes.d.ts.map +1 -1
  207. package/dist/plugins/error-codes.js +2 -1
  208. package/dist/plugins/index.js +1 -1
  209. package/dist/plugins/loader.cjs +25 -5
  210. package/dist/plugins/loader.d.ts.map +1 -1
  211. package/dist/plugins/loader.js +26 -6
  212. package/dist/plugins/manager.js +1 -1
  213. package/dist/plugins/registrations/builtins.js +1 -1
  214. package/dist/plugins/schemas.d.ts +3 -3
  215. package/dist/plugins/schemas.js +1 -1
  216. package/dist/plugins/types.d.ts +0 -1
  217. package/dist/plugins/types.d.ts.map +1 -1
  218. package/dist/process/command-validator.js +1 -1
  219. package/dist/process/error-codes.js +1 -1
  220. package/dist/process/errors.js +1 -1
  221. package/dist/process/index.js +1 -1
  222. package/dist/process/process-service.cjs +78 -26
  223. package/dist/process/process-service.d.ts +6 -1
  224. package/dist/process/process-service.d.ts.map +1 -1
  225. package/dist/process/process-service.js +79 -27
  226. package/dist/process/types.d.ts +2 -2
  227. package/dist/process/types.d.ts.map +1 -1
  228. package/dist/prompts/error-codes.cjs +1 -0
  229. package/dist/prompts/error-codes.d.ts +2 -1
  230. package/dist/prompts/error-codes.d.ts.map +1 -1
  231. package/dist/prompts/error-codes.js +2 -1
  232. package/dist/prompts/errors.cjs +15 -0
  233. package/dist/prompts/errors.d.ts +4 -0
  234. package/dist/prompts/errors.d.ts.map +1 -1
  235. package/dist/prompts/errors.js +16 -1
  236. package/dist/prompts/index.js +1 -1
  237. package/dist/prompts/name-validation.js +1 -1
  238. package/dist/prompts/prompt-manager.cjs +13 -2
  239. package/dist/prompts/prompt-manager.d.ts +7 -0
  240. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  241. package/dist/prompts/prompt-manager.js +14 -3
  242. package/dist/prompts/providers/config-prompt-provider.cjs +12 -3
  243. package/dist/prompts/providers/config-prompt-provider.d.ts +2 -1
  244. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  245. package/dist/prompts/providers/config-prompt-provider.js +13 -4
  246. package/dist/prompts/providers/custom-prompt-provider.cjs +2 -2
  247. package/dist/prompts/providers/custom-prompt-provider.d.ts +1 -1
  248. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  249. package/dist/prompts/providers/custom-prompt-provider.js +3 -3
  250. package/dist/prompts/providers/mcp-prompt-provider.js +1 -1
  251. package/dist/prompts/schemas.d.ts +12 -0
  252. package/dist/prompts/schemas.d.ts.map +1 -1
  253. package/dist/prompts/schemas.js +1 -1
  254. package/dist/prompts/types.d.ts +2 -0
  255. package/dist/prompts/types.d.ts.map +1 -1
  256. package/dist/prompts/utils.js +1 -1
  257. package/dist/resources/error-codes.js +1 -1
  258. package/dist/resources/errors.js +1 -1
  259. package/dist/resources/handlers/blob-handler.js +1 -1
  260. package/dist/resources/handlers/factory.js +1 -1
  261. package/dist/resources/handlers/filesystem-handler.js +1 -1
  262. package/dist/resources/index.js +1 -1
  263. package/dist/resources/internal-provider.js +1 -1
  264. package/dist/resources/manager.js +1 -1
  265. package/dist/resources/reference-parser.js +1 -1
  266. package/dist/resources/schemas.js +1 -1
  267. package/dist/search/index.js +1 -1
  268. package/dist/search/search-service.js +1 -1
  269. package/dist/session/chat-session.cjs +149 -51
  270. package/dist/session/chat-session.d.ts +69 -29
  271. package/dist/session/chat-session.d.ts.map +1 -1
  272. package/dist/session/chat-session.js +150 -52
  273. package/dist/session/error-codes.js +1 -1
  274. package/dist/session/errors.js +1 -1
  275. package/dist/session/history/database.cjs +134 -21
  276. package/dist/session/history/database.d.ts +37 -8
  277. package/dist/session/history/database.d.ts.map +1 -1
  278. package/dist/session/history/database.js +135 -22
  279. package/dist/session/history/factory.js +1 -1
  280. package/dist/session/history/memory.cjs +18 -0
  281. package/dist/session/history/memory.d.ts +8 -0
  282. package/dist/session/history/memory.d.ts.map +1 -1
  283. package/dist/session/history/memory.js +19 -1
  284. package/dist/session/history/types.d.ts +13 -1
  285. package/dist/session/history/types.d.ts.map +1 -1
  286. package/dist/session/index.cjs +3 -0
  287. package/dist/session/index.d.ts +3 -0
  288. package/dist/session/index.d.ts.map +1 -1
  289. package/dist/session/index.js +3 -1
  290. package/dist/session/message-queue.cjs +201 -0
  291. package/dist/session/message-queue.d.ts +114 -0
  292. package/dist/session/message-queue.d.ts.map +1 -0
  293. package/dist/session/message-queue.js +178 -0
  294. package/dist/session/schemas.js +1 -1
  295. package/dist/session/session-manager.cjs +57 -7
  296. package/dist/session/session-manager.d.ts +18 -0
  297. package/dist/session/session-manager.d.ts.map +1 -1
  298. package/dist/session/session-manager.js +58 -8
  299. package/dist/session/title-generator.cjs +4 -8
  300. package/dist/session/title-generator.d.ts +1 -2
  301. package/dist/session/title-generator.d.ts.map +1 -1
  302. package/dist/session/title-generator.js +5 -9
  303. package/dist/session/types.cjs +16 -0
  304. package/dist/session/types.d.ts +14 -0
  305. package/dist/session/types.d.ts.map +1 -0
  306. package/dist/session/types.js +0 -0
  307. package/dist/storage/blob/factory.js +1 -1
  308. package/dist/storage/blob/local-blob-store.js +1 -1
  309. package/dist/storage/blob/memory-blob-store.js +1 -1
  310. package/dist/storage/blob/schemas.js +1 -1
  311. package/dist/storage/cache/factory.cjs +6 -2
  312. package/dist/storage/cache/factory.d.ts +2 -1
  313. package/dist/storage/cache/factory.d.ts.map +1 -1
  314. package/dist/storage/cache/factory.js +7 -3
  315. package/dist/storage/cache/memory-cache-store.js +1 -1
  316. package/dist/storage/cache/redis-store.js +1 -1
  317. package/dist/storage/cache/schemas.js +1 -1
  318. package/dist/storage/database/factory.cjs +11 -17
  319. package/dist/storage/database/factory.d.ts +2 -1
  320. package/dist/storage/database/factory.d.ts.map +1 -1
  321. package/dist/storage/database/factory.js +12 -18
  322. package/dist/storage/database/memory-database-store.js +1 -1
  323. package/dist/storage/database/postgres-store.cjs +12 -0
  324. package/dist/storage/database/postgres-store.d.ts.map +1 -1
  325. package/dist/storage/database/postgres-store.js +13 -1
  326. package/dist/storage/database/schemas.js +1 -1
  327. package/dist/storage/database/sqlite-store.cjs +8 -0
  328. package/dist/storage/database/sqlite-store.d.ts.map +1 -1
  329. package/dist/storage/database/sqlite-store.js +9 -1
  330. package/dist/storage/error-codes.cjs +1 -0
  331. package/dist/storage/error-codes.d.ts +1 -0
  332. package/dist/storage/error-codes.d.ts.map +1 -1
  333. package/dist/storage/error-codes.js +2 -1
  334. package/dist/storage/errors.cjs +17 -0
  335. package/dist/storage/errors.d.ts +9 -0
  336. package/dist/storage/errors.d.ts.map +1 -1
  337. package/dist/storage/errors.js +18 -1
  338. package/dist/storage/index.js +1 -1
  339. package/dist/storage/schemas.js +1 -1
  340. package/dist/storage/storage-manager.js +1 -1
  341. package/dist/systemPrompt/contributors.js +1 -1
  342. package/dist/systemPrompt/error-codes.js +1 -1
  343. package/dist/systemPrompt/errors.js +1 -1
  344. package/dist/systemPrompt/in-built-prompts.js +1 -1
  345. package/dist/systemPrompt/index.js +1 -1
  346. package/dist/systemPrompt/manager.js +1 -1
  347. package/dist/systemPrompt/registry.js +1 -1
  348. package/dist/systemPrompt/schemas.d.ts +5 -5
  349. package/dist/systemPrompt/schemas.js +1 -1
  350. package/dist/telemetry/decorators.js +1 -1
  351. package/dist/{llm/tokenizer/default.cjs → telemetry/error-codes.cjs} +14 -19
  352. package/dist/telemetry/error-codes.d.ts +13 -0
  353. package/dist/telemetry/error-codes.d.ts.map +1 -0
  354. package/dist/telemetry/error-codes.js +13 -0
  355. package/dist/telemetry/errors.cjs +105 -0
  356. package/dist/telemetry/errors.d.ts +28 -0
  357. package/dist/telemetry/errors.d.ts.map +1 -0
  358. package/dist/telemetry/errors.js +82 -0
  359. package/dist/telemetry/exporters.js +1 -1
  360. package/dist/telemetry/index.js +1 -1
  361. package/dist/telemetry/schemas.js +1 -1
  362. package/dist/telemetry/telemetry.cjs +92 -26
  363. package/dist/telemetry/telemetry.d.ts +1 -1
  364. package/dist/telemetry/telemetry.d.ts.map +1 -1
  365. package/dist/telemetry/telemetry.js +75 -19
  366. package/dist/telemetry/utils.js +1 -1
  367. package/dist/tools/bash-pattern-utils.cjs +91 -0
  368. package/dist/tools/bash-pattern-utils.d.ts +58 -0
  369. package/dist/tools/bash-pattern-utils.d.ts.map +1 -0
  370. package/dist/tools/bash-pattern-utils.js +64 -0
  371. package/dist/tools/confirmation/allowed-tools-provider/factory.js +1 -1
  372. package/dist/tools/confirmation/allowed-tools-provider/in-memory.js +1 -1
  373. package/dist/tools/confirmation/allowed-tools-provider/storage.js +1 -1
  374. package/dist/tools/display-types.cjs +60 -0
  375. package/dist/tools/display-types.d.ts +133 -0
  376. package/dist/tools/display-types.d.ts.map +1 -0
  377. package/dist/tools/display-types.js +32 -0
  378. package/dist/tools/error-codes.cjs +2 -0
  379. package/dist/tools/error-codes.d.ts +3 -1
  380. package/dist/tools/error-codes.d.ts.map +1 -1
  381. package/dist/tools/error-codes.js +3 -1
  382. package/dist/tools/errors.cjs +30 -0
  383. package/dist/tools/errors.d.ts +16 -0
  384. package/dist/tools/errors.d.ts.map +1 -1
  385. package/dist/tools/errors.js +31 -1
  386. package/dist/tools/index.cjs +2 -0
  387. package/dist/tools/index.d.ts +1 -0
  388. package/dist/tools/index.d.ts.map +1 -1
  389. package/dist/tools/index.js +2 -1
  390. package/dist/tools/internal-tools/constants.js +1 -1
  391. package/dist/tools/internal-tools/implementations/ask-user-tool.cjs +1 -1
  392. package/dist/tools/internal-tools/implementations/ask-user-tool.js +2 -2
  393. package/dist/tools/internal-tools/implementations/bash-exec-tool.cjs +42 -18
  394. package/dist/tools/internal-tools/implementations/bash-exec-tool.d.ts +3 -3
  395. package/dist/tools/internal-tools/implementations/bash-exec-tool.d.ts.map +1 -1
  396. package/dist/tools/internal-tools/implementations/bash-exec-tool.js +43 -19
  397. package/dist/tools/internal-tools/implementations/bash-output-tool.js +1 -1
  398. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.js +1 -1
  399. package/dist/tools/internal-tools/implementations/edit-file-tool.cjs +66 -1
  400. package/dist/tools/internal-tools/implementations/edit-file-tool.d.ts.map +1 -1
  401. package/dist/tools/internal-tools/implementations/edit-file-tool.js +67 -2
  402. package/dist/tools/internal-tools/implementations/glob-files-tool.cjs +14 -1
  403. package/dist/tools/internal-tools/implementations/glob-files-tool.d.ts.map +1 -1
  404. package/dist/tools/internal-tools/implementations/glob-files-tool.js +15 -2
  405. package/dist/tools/internal-tools/implementations/grep-content-tool.cjs +16 -1
  406. package/dist/tools/internal-tools/implementations/grep-content-tool.d.ts.map +1 -1
  407. package/dist/tools/internal-tools/implementations/grep-content-tool.js +17 -2
  408. package/dist/tools/internal-tools/implementations/kill-process-tool.js +1 -1
  409. package/dist/tools/internal-tools/implementations/read-file-tool.cjs +9 -1
  410. package/dist/tools/internal-tools/implementations/read-file-tool.d.ts.map +1 -1
  411. package/dist/tools/internal-tools/implementations/read-file-tool.js +10 -2
  412. package/dist/tools/internal-tools/implementations/search-history-tool.js +1 -1
  413. package/dist/tools/internal-tools/implementations/write-file-tool.cjs +69 -1
  414. package/dist/tools/internal-tools/implementations/write-file-tool.d.ts.map +1 -1
  415. package/dist/tools/internal-tools/implementations/write-file-tool.js +72 -2
  416. package/dist/tools/internal-tools/provider.cjs +27 -10
  417. package/dist/tools/internal-tools/provider.d.ts +8 -5
  418. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  419. package/dist/tools/internal-tools/provider.js +28 -11
  420. package/dist/tools/internal-tools/registry.cjs +4 -3
  421. package/dist/tools/internal-tools/registry.d.ts +28 -7
  422. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  423. package/dist/tools/internal-tools/registry.js +5 -4
  424. package/dist/tools/schemas.cjs +17 -7
  425. package/dist/tools/schemas.d.ts +31 -4
  426. package/dist/tools/schemas.d.ts.map +1 -1
  427. package/dist/tools/schemas.js +15 -7
  428. package/dist/tools/tool-manager.cjs +140 -18
  429. package/dist/tools/tool-manager.d.ts +23 -1
  430. package/dist/tools/tool-manager.d.ts.map +1 -1
  431. package/dist/tools/tool-manager.js +145 -19
  432. package/dist/tools/types.d.ts +20 -11
  433. package/dist/tools/types.d.ts.map +1 -1
  434. package/dist/utils/api-key-resolver.js +1 -1
  435. package/dist/utils/async-context.js +1 -1
  436. package/dist/utils/debug.js +1 -1
  437. package/dist/{llm/tokenizer/types.cjs → utils/defer.cjs} +19 -10
  438. package/dist/utils/defer.d.ts +63 -0
  439. package/dist/utils/defer.d.ts.map +1 -0
  440. package/dist/utils/defer.js +19 -0
  441. package/dist/utils/env-file.js +1 -1
  442. package/dist/utils/error-conversion.js +1 -1
  443. package/dist/utils/execution-context.js +1 -1
  444. package/dist/utils/fs-walk.js +1 -1
  445. package/dist/utils/index.cjs +3 -1
  446. package/dist/utils/index.d.ts +1 -0
  447. package/dist/utils/index.d.ts.map +1 -1
  448. package/dist/utils/index.js +1 -0
  449. package/dist/utils/path.js +1 -1
  450. package/dist/utils/redactor.js +1 -1
  451. package/dist/utils/result.js +1 -1
  452. package/dist/utils/safe-stringify.js +1 -1
  453. package/dist/utils/schema-metadata.js +1 -1
  454. package/dist/utils/schema.d.ts +6 -0
  455. package/dist/utils/schema.d.ts.map +1 -1
  456. package/dist/utils/schema.js +1 -1
  457. package/dist/utils/service-initializer.cjs +6 -2
  458. package/dist/utils/service-initializer.d.ts.map +1 -1
  459. package/dist/utils/service-initializer.js +7 -3
  460. package/dist/utils/user-info.js +1 -1
  461. package/dist/utils/zod-schema-converter.js +1 -1
  462. package/package.json +54 -17
  463. package/dist/context/compression/middle-removal.cjs +0 -95
  464. package/dist/context/compression/middle-removal.d.ts +0 -47
  465. package/dist/context/compression/middle-removal.d.ts.map +0 -1
  466. package/dist/context/compression/middle-removal.js +0 -72
  467. package/dist/context/compression/oldest-removal.cjs +0 -83
  468. package/dist/context/compression/oldest-removal.d.ts +0 -42
  469. package/dist/context/compression/oldest-removal.d.ts.map +0 -1
  470. package/dist/context/compression/oldest-removal.js +0 -60
  471. package/dist/llm/formatters/anthropic.cjs +0 -257
  472. package/dist/llm/formatters/anthropic.d.ts +0 -46
  473. package/dist/llm/formatters/anthropic.d.ts.map +0 -1
  474. package/dist/llm/formatters/anthropic.js +0 -239
  475. package/dist/llm/formatters/factory.cjs +0 -50
  476. package/dist/llm/formatters/factory.d.ts +0 -10
  477. package/dist/llm/formatters/factory.d.ts.map +0 -1
  478. package/dist/llm/formatters/factory.js +0 -27
  479. package/dist/llm/formatters/openai.cjs +0 -196
  480. package/dist/llm/formatters/openai.d.ts +0 -39
  481. package/dist/llm/formatters/openai.d.ts.map +0 -1
  482. package/dist/llm/formatters/openai.js +0 -177
  483. package/dist/llm/formatters/types.d.ts +0 -41
  484. package/dist/llm/formatters/types.d.ts.map +0 -1
  485. package/dist/llm/services/anthropic.cjs +0 -511
  486. package/dist/llm/services/anthropic.d.ts +0 -48
  487. package/dist/llm/services/anthropic.d.ts.map +0 -1
  488. package/dist/llm/services/anthropic.js +0 -447
  489. package/dist/llm/services/openai.cjs +0 -611
  490. package/dist/llm/services/openai.d.ts +0 -48
  491. package/dist/llm/services/openai.d.ts.map +0 -1
  492. package/dist/llm/services/openai.js +0 -547
  493. package/dist/llm/tokenizer/anthropic.cjs +0 -43
  494. package/dist/llm/tokenizer/anthropic.d.ts +0 -19
  495. package/dist/llm/tokenizer/anthropic.d.ts.map +0 -1
  496. package/dist/llm/tokenizer/anthropic.js +0 -20
  497. package/dist/llm/tokenizer/default.d.ts +0 -14
  498. package/dist/llm/tokenizer/default.d.ts.map +0 -1
  499. package/dist/llm/tokenizer/default.js +0 -18
  500. package/dist/llm/tokenizer/factory.d.ts +0 -12
  501. package/dist/llm/tokenizer/factory.d.ts.map +0 -1
  502. package/dist/llm/tokenizer/factory.js +0 -21
  503. package/dist/llm/tokenizer/google.cjs +0 -52
  504. package/dist/llm/tokenizer/google.d.ts +0 -29
  505. package/dist/llm/tokenizer/google.d.ts.map +0 -1
  506. package/dist/llm/tokenizer/google.js +0 -29
  507. package/dist/llm/tokenizer/openai.cjs +0 -115
  508. package/dist/llm/tokenizer/openai.d.ts +0 -33
  509. package/dist/llm/tokenizer/openai.d.ts.map +0 -1
  510. package/dist/llm/tokenizer/openai.js +0 -91
  511. package/dist/llm/tokenizer/types.d.ts +0 -18
  512. package/dist/llm/tokenizer/types.d.ts.map +0 -1
  513. package/dist/llm/tokenizer/types.js +0 -10
  514. /package/dist/llm/{formatters → executor}/types.cjs +0 -0
  515. /package/dist/llm/{formatters → executor}/types.js +0 -0
@@ -0,0 +1,114 @@
1
+ import type { SessionEventBus } from '../events/index.js';
2
+ import type { QueuedMessage, CoalescedMessage } from './types.js';
3
+ import type { ContentPart } from '../context/types.js';
4
+ import type { IDextoLogger } from '../logger/v2/types.js';
5
+ /**
6
+ * Input for enqueuing a user message to the queue.
7
+ * (Not to be confused with UserMessage from context/types.ts which represents
8
+ * a message in conversation history)
9
+ */
10
+ export interface UserMessageInput {
11
+ /** Multimodal content array (text, images, files, etc.) */
12
+ content: ContentPart[];
13
+ /** Optional metadata to attach to the message */
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * MessageQueueService handles queuing of user messages during agent execution.
18
+ *
19
+ * Key features:
20
+ * - Accepts messages when the agent is busy executing tools
21
+ * - Coalesces multiple queued messages into a single injection
22
+ * - Supports multimodal content (text, images, files)
23
+ *
24
+ * This enables user guidance where users can send
25
+ * mid-task instructions like "stop" or "try a different approach".
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // In API handler - queue message if agent is busy
30
+ * if (agent.isBusy()) {
31
+ * return messageQueue.enqueue({ content: [{ type: 'text', text: 'stop' }] });
32
+ * }
33
+ *
34
+ * // In TurnExecutor - check for queued messages
35
+ * const coalesced = messageQueue.dequeueAll();
36
+ * if (coalesced) {
37
+ * await contextManager.addMessage({
38
+ * role: 'user',
39
+ * content: coalesced.combinedContent,
40
+ * });
41
+ * }
42
+ * ```
43
+ */
44
+ export declare class MessageQueueService {
45
+ private eventBus;
46
+ private logger;
47
+ private queue;
48
+ constructor(eventBus: SessionEventBus, logger: IDextoLogger);
49
+ /**
50
+ * Add a message to the queue.
51
+ * Called by API endpoint - returns immediately with queue position.
52
+ *
53
+ * @param message The user message to queue
54
+ * @returns Queue position and message ID
55
+ */
56
+ enqueue(message: UserMessageInput): {
57
+ queued: true;
58
+ position: number;
59
+ id: string;
60
+ };
61
+ /**
62
+ * Dequeue ALL pending messages and coalesce into single injection.
63
+ * Called by executor between steps.
64
+ *
65
+ * Multiple queued messages become ONE combined message to the LLM.
66
+ *
67
+ * @example
68
+ * If 3 messages are queued: "stop", "try X instead", "also check Y"
69
+ * They become:
70
+ * ```
71
+ * [1]: stop
72
+ *
73
+ * [2]: try X instead
74
+ *
75
+ * [3]: also check Y
76
+ * ```
77
+ *
78
+ * @returns Coalesced message or null if queue is empty
79
+ */
80
+ dequeueAll(): CoalescedMessage | null;
81
+ /**
82
+ * Coalesce multiple messages into one (multimodal-aware).
83
+ * Strategy: Combine with numbered separators, preserve all media.
84
+ */
85
+ private coalesce;
86
+ /**
87
+ * Check if there are pending messages in the queue.
88
+ */
89
+ hasPending(): boolean;
90
+ /**
91
+ * Get the number of pending messages.
92
+ */
93
+ pendingCount(): number;
94
+ /**
95
+ * Clear all pending messages without processing.
96
+ * Used during cleanup/abort.
97
+ */
98
+ clear(): void;
99
+ /**
100
+ * Get all queued messages (for UI display).
101
+ * Returns a shallow copy to prevent external mutation.
102
+ */
103
+ getAll(): QueuedMessage[];
104
+ /**
105
+ * Get a single queued message by ID.
106
+ */
107
+ get(id: string): QueuedMessage | undefined;
108
+ /**
109
+ * Remove a single queued message by ID.
110
+ * @returns true if message was found and removed; false otherwise
111
+ */
112
+ remove(id: string): boolean;
113
+ }
114
+ //# sourceMappingURL=message-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-queue.d.ts","sourceRoot":"","sources":["../../src/session/message-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAS1D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC7B,2DAA2D;IAC3D,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,mBAAmB;IAIxB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAJlB,OAAO,CAAC,KAAK,CAAuB;gBAGxB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,YAAY;IAGhC;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAwBlF;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,IAAI,gBAAgB,GAAG,IAAI;IAsBrC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IA0EhB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,MAAM,IAAI,aAAa,EAAE;IAIzB;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI1C;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAY9B"}
@@ -0,0 +1,178 @@
1
+ import "../chunk-PTJYTZNU.js";
2
+ function generateId() {
3
+ return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
4
+ }
5
+ class MessageQueueService {
6
+ constructor(eventBus, logger) {
7
+ this.eventBus = eventBus;
8
+ this.logger = logger;
9
+ }
10
+ queue = [];
11
+ /**
12
+ * Add a message to the queue.
13
+ * Called by API endpoint - returns immediately with queue position.
14
+ *
15
+ * @param message The user message to queue
16
+ * @returns Queue position and message ID
17
+ */
18
+ enqueue(message) {
19
+ const queuedMsg = {
20
+ id: generateId(),
21
+ content: message.content,
22
+ queuedAt: Date.now(),
23
+ ...message.metadata !== void 0 && { metadata: message.metadata }
24
+ };
25
+ this.queue.push(queuedMsg);
26
+ this.logger.debug(`Message queued: ${queuedMsg.id}, position: ${this.queue.length}`);
27
+ this.eventBus.emit("message:queued", {
28
+ position: this.queue.length,
29
+ id: queuedMsg.id
30
+ });
31
+ return {
32
+ queued: true,
33
+ position: this.queue.length,
34
+ id: queuedMsg.id
35
+ };
36
+ }
37
+ /**
38
+ * Dequeue ALL pending messages and coalesce into single injection.
39
+ * Called by executor between steps.
40
+ *
41
+ * Multiple queued messages become ONE combined message to the LLM.
42
+ *
43
+ * @example
44
+ * If 3 messages are queued: "stop", "try X instead", "also check Y"
45
+ * They become:
46
+ * ```
47
+ * [1]: stop
48
+ *
49
+ * [2]: try X instead
50
+ *
51
+ * [3]: also check Y
52
+ * ```
53
+ *
54
+ * @returns Coalesced message or null if queue is empty
55
+ */
56
+ dequeueAll() {
57
+ if (this.queue.length === 0) return null;
58
+ const messages = [...this.queue];
59
+ this.queue = [];
60
+ const combined = this.coalesce(messages);
61
+ this.logger.debug(
62
+ `Dequeued ${messages.length} message(s): ${messages.map((m) => m.id).join(", ")}`
63
+ );
64
+ this.eventBus.emit("message:dequeued", {
65
+ count: messages.length,
66
+ ids: messages.map((m) => m.id),
67
+ coalesced: messages.length > 1,
68
+ content: combined.combinedContent
69
+ });
70
+ return combined;
71
+ }
72
+ /**
73
+ * Coalesce multiple messages into one (multimodal-aware).
74
+ * Strategy: Combine with numbered separators, preserve all media.
75
+ */
76
+ coalesce(messages) {
77
+ if (messages.length === 1) {
78
+ const firstMsg = messages[0];
79
+ if (!firstMsg) {
80
+ throw new Error("Unexpected empty messages array");
81
+ }
82
+ return {
83
+ messages,
84
+ combinedContent: firstMsg.content,
85
+ firstQueuedAt: firstMsg.queuedAt,
86
+ lastQueuedAt: firstMsg.queuedAt
87
+ };
88
+ }
89
+ const combinedContent = [];
90
+ for (const [i, msg] of messages.entries()) {
91
+ const prefix = messages.length === 2 ? i === 0 ? "First" : "Also" : `[${i + 1}]`;
92
+ let prefixText = `${prefix}: `;
93
+ for (const part of msg.content) {
94
+ if (part.type === "text") {
95
+ if (prefixText) {
96
+ combinedContent.push({ type: "text", text: prefixText + part.text });
97
+ prefixText = "";
98
+ } else {
99
+ combinedContent.push(part);
100
+ }
101
+ } else {
102
+ if (prefixText) {
103
+ combinedContent.push({ type: "text", text: prefixText });
104
+ prefixText = "";
105
+ }
106
+ combinedContent.push(part);
107
+ }
108
+ }
109
+ if (prefixText && msg.content.length === 0) {
110
+ combinedContent.push({ type: "text", text: prefixText + "[empty message]" });
111
+ }
112
+ if (i < messages.length - 1) {
113
+ combinedContent.push({ type: "text", text: "\n\n" });
114
+ }
115
+ }
116
+ const firstMessage = messages[0];
117
+ const lastMessage = messages[messages.length - 1];
118
+ if (!firstMessage || !lastMessage) {
119
+ throw new Error("Unexpected undefined message in non-empty array");
120
+ }
121
+ return {
122
+ messages,
123
+ combinedContent,
124
+ firstQueuedAt: firstMessage.queuedAt,
125
+ lastQueuedAt: lastMessage.queuedAt
126
+ };
127
+ }
128
+ /**
129
+ * Check if there are pending messages in the queue.
130
+ */
131
+ hasPending() {
132
+ return this.queue.length > 0;
133
+ }
134
+ /**
135
+ * Get the number of pending messages.
136
+ */
137
+ pendingCount() {
138
+ return this.queue.length;
139
+ }
140
+ /**
141
+ * Clear all pending messages without processing.
142
+ * Used during cleanup/abort.
143
+ */
144
+ clear() {
145
+ this.queue = [];
146
+ }
147
+ /**
148
+ * Get all queued messages (for UI display).
149
+ * Returns a shallow copy to prevent external mutation.
150
+ */
151
+ getAll() {
152
+ return [...this.queue];
153
+ }
154
+ /**
155
+ * Get a single queued message by ID.
156
+ */
157
+ get(id) {
158
+ return this.queue.find((m) => m.id === id);
159
+ }
160
+ /**
161
+ * Remove a single queued message by ID.
162
+ * @returns true if message was found and removed; false otherwise
163
+ */
164
+ remove(id) {
165
+ const index = this.queue.findIndex((m) => m.id === id);
166
+ if (index === -1) {
167
+ this.logger.debug(`Remove failed: message ${id} not found in queue`);
168
+ return false;
169
+ }
170
+ this.queue.splice(index, 1);
171
+ this.logger.debug(`Message removed: ${id}, remaining: ${this.queue.length}`);
172
+ this.eventBus.emit("message:removed", { id });
173
+ return true;
174
+ }
175
+ }
176
+ export {
177
+ MessageQueueService
178
+ };
@@ -1,4 +1,4 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
2
  import { z } from "zod";
3
3
  const SessionConfigSchema = z.object({
4
4
  maxSessions: z.number().int().positive().default(100).describe("Maximum number of concurrent sessions allowed, defaults to 100"),
@@ -40,6 +40,8 @@ class SessionManager {
40
40
  initializationPromise;
41
41
  // Add a Map to track ongoing session creation operations to prevent race conditions
42
42
  pendingCreations = /* @__PURE__ */ new Map();
43
+ // Per-session mutex for token usage updates to prevent lost updates from concurrent calls
44
+ tokenUsageLocks = /* @__PURE__ */ new Map();
43
45
  logger;
44
46
  /**
45
47
  * Initialize the SessionManager with persistent storage.
@@ -295,12 +297,17 @@ class SessionManager {
295
297
  await this.ensureInitialized();
296
298
  const sessionKey = `session:${sessionId}`;
297
299
  const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
298
- return sessionData ? {
300
+ if (!sessionData) return void 0;
301
+ return {
299
302
  createdAt: sessionData.createdAt,
300
303
  lastActivity: sessionData.lastActivity,
301
304
  messageCount: sessionData.messageCount,
302
- title: sessionData.metadata?.title
303
- } : void 0;
305
+ title: sessionData.metadata?.title,
306
+ ...sessionData.tokenUsage && { tokenUsage: sessionData.tokenUsage },
307
+ ...sessionData.estimatedCost !== void 0 && {
308
+ estimatedCost: sessionData.estimatedCost
309
+ }
310
+ };
304
311
  }
305
312
  /**
306
313
  * Get the global session manager configuration.
@@ -337,6 +344,51 @@ class SessionManager {
337
344
  await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
338
345
  }
339
346
  }
347
+ /**
348
+ * Accumulates token usage for a session.
349
+ * Called after each LLM response to update session-level totals.
350
+ *
351
+ * Uses per-session locking to prevent lost updates from concurrent calls.
352
+ */
353
+ async accumulateTokenUsage(sessionId, usage, cost) {
354
+ await this.ensureInitialized();
355
+ const sessionKey = `session:${sessionId}`;
356
+ const previousLock = this.tokenUsageLocks.get(sessionKey) ?? Promise.resolve();
357
+ const currentLock = previousLock.then(async () => {
358
+ const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
359
+ if (!sessionData) return;
360
+ if (!sessionData.tokenUsage) {
361
+ sessionData.tokenUsage = {
362
+ inputTokens: 0,
363
+ outputTokens: 0,
364
+ reasoningTokens: 0,
365
+ cacheReadTokens: 0,
366
+ cacheWriteTokens: 0,
367
+ totalTokens: 0
368
+ };
369
+ }
370
+ sessionData.tokenUsage.inputTokens += usage.inputTokens ?? 0;
371
+ sessionData.tokenUsage.outputTokens += usage.outputTokens ?? 0;
372
+ sessionData.tokenUsage.reasoningTokens += usage.reasoningTokens ?? 0;
373
+ sessionData.tokenUsage.cacheReadTokens += usage.cacheReadTokens ?? 0;
374
+ sessionData.tokenUsage.cacheWriteTokens += usage.cacheWriteTokens ?? 0;
375
+ sessionData.tokenUsage.totalTokens += usage.totalTokens ?? 0;
376
+ if (cost !== void 0) {
377
+ sessionData.estimatedCost = (sessionData.estimatedCost ?? 0) + cost;
378
+ }
379
+ sessionData.lastActivity = Date.now();
380
+ await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
381
+ await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
382
+ });
383
+ this.tokenUsageLocks.set(sessionKey, currentLock);
384
+ try {
385
+ await currentLock;
386
+ } finally {
387
+ if (this.tokenUsageLocks.get(sessionKey) === currentLock) {
388
+ this.tokenUsageLocks.delete(sessionKey);
389
+ }
390
+ }
391
+ }
340
392
  /**
341
393
  * Sets the human-friendly title for a session.
342
394
  * Title is stored in session metadata and cached with TTL.
@@ -422,11 +474,10 @@ class SessionManager {
422
474
  }
423
475
  this.services.agentEventBus.emit("llm:switched", {
424
476
  newConfig: newLLMConfig,
425
- router: newLLMConfig.router,
426
477
  historyRetained: true,
427
478
  sessionIds: sessionIds.filter((id) => !failedSessions.includes(id))
428
479
  });
429
- const message = failedSessions.length > 0 ? `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} using ${newLLMConfig.router} router (${failedSessions.length} sessions failed)` : `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} using ${newLLMConfig.router} router for all sessions`;
480
+ const message = failedSessions.length > 0 ? `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} (${failedSessions.length} sessions failed)` : `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} for all sessions`;
430
481
  const warnings = failedSessions.length > 0 ? [`Failed to switch LLM for sessions: ${failedSessions.join(", ")}`] : [];
431
482
  return { message, warnings };
432
483
  }
@@ -444,11 +495,10 @@ class SessionManager {
444
495
  await session.switchLLM(newLLMConfig);
445
496
  this.services.agentEventBus.emit("llm:switched", {
446
497
  newConfig: newLLMConfig,
447
- router: newLLMConfig.router,
448
498
  historyRetained: true,
449
499
  sessionIds: [sessionId]
450
500
  });
451
- const message = `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} using ${newLLMConfig.router} router for session ${sessionId}`;
501
+ const message = `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} for session ${sessionId}`;
452
502
  return { message, warnings: [] };
453
503
  }
454
504
  /**
@@ -7,11 +7,19 @@ import type { AgentStateManager } from '../agent/state-manager.js';
7
7
  import type { ValidatedLLMConfig } from '../llm/schemas.js';
8
8
  import type { StorageManager } from '../storage/index.js';
9
9
  import type { PluginManager } from '../plugins/manager.js';
10
+ import type { TokenUsage } from '../llm/types.js';
11
+ /**
12
+ * Session-level token usage totals (accumulated across all messages).
13
+ * All fields required since we track cumulative totals (defaulting to 0).
14
+ */
15
+ export type SessionTokenUsage = Required<TokenUsage>;
10
16
  export interface SessionMetadata {
11
17
  createdAt: number;
12
18
  lastActivity: number;
13
19
  messageCount: number;
14
20
  title?: string;
21
+ tokenUsage?: SessionTokenUsage;
22
+ estimatedCost?: number;
15
23
  }
16
24
  export interface SessionManagerConfig {
17
25
  maxSessions?: number;
@@ -24,6 +32,8 @@ export interface SessionData {
24
32
  lastActivity: number;
25
33
  messageCount: number;
26
34
  metadata?: Record<string, any>;
35
+ tokenUsage?: SessionTokenUsage;
36
+ estimatedCost?: number;
27
37
  }
28
38
  /**
29
39
  * Manages multiple chat sessions within a Dexto agent.
@@ -50,6 +60,7 @@ export declare class SessionManager {
50
60
  private cleanupInterval?;
51
61
  private initializationPromise;
52
62
  private readonly pendingCreations;
63
+ private readonly tokenUsageLocks;
53
64
  private logger;
54
65
  constructor(services: {
55
66
  stateManager: AgentStateManager;
@@ -142,6 +153,13 @@ export declare class SessionManager {
142
153
  * Increments the message count for a session.
143
154
  */
144
155
  incrementMessageCount(sessionId: string): Promise<void>;
156
+ /**
157
+ * Accumulates token usage for a session.
158
+ * Called after each LLM response to update session-level totals.
159
+ *
160
+ * Uses per-session locking to prevent lost updates from concurrent calls.
161
+ */
162
+ accumulateTokenUsage(sessionId: string, usage: TokenUsage, cost?: number): Promise<void>;
145
163
  /**
146
164
  * Sets the human-friendly title for a session.
147
165
  * Title is stored in session metadata and cached with TTL.
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
2
  import { randomUUID } from "crypto";
3
3
  import { ChatSession } from "./chat-session.js";
4
4
  import { DextoLogComponent } from "../logger/v2/types.js";
@@ -18,6 +18,8 @@ class SessionManager {
18
18
  initializationPromise;
19
19
  // Add a Map to track ongoing session creation operations to prevent race conditions
20
20
  pendingCreations = /* @__PURE__ */ new Map();
21
+ // Per-session mutex for token usage updates to prevent lost updates from concurrent calls
22
+ tokenUsageLocks = /* @__PURE__ */ new Map();
21
23
  logger;
22
24
  /**
23
25
  * Initialize the SessionManager with persistent storage.
@@ -273,12 +275,17 @@ class SessionManager {
273
275
  await this.ensureInitialized();
274
276
  const sessionKey = `session:${sessionId}`;
275
277
  const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
276
- return sessionData ? {
278
+ if (!sessionData) return void 0;
279
+ return {
277
280
  createdAt: sessionData.createdAt,
278
281
  lastActivity: sessionData.lastActivity,
279
282
  messageCount: sessionData.messageCount,
280
- title: sessionData.metadata?.title
281
- } : void 0;
283
+ title: sessionData.metadata?.title,
284
+ ...sessionData.tokenUsage && { tokenUsage: sessionData.tokenUsage },
285
+ ...sessionData.estimatedCost !== void 0 && {
286
+ estimatedCost: sessionData.estimatedCost
287
+ }
288
+ };
282
289
  }
283
290
  /**
284
291
  * Get the global session manager configuration.
@@ -315,6 +322,51 @@ class SessionManager {
315
322
  await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
316
323
  }
317
324
  }
325
+ /**
326
+ * Accumulates token usage for a session.
327
+ * Called after each LLM response to update session-level totals.
328
+ *
329
+ * Uses per-session locking to prevent lost updates from concurrent calls.
330
+ */
331
+ async accumulateTokenUsage(sessionId, usage, cost) {
332
+ await this.ensureInitialized();
333
+ const sessionKey = `session:${sessionId}`;
334
+ const previousLock = this.tokenUsageLocks.get(sessionKey) ?? Promise.resolve();
335
+ const currentLock = previousLock.then(async () => {
336
+ const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
337
+ if (!sessionData) return;
338
+ if (!sessionData.tokenUsage) {
339
+ sessionData.tokenUsage = {
340
+ inputTokens: 0,
341
+ outputTokens: 0,
342
+ reasoningTokens: 0,
343
+ cacheReadTokens: 0,
344
+ cacheWriteTokens: 0,
345
+ totalTokens: 0
346
+ };
347
+ }
348
+ sessionData.tokenUsage.inputTokens += usage.inputTokens ?? 0;
349
+ sessionData.tokenUsage.outputTokens += usage.outputTokens ?? 0;
350
+ sessionData.tokenUsage.reasoningTokens += usage.reasoningTokens ?? 0;
351
+ sessionData.tokenUsage.cacheReadTokens += usage.cacheReadTokens ?? 0;
352
+ sessionData.tokenUsage.cacheWriteTokens += usage.cacheWriteTokens ?? 0;
353
+ sessionData.tokenUsage.totalTokens += usage.totalTokens ?? 0;
354
+ if (cost !== void 0) {
355
+ sessionData.estimatedCost = (sessionData.estimatedCost ?? 0) + cost;
356
+ }
357
+ sessionData.lastActivity = Date.now();
358
+ await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
359
+ await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
360
+ });
361
+ this.tokenUsageLocks.set(sessionKey, currentLock);
362
+ try {
363
+ await currentLock;
364
+ } finally {
365
+ if (this.tokenUsageLocks.get(sessionKey) === currentLock) {
366
+ this.tokenUsageLocks.delete(sessionKey);
367
+ }
368
+ }
369
+ }
318
370
  /**
319
371
  * Sets the human-friendly title for a session.
320
372
  * Title is stored in session metadata and cached with TTL.
@@ -400,11 +452,10 @@ class SessionManager {
400
452
  }
401
453
  this.services.agentEventBus.emit("llm:switched", {
402
454
  newConfig: newLLMConfig,
403
- router: newLLMConfig.router,
404
455
  historyRetained: true,
405
456
  sessionIds: sessionIds.filter((id) => !failedSessions.includes(id))
406
457
  });
407
- const message = failedSessions.length > 0 ? `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} using ${newLLMConfig.router} router (${failedSessions.length} sessions failed)` : `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} using ${newLLMConfig.router} router for all sessions`;
458
+ const message = failedSessions.length > 0 ? `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} (${failedSessions.length} sessions failed)` : `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} for all sessions`;
408
459
  const warnings = failedSessions.length > 0 ? [`Failed to switch LLM for sessions: ${failedSessions.join(", ")}`] : [];
409
460
  return { message, warnings };
410
461
  }
@@ -422,11 +473,10 @@ class SessionManager {
422
473
  await session.switchLLM(newLLMConfig);
423
474
  this.services.agentEventBus.emit("llm:switched", {
424
475
  newConfig: newLLMConfig,
425
- router: newLLMConfig.router,
426
476
  historyRetained: true,
427
477
  sessionIds: [sessionId]
428
478
  });
429
- const message = `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} using ${newLLMConfig.router} router for session ${sessionId}`;
479
+ const message = `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} for session ${sessionId}`;
430
480
  return { message, warnings: [] };
431
481
  }
432
482
  /**
@@ -25,7 +25,7 @@ module.exports = __toCommonJS(title_generator_exports);
25
25
  var import_factory = require("../llm/services/factory.cjs");
26
26
  var import_events = require("../events/index.cjs");
27
27
  var import_memory = require("./history/memory.js");
28
- async function generateSessionTitle(config, router, toolManager, systemPromptManager, resourceManager, userText, logger, opts = {}) {
28
+ async function generateSessionTitle(config, toolManager, systemPromptManager, resourceManager, userText, logger, opts = {}) {
29
29
  const timeoutMs = opts.timeoutMs;
30
30
  const controller = timeoutMs !== void 0 ? new AbortController() : void 0;
31
31
  let timer;
@@ -33,11 +33,10 @@ async function generateSessionTitle(config, router, toolManager, systemPromptMan
33
33
  timer = setTimeout(() => controller.abort(), timeoutMs);
34
34
  }
35
35
  try {
36
- const history = new import_memory.MemoryHistoryProvider();
36
+ const history = new import_memory.MemoryHistoryProvider(logger);
37
37
  const bus = new import_events.SessionEventBus();
38
38
  const tempService = (0, import_factory.createLLMService)(
39
39
  config,
40
- router,
41
40
  toolManager,
42
41
  systemPromptManager,
43
42
  history,
@@ -53,12 +52,9 @@ async function generateSessionTitle(config, router, toolManager, systemPromptMan
53
52
  "Message:",
54
53
  sanitizeUserText(userText, 512)
55
54
  ].join("\n");
56
- const result = await tempService.completeTask(
55
+ const result = await tempService.stream(
57
56
  instruction,
58
- controller ? { signal: controller.signal } : {},
59
- void 0,
60
- void 0,
61
- false
57
+ controller ? { signal: controller.signal } : void 0
62
58
  );
63
59
  const processed = postProcessTitle(result);
64
60
  if (!processed) {
@@ -1,5 +1,4 @@
1
1
  import type { ValidatedLLMConfig } from '../llm/schemas.js';
2
- import type { LLMRouter } from '../llm/types.js';
3
2
  import type { ToolManager } from '../tools/tool-manager.js';
4
3
  import type { SystemPromptManager } from '../systemPrompt/manager.js';
5
4
  import type { ResourceManager } from '../resources/index.js';
@@ -13,7 +12,7 @@ export interface GenerateSessionTitleResult {
13
12
  * Generate a concise title for a chat based on the first user message.
14
13
  * Runs a lightweight, isolated LLM completion that does not touch real history.
15
14
  */
16
- export declare function generateSessionTitle(config: ValidatedLLMConfig, router: LLMRouter, toolManager: ToolManager, systemPromptManager: SystemPromptManager, resourceManager: ResourceManager, userText: string, logger: IDextoLogger, opts?: {
15
+ export declare function generateSessionTitle(config: ValidatedLLMConfig, toolManager: ToolManager, systemPromptManager: SystemPromptManager, resourceManager: ResourceManager, userText: string, logger: IDextoLogger, opts?: {
17
16
  timeoutMs?: number;
18
17
  }): Promise<GenerateSessionTitleResult>;
19
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"title-generator.d.ts","sourceRoot":"","sources":["../../src/session/title-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,MAAM,WAAW,0BAA0B;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAuDrC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8BzE"}
1
+ {"version":3,"file":"title-generator.d.ts","sourceRoot":"","sources":["../../src/session/title-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,MAAM,WAAW,0BAA0B;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAmDrC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8BzE"}