@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
@@ -24,47 +24,58 @@ module.exports = __toCommonJS(database_exports);
24
24
  var import_types = require("../../logger/v2/types.cjs");
25
25
  var import_errors = require("../errors.js");
26
26
  class DatabaseHistoryProvider {
27
+ // Debounce window for batching updates
27
28
  constructor(sessionId, database, logger) {
28
29
  this.sessionId = sessionId;
29
30
  this.database = database;
30
31
  this.logger = logger.createChild(import_types.DextoLogComponent.SESSION);
31
32
  }
32
33
  logger;
34
+ // Cache state
35
+ cache = null;
36
+ dirty = false;
37
+ flushTimer = null;
38
+ flushPromise = null;
39
+ // Flush configuration
40
+ static FLUSH_DELAY_MS = 100;
33
41
  async getHistory() {
34
- const key = this.getMessagesKey();
35
- try {
36
- const messages = await this.database.getRange(key, 0, 1e3);
37
- this.logger.debug(
38
- `DatabaseHistoryProvider: Retrieved ${messages.length} messages for session ${this.sessionId}`
39
- );
40
- return messages;
41
- } catch (error) {
42
- this.logger.error(
43
- `DatabaseHistoryProvider: Error retrieving messages for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
44
- );
45
- return [];
42
+ if (this.cache === null) {
43
+ const key = this.getMessagesKey();
44
+ try {
45
+ this.cache = await this.database.getRange(key, 0, 1e4);
46
+ this.logger.debug(
47
+ `DatabaseHistoryProvider: Loaded ${this.cache.length} messages from DB for session ${this.sessionId}`
48
+ );
49
+ } catch (error) {
50
+ this.logger.error(
51
+ `DatabaseHistoryProvider: Error loading messages for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
52
+ );
53
+ throw import_errors.SessionError.storageFailed(
54
+ this.sessionId,
55
+ "load history",
56
+ error instanceof Error ? error.message : String(error)
57
+ );
58
+ }
46
59
  }
60
+ return [...this.cache];
47
61
  }
48
62
  async saveMessage(message) {
49
63
  const key = this.getMessagesKey();
64
+ if (this.cache === null) {
65
+ await this.getHistory();
66
+ }
67
+ this.cache.push(message);
50
68
  try {
51
69
  await this.database.append(key, message);
52
- let contentPreview = "[no content]";
53
- if (message.content) {
54
- if (typeof message.content === "string") {
55
- contentPreview = message.content.length > 100 ? `${message.content.substring(0, 100)}...` : message.content;
56
- } else if (Array.isArray(message.content)) {
57
- contentPreview = `[${message.content.length} parts]`;
58
- }
59
- }
60
70
  this.logger.debug(
61
71
  `DatabaseHistoryProvider: Saved message for session ${this.sessionId}`,
62
72
  {
63
73
  role: message.role,
64
- content: contentPreview
74
+ id: message.id
65
75
  }
66
76
  );
67
77
  } catch (error) {
78
+ this.cache.pop();
68
79
  this.logger.error(
69
80
  `DatabaseHistoryProvider: Error saving message for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
70
81
  );
@@ -75,7 +86,34 @@ class DatabaseHistoryProvider {
75
86
  );
76
87
  }
77
88
  }
89
+ async updateMessage(message) {
90
+ if (!message.id) {
91
+ this.logger.warn(
92
+ `DatabaseHistoryProvider: Ignoring update for message without id in session ${this.sessionId}`
93
+ );
94
+ return;
95
+ }
96
+ if (this.cache === null) {
97
+ await this.getHistory();
98
+ }
99
+ const index = this.cache.findIndex((m) => m.id === message.id);
100
+ if (index !== -1) {
101
+ this.cache[index] = message;
102
+ this.dirty = true;
103
+ this.scheduleFlush();
104
+ this.logger.debug(
105
+ `DatabaseHistoryProvider: Updated message ${message.id} in cache for session ${this.sessionId}`
106
+ );
107
+ } else {
108
+ this.logger.warn(
109
+ `DatabaseHistoryProvider: Message ${message.id} not found for update in session ${this.sessionId}`
110
+ );
111
+ }
112
+ }
78
113
  async clearHistory() {
114
+ this.cancelPendingFlush();
115
+ this.cache = [];
116
+ this.dirty = false;
79
117
  const key = this.getMessagesKey();
80
118
  try {
81
119
  await this.database.delete(key);
@@ -92,6 +130,81 @@ class DatabaseHistoryProvider {
92
130
  );
93
131
  }
94
132
  }
133
+ /**
134
+ * Flush any pending updates to the database.
135
+ * Should be called at turn boundaries to ensure durability.
136
+ */
137
+ async flush() {
138
+ if (this.flushPromise) {
139
+ await this.flushPromise;
140
+ return;
141
+ }
142
+ this.cancelPendingFlush();
143
+ if (!this.dirty || !this.cache) {
144
+ return;
145
+ }
146
+ this.flushPromise = this.doFlush();
147
+ try {
148
+ await this.flushPromise;
149
+ } finally {
150
+ this.flushPromise = null;
151
+ }
152
+ }
153
+ /**
154
+ * Internal flush implementation.
155
+ * Writes entire cache to DB (delete + re-append all).
156
+ */
157
+ async doFlush() {
158
+ if (!this.dirty || !this.cache) {
159
+ return;
160
+ }
161
+ const key = this.getMessagesKey();
162
+ const messageCount = this.cache.length;
163
+ try {
164
+ await this.database.delete(key);
165
+ for (const msg of this.cache) {
166
+ await this.database.append(key, msg);
167
+ }
168
+ if (!this.flushTimer) {
169
+ this.dirty = false;
170
+ }
171
+ this.logger.debug(
172
+ `DatabaseHistoryProvider: Flushed ${messageCount} messages to DB for session ${this.sessionId}`
173
+ );
174
+ } catch (error) {
175
+ this.logger.error(
176
+ `DatabaseHistoryProvider: Error flushing messages for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
177
+ );
178
+ throw import_errors.SessionError.storageFailed(
179
+ this.sessionId,
180
+ "flush messages",
181
+ error instanceof Error ? error.message : String(error)
182
+ );
183
+ }
184
+ }
185
+ /**
186
+ * Schedule a debounced flush.
187
+ * Batches rapid updateMessage() calls into a single DB write.
188
+ */
189
+ scheduleFlush() {
190
+ if (this.flushTimer) {
191
+ return;
192
+ }
193
+ this.flushTimer = setTimeout(() => {
194
+ this.flushTimer = null;
195
+ this.doFlush().catch(() => {
196
+ });
197
+ }, DatabaseHistoryProvider.FLUSH_DELAY_MS);
198
+ }
199
+ /**
200
+ * Cancel any pending scheduled flush.
201
+ */
202
+ cancelPendingFlush() {
203
+ if (this.flushTimer) {
204
+ clearTimeout(this.flushTimer);
205
+ this.flushTimer = null;
206
+ }
207
+ }
95
208
  getMessagesKey() {
96
209
  return `messages:${this.sessionId}`;
97
210
  }
@@ -4,24 +4,53 @@ import type { InternalMessage } from '../../context/types.js';
4
4
  import type { IConversationHistoryProvider } from './types.js';
5
5
  /**
6
6
  * History provider that works directly with DatabaseBackend.
7
- * Handles message-specific operations and key formatting internally.
7
+ * Uses write-through caching for read performance while maintaining durability.
8
8
  *
9
- * TODO: Add in-memory caching to reduce database queries.
10
- * Cache should be invalidated on writes and persist across LLM switches.
11
- * Consider caching strategy:
12
- * - Load cache on first getHistory() call
13
- * - Update cache optimistically on saveMessage()
14
- * - Clear cache on clearHistory()
15
- * This will significantly improve performance for sessions with many messages.
9
+ * Caching strategy:
10
+ * - getHistory(): Returns cached messages after first load (eliminates repeated DB reads)
11
+ * - saveMessage(): Updates cache AND writes to DB immediately (new messages are critical)
12
+ * - updateMessage(): Updates cache immediately, debounces DB writes (batches rapid updates)
13
+ * - flush(): Forces all pending updates to DB (called at turn boundaries)
14
+ * - clearHistory(): Clears cache and DB immediately
15
+ *
16
+ * Durability guarantees:
17
+ * - New messages (saveMessage) are always immediately durable
18
+ * - Updates (updateMessage) are durable within flush interval or on explicit flush()
19
+ * - Worst case on crash: lose updates from last flush interval (typically <100ms)
16
20
  */
17
21
  export declare class DatabaseHistoryProvider implements IConversationHistoryProvider {
18
22
  private sessionId;
19
23
  private database;
20
24
  private logger;
25
+ private cache;
26
+ private dirty;
27
+ private flushTimer;
28
+ private flushPromise;
29
+ private static readonly FLUSH_DELAY_MS;
21
30
  constructor(sessionId: string, database: Database, logger: IDextoLogger);
22
31
  getHistory(): Promise<InternalMessage[]>;
23
32
  saveMessage(message: InternalMessage): Promise<void>;
33
+ updateMessage(message: InternalMessage): Promise<void>;
24
34
  clearHistory(): Promise<void>;
35
+ /**
36
+ * Flush any pending updates to the database.
37
+ * Should be called at turn boundaries to ensure durability.
38
+ */
39
+ flush(): Promise<void>;
40
+ /**
41
+ * Internal flush implementation.
42
+ * Writes entire cache to DB (delete + re-append all).
43
+ */
44
+ private doFlush;
45
+ /**
46
+ * Schedule a debounced flush.
47
+ * Batches rapid updateMessage() calls into a single DB write.
48
+ */
49
+ private scheduleFlush;
50
+ /**
51
+ * Cancel any pending scheduled flush.
52
+ */
53
+ private cancelPendingFlush;
25
54
  private getMessagesKey;
26
55
  }
27
56
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/session/history/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAwB,YAAW,4BAA4B;IAIpE,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAJpB,OAAO,CAAC,MAAM,CAAe;gBAGjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAC1B,MAAM,EAAE,YAAY;IAKlB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAmBxC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBnC,OAAO,CAAC,cAAc;CAGzB"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/session/history/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,uBAAwB,YAAW,4BAA4B;IAapE,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAbpB,OAAO,CAAC,MAAM,CAAe;IAG7B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,YAAY,CAA8B;IAGlD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;gBAGjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAC1B,MAAM,EAAE,YAAY;IAKlB,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAyBxC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCpD,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCtD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BnC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B;;;OAGG;YACW,OAAO;IAoCrB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,cAAc;CAGzB"}
@@ -1,48 +1,59 @@
1
- import "../../chunk-C6A6W6XS.js";
1
+ import "../../chunk-PTJYTZNU.js";
2
2
  import { DextoLogComponent } from "../../logger/v2/types.js";
3
3
  import { SessionError } from "../errors.js";
4
4
  class DatabaseHistoryProvider {
5
+ // Debounce window for batching updates
5
6
  constructor(sessionId, database, logger) {
6
7
  this.sessionId = sessionId;
7
8
  this.database = database;
8
9
  this.logger = logger.createChild(DextoLogComponent.SESSION);
9
10
  }
10
11
  logger;
12
+ // Cache state
13
+ cache = null;
14
+ dirty = false;
15
+ flushTimer = null;
16
+ flushPromise = null;
17
+ // Flush configuration
18
+ static FLUSH_DELAY_MS = 100;
11
19
  async getHistory() {
12
- const key = this.getMessagesKey();
13
- try {
14
- const messages = await this.database.getRange(key, 0, 1e3);
15
- this.logger.debug(
16
- `DatabaseHistoryProvider: Retrieved ${messages.length} messages for session ${this.sessionId}`
17
- );
18
- return messages;
19
- } catch (error) {
20
- this.logger.error(
21
- `DatabaseHistoryProvider: Error retrieving messages for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
22
- );
23
- return [];
20
+ if (this.cache === null) {
21
+ const key = this.getMessagesKey();
22
+ try {
23
+ this.cache = await this.database.getRange(key, 0, 1e4);
24
+ this.logger.debug(
25
+ `DatabaseHistoryProvider: Loaded ${this.cache.length} messages from DB for session ${this.sessionId}`
26
+ );
27
+ } catch (error) {
28
+ this.logger.error(
29
+ `DatabaseHistoryProvider: Error loading messages for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
30
+ );
31
+ throw SessionError.storageFailed(
32
+ this.sessionId,
33
+ "load history",
34
+ error instanceof Error ? error.message : String(error)
35
+ );
36
+ }
24
37
  }
38
+ return [...this.cache];
25
39
  }
26
40
  async saveMessage(message) {
27
41
  const key = this.getMessagesKey();
42
+ if (this.cache === null) {
43
+ await this.getHistory();
44
+ }
45
+ this.cache.push(message);
28
46
  try {
29
47
  await this.database.append(key, message);
30
- let contentPreview = "[no content]";
31
- if (message.content) {
32
- if (typeof message.content === "string") {
33
- contentPreview = message.content.length > 100 ? `${message.content.substring(0, 100)}...` : message.content;
34
- } else if (Array.isArray(message.content)) {
35
- contentPreview = `[${message.content.length} parts]`;
36
- }
37
- }
38
48
  this.logger.debug(
39
49
  `DatabaseHistoryProvider: Saved message for session ${this.sessionId}`,
40
50
  {
41
51
  role: message.role,
42
- content: contentPreview
52
+ id: message.id
43
53
  }
44
54
  );
45
55
  } catch (error) {
56
+ this.cache.pop();
46
57
  this.logger.error(
47
58
  `DatabaseHistoryProvider: Error saving message for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
48
59
  );
@@ -53,7 +64,34 @@ class DatabaseHistoryProvider {
53
64
  );
54
65
  }
55
66
  }
67
+ async updateMessage(message) {
68
+ if (!message.id) {
69
+ this.logger.warn(
70
+ `DatabaseHistoryProvider: Ignoring update for message without id in session ${this.sessionId}`
71
+ );
72
+ return;
73
+ }
74
+ if (this.cache === null) {
75
+ await this.getHistory();
76
+ }
77
+ const index = this.cache.findIndex((m) => m.id === message.id);
78
+ if (index !== -1) {
79
+ this.cache[index] = message;
80
+ this.dirty = true;
81
+ this.scheduleFlush();
82
+ this.logger.debug(
83
+ `DatabaseHistoryProvider: Updated message ${message.id} in cache for session ${this.sessionId}`
84
+ );
85
+ } else {
86
+ this.logger.warn(
87
+ `DatabaseHistoryProvider: Message ${message.id} not found for update in session ${this.sessionId}`
88
+ );
89
+ }
90
+ }
56
91
  async clearHistory() {
92
+ this.cancelPendingFlush();
93
+ this.cache = [];
94
+ this.dirty = false;
57
95
  const key = this.getMessagesKey();
58
96
  try {
59
97
  await this.database.delete(key);
@@ -70,6 +108,81 @@ class DatabaseHistoryProvider {
70
108
  );
71
109
  }
72
110
  }
111
+ /**
112
+ * Flush any pending updates to the database.
113
+ * Should be called at turn boundaries to ensure durability.
114
+ */
115
+ async flush() {
116
+ if (this.flushPromise) {
117
+ await this.flushPromise;
118
+ return;
119
+ }
120
+ this.cancelPendingFlush();
121
+ if (!this.dirty || !this.cache) {
122
+ return;
123
+ }
124
+ this.flushPromise = this.doFlush();
125
+ try {
126
+ await this.flushPromise;
127
+ } finally {
128
+ this.flushPromise = null;
129
+ }
130
+ }
131
+ /**
132
+ * Internal flush implementation.
133
+ * Writes entire cache to DB (delete + re-append all).
134
+ */
135
+ async doFlush() {
136
+ if (!this.dirty || !this.cache) {
137
+ return;
138
+ }
139
+ const key = this.getMessagesKey();
140
+ const messageCount = this.cache.length;
141
+ try {
142
+ await this.database.delete(key);
143
+ for (const msg of this.cache) {
144
+ await this.database.append(key, msg);
145
+ }
146
+ if (!this.flushTimer) {
147
+ this.dirty = false;
148
+ }
149
+ this.logger.debug(
150
+ `DatabaseHistoryProvider: Flushed ${messageCount} messages to DB for session ${this.sessionId}`
151
+ );
152
+ } catch (error) {
153
+ this.logger.error(
154
+ `DatabaseHistoryProvider: Error flushing messages for session ${this.sessionId}: ${error instanceof Error ? error.message : String(error)}`
155
+ );
156
+ throw SessionError.storageFailed(
157
+ this.sessionId,
158
+ "flush messages",
159
+ error instanceof Error ? error.message : String(error)
160
+ );
161
+ }
162
+ }
163
+ /**
164
+ * Schedule a debounced flush.
165
+ * Batches rapid updateMessage() calls into a single DB write.
166
+ */
167
+ scheduleFlush() {
168
+ if (this.flushTimer) {
169
+ return;
170
+ }
171
+ this.flushTimer = setTimeout(() => {
172
+ this.flushTimer = null;
173
+ this.doFlush().catch(() => {
174
+ });
175
+ }, DatabaseHistoryProvider.FLUSH_DELAY_MS);
176
+ }
177
+ /**
178
+ * Cancel any pending scheduled flush.
179
+ */
180
+ cancelPendingFlush() {
181
+ if (this.flushTimer) {
182
+ clearTimeout(this.flushTimer);
183
+ this.flushTimer = null;
184
+ }
185
+ }
73
186
  getMessagesKey() {
74
187
  return `messages:${this.sessionId}`;
75
188
  }
@@ -1,4 +1,4 @@
1
- import "../../chunk-C6A6W6XS.js";
1
+ import "../../chunk-PTJYTZNU.js";
2
2
  import { DatabaseHistoryProvider } from "./database.js";
3
3
  function createDatabaseHistoryProvider(database, sessionId, logger) {
4
4
  return new DatabaseHistoryProvider(sessionId, database, logger);
@@ -22,6 +22,9 @@ __export(memory_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(memory_exports);
24
24
  class MemoryHistoryProvider {
25
+ constructor(logger) {
26
+ this.logger = logger;
27
+ }
25
28
  messages = [];
26
29
  async getHistory() {
27
30
  return [...this.messages];
@@ -29,9 +32,24 @@ class MemoryHistoryProvider {
29
32
  async saveMessage(message) {
30
33
  this.messages.push(message);
31
34
  }
35
+ async updateMessage(message) {
36
+ if (!message.id) {
37
+ this.logger.warn("MemoryHistoryProvider: Ignoring update for message without id");
38
+ return;
39
+ }
40
+ const index = this.messages.findIndex((m) => m.id === message.id);
41
+ if (index !== -1) {
42
+ this.messages[index] = message;
43
+ }
44
+ }
32
45
  async clearHistory() {
33
46
  this.messages = [];
34
47
  }
48
+ /**
49
+ * No-op for in-memory provider - all operations are already "flushed".
50
+ */
51
+ async flush() {
52
+ }
35
53
  }
36
54
  // Annotate the CommonJS export names for ESM import in node:
37
55
  0 && (module.exports = {
@@ -1,14 +1,22 @@
1
1
  import type { InternalMessage } from '../../context/types.js';
2
2
  import type { IConversationHistoryProvider } from './types.js';
3
+ import type { IDextoLogger } from '../../logger/v2/types.js';
3
4
  /**
4
5
  * Lightweight in-memory history provider for ephemeral, isolated LLM calls.
5
6
  * Used to run background tasks (e.g., title generation) without touching
6
7
  * the real session history or emitting history-related side effects.
7
8
  */
8
9
  export declare class MemoryHistoryProvider implements IConversationHistoryProvider {
10
+ private logger;
9
11
  private messages;
12
+ constructor(logger: IDextoLogger);
10
13
  getHistory(): Promise<InternalMessage[]>;
11
14
  saveMessage(message: InternalMessage): Promise<void>;
15
+ updateMessage(message: InternalMessage): Promise<void>;
12
16
  clearHistory(): Promise<void>;
17
+ /**
18
+ * No-op for in-memory provider - all operations are already "flushed".
19
+ */
20
+ flush(): Promise<void>;
13
21
  }
14
22
  //# sourceMappingURL=memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/session/history/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,4BAA4B;IACtE,OAAO,CAAC,QAAQ,CAAyB;IAEnC,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAKxC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/session/history/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,4BAA4B;IAG1D,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,QAAQ,CAAyB;gBAErB,MAAM,EAAE,YAAY;IAElC,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAKxC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -1,5 +1,8 @@
1
- import "../../chunk-C6A6W6XS.js";
1
+ import "../../chunk-PTJYTZNU.js";
2
2
  class MemoryHistoryProvider {
3
+ constructor(logger) {
4
+ this.logger = logger;
5
+ }
3
6
  messages = [];
4
7
  async getHistory() {
5
8
  return [...this.messages];
@@ -7,9 +10,24 @@ class MemoryHistoryProvider {
7
10
  async saveMessage(message) {
8
11
  this.messages.push(message);
9
12
  }
13
+ async updateMessage(message) {
14
+ if (!message.id) {
15
+ this.logger.warn("MemoryHistoryProvider: Ignoring update for message without id");
16
+ return;
17
+ }
18
+ const index = this.messages.findIndex((m) => m.id === message.id);
19
+ if (index !== -1) {
20
+ this.messages[index] = message;
21
+ }
22
+ }
10
23
  async clearHistory() {
11
24
  this.messages = [];
12
25
  }
26
+ /**
27
+ * No-op for in-memory provider - all operations are already "flushed".
28
+ */
29
+ async flush() {
30
+ }
13
31
  }
14
32
  export {
15
33
  MemoryHistoryProvider
@@ -2,13 +2,25 @@ import type { InternalMessage } from '../../context/types.js';
2
2
  /**
3
3
  * Session-scoped conversation history provider.
4
4
  * Each instance is tied to a specific session and manages only that session's messages.
5
+ *
6
+ * Implementations may use caching to optimize read performance. If caching is used,
7
+ * the flush() method should be called at turn boundaries to ensure all updates
8
+ * are persisted to durable storage.
5
9
  */
6
10
  export interface IConversationHistoryProvider {
7
11
  /** Load the full message history for this session */
8
12
  getHistory(): Promise<InternalMessage[]>;
9
- /** Append a message to this session's history */
13
+ /** Append a message to this session's history (must be durable immediately) */
10
14
  saveMessage(message: InternalMessage): Promise<void>;
15
+ /** Update an existing message in this session's history (may be cached/batched) */
16
+ updateMessage(message: InternalMessage): Promise<void>;
11
17
  /** Clear all messages for this session */
12
18
  clearHistory(): Promise<void>;
19
+ /**
20
+ * Flush any pending updates to durable storage.
21
+ * Called at turn boundaries to ensure data durability.
22
+ * Implementations without caching can make this a no-op.
23
+ */
24
+ flush(): Promise<void>;
13
25
  }
14
26
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/session/history/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,4BAA4B;IACzC,qDAAqD;IACrD,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEzC,iDAAiD;IACjD,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD,0CAA0C;IAC1C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/session/history/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IACzC,qDAAqD;IACrD,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEzC,+EAA+E;IAC/E,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD,mFAAmF;IACnF,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,0CAA0C;IAC1C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var session_exports = {};
20
20
  __export(session_exports, {
21
21
  ChatSession: () => import_chat_session.ChatSession,
22
+ MessageQueueService: () => import_message_queue.MessageQueueService,
22
23
  SessionError: () => import_errors.SessionError,
23
24
  SessionErrorCode: () => import_error_codes.SessionErrorCode,
24
25
  SessionManager: () => import_session_manager.SessionManager
@@ -28,9 +29,11 @@ var import_chat_session = require("./chat-session.js");
28
29
  var import_session_manager = require("./session-manager.js");
29
30
  var import_error_codes = require("./error-codes.js");
30
31
  var import_errors = require("./errors.js");
32
+ var import_message_queue = require("./message-queue.js");
31
33
  // Annotate the CommonJS export names for ESM import in node:
32
34
  0 && (module.exports = {
33
35
  ChatSession,
36
+ MessageQueueService,
34
37
  SessionError,
35
38
  SessionErrorCode,
36
39
  SessionManager
@@ -3,4 +3,7 @@ export { SessionManager } from './session-manager.js';
3
3
  export type { SessionMetadata } from './session-manager.js';
4
4
  export { SessionErrorCode } from './error-codes.js';
5
5
  export { SessionError } from './errors.js';
6
+ export { MessageQueueService } from './message-queue.js';
7
+ export type { UserMessageInput } from './message-queue.js';
8
+ export type { QueuedMessage, CoalescedMessage } from './types.js';
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,10 +1,12 @@
1
- import "../chunk-C6A6W6XS.js";
1
+ import "../chunk-PTJYTZNU.js";
2
2
  import { ChatSession } from "./chat-session.js";
3
3
  import { SessionManager } from "./session-manager.js";
4
4
  import { SessionErrorCode } from "./error-codes.js";
5
5
  import { SessionError } from "./errors.js";
6
+ import { MessageQueueService } from "./message-queue.js";
6
7
  export {
7
8
  ChatSession,
9
+ MessageQueueService,
8
10
  SessionError,
9
11
  SessionErrorCode,
10
12
  SessionManager