@amodalai/runtime 0.1.26 → 0.2.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 (347) hide show
  1. package/dist/src/__fixtures__/README.md +84 -0
  2. package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
  3. package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
  4. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
  5. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
  6. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
  7. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
  8. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
  9. package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
  10. package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
  11. package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
  12. package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
  13. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
  14. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
  15. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
  16. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
  17. package/dist/src/__fixtures__/smoke.test.js +718 -0
  18. package/dist/src/__fixtures__/smoke.test.js.map +1 -0
  19. package/dist/src/__tests__/test-providers.d.ts +40 -0
  20. package/dist/src/__tests__/test-providers.js +61 -0
  21. package/dist/src/__tests__/test-providers.js.map +1 -0
  22. package/dist/src/agent/local-server.d.ts +3 -3
  23. package/dist/src/agent/local-server.js +213 -122
  24. package/dist/src/agent/local-server.js.map +1 -1
  25. package/dist/src/agent/loop-types.d.ts +175 -0
  26. package/dist/src/agent/loop-types.js +20 -0
  27. package/dist/src/agent/loop-types.js.map +1 -0
  28. package/dist/src/agent/loop.d.ts +31 -0
  29. package/dist/src/agent/loop.js +139 -0
  30. package/dist/src/agent/loop.js.map +1 -0
  31. package/dist/src/agent/loop.test.js +1030 -0
  32. package/dist/src/agent/loop.test.js.map +1 -0
  33. package/dist/src/agent/mcp-config.d.ts +28 -0
  34. package/dist/src/agent/mcp-config.js +57 -0
  35. package/dist/src/agent/mcp-config.js.map +1 -0
  36. package/dist/src/agent/page-builder.js +6 -1
  37. package/dist/src/agent/page-builder.js.map +1 -1
  38. package/dist/src/agent/proactive/proactive-runner.d.ts +24 -8
  39. package/dist/src/agent/proactive/proactive-runner.js +30 -32
  40. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  41. package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
  42. package/dist/src/agent/proactive/proactive-runner.test.js +75 -87
  43. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  44. package/dist/src/agent/routes/admin-chat.d.ts +15 -3
  45. package/dist/src/agent/routes/admin-chat.js +63 -18
  46. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  47. package/dist/src/agent/routes/automations.js +5 -6
  48. package/dist/src/agent/routes/automations.js.map +1 -1
  49. package/dist/src/agent/routes/evals.d.ts +3 -2
  50. package/dist/src/agent/routes/evals.js +25 -12
  51. package/dist/src/agent/routes/evals.js.map +1 -1
  52. package/dist/src/agent/routes/files.js +7 -9
  53. package/dist/src/agent/routes/files.js.map +1 -1
  54. package/dist/src/agent/routes/inspect.d.ts +6 -2
  55. package/dist/src/agent/routes/inspect.js +31 -17
  56. package/dist/src/agent/routes/inspect.js.map +1 -1
  57. package/dist/src/agent/routes/inspect.test.js +18 -42
  58. package/dist/src/agent/routes/inspect.test.js.map +1 -1
  59. package/dist/src/agent/routes/stores.js +9 -12
  60. package/dist/src/agent/routes/stores.js.map +1 -1
  61. package/dist/src/agent/routes/task.d.ts +15 -3
  62. package/dist/src/agent/routes/task.js +16 -7
  63. package/dist/src/agent/routes/task.js.map +1 -1
  64. package/dist/src/agent/routes/task.test.d.ts +1 -1
  65. package/dist/src/agent/routes/task.test.js +70 -53
  66. package/dist/src/agent/routes/task.test.js.map +1 -1
  67. package/dist/src/agent/routes/webhooks.js +12 -3
  68. package/dist/src/agent/routes/webhooks.js.map +1 -1
  69. package/dist/src/agent/session-store.d.ts +11 -2
  70. package/dist/src/agent/session-store.js +1 -1
  71. package/dist/src/agent/session-store.js.map +1 -1
  72. package/dist/src/agent/snapshot-server.d.ts +2 -22
  73. package/dist/src/agent/snapshot-server.js +50 -27
  74. package/dist/src/agent/snapshot-server.js.map +1 -1
  75. package/dist/src/agent/states/compacting.d.ts +14 -0
  76. package/dist/src/agent/states/compacting.js +258 -0
  77. package/dist/src/agent/states/compacting.js.map +1 -0
  78. package/dist/src/agent/states/confirming.d.ts +10 -0
  79. package/dist/src/agent/states/confirming.js +76 -0
  80. package/dist/src/agent/states/confirming.js.map +1 -0
  81. package/dist/src/agent/states/dispatching.d.ts +18 -0
  82. package/dist/src/agent/states/dispatching.js +241 -0
  83. package/dist/src/agent/states/dispatching.js.map +1 -0
  84. package/dist/src/agent/states/executing.d.ts +21 -0
  85. package/dist/src/agent/states/executing.js +308 -0
  86. package/dist/src/agent/states/executing.js.map +1 -0
  87. package/dist/src/agent/states/streaming.d.ts +10 -0
  88. package/dist/src/agent/states/streaming.js +155 -0
  89. package/dist/src/agent/states/streaming.js.map +1 -0
  90. package/dist/src/agent/states/thinking.d.ts +13 -0
  91. package/dist/src/agent/states/thinking.js +233 -0
  92. package/dist/src/agent/states/thinking.js.map +1 -0
  93. package/dist/src/agent/token-estimate.d.ts +17 -0
  94. package/dist/src/agent/token-estimate.js +13 -0
  95. package/dist/src/agent/token-estimate.js.map +1 -0
  96. package/dist/src/agent/tool-executor-local.js +9 -18
  97. package/dist/src/agent/tool-executor-local.js.map +1 -1
  98. package/dist/src/agent/tool-executor-local.test.js +3 -5
  99. package/dist/src/agent/tool-executor-local.test.js.map +1 -1
  100. package/dist/src/api/create-agent.d.ts +15 -0
  101. package/dist/src/api/create-agent.js +137 -0
  102. package/dist/src/api/create-agent.js.map +1 -0
  103. package/dist/src/api/types.d.ts +68 -0
  104. package/dist/src/api/types.js +7 -0
  105. package/dist/src/api/types.js.map +1 -0
  106. package/dist/src/context/compiler.d.ts +13 -0
  107. package/dist/src/context/compiler.js +358 -0
  108. package/dist/src/context/compiler.js.map +1 -0
  109. package/dist/src/context/compiler.test.js +532 -0
  110. package/dist/src/context/compiler.test.js.map +1 -0
  111. package/dist/src/context/types.d.ts +110 -0
  112. package/dist/src/context/types.js +7 -0
  113. package/dist/src/context/types.js.map +1 -0
  114. package/dist/src/index.d.ts +33 -6
  115. package/dist/src/index.js +35 -21
  116. package/dist/src/index.js.map +1 -1
  117. package/dist/src/providers/create-provider.d.ts +23 -0
  118. package/dist/src/providers/create-provider.js +185 -0
  119. package/dist/src/providers/create-provider.js.map +1 -0
  120. package/dist/src/{agent/stores-e2e.test.d.ts → providers/create-provider.test.d.ts} +1 -1
  121. package/dist/src/providers/create-provider.test.js +95 -0
  122. package/dist/src/providers/create-provider.test.js.map +1 -0
  123. package/dist/src/providers/failover.d.ts +38 -0
  124. package/dist/src/providers/failover.js +147 -0
  125. package/dist/src/providers/failover.js.map +1 -0
  126. package/dist/src/providers/failover.test.d.ts +6 -0
  127. package/dist/src/providers/failover.test.js +169 -0
  128. package/dist/src/providers/failover.test.js.map +1 -0
  129. package/dist/src/providers/types.d.ts +110 -0
  130. package/dist/src/providers/types.js +7 -0
  131. package/dist/src/providers/types.js.map +1 -0
  132. package/dist/src/routes/ai-stream.d.ts +13 -10
  133. package/dist/src/routes/ai-stream.js +76 -41
  134. package/dist/src/routes/ai-stream.js.map +1 -1
  135. package/dist/src/routes/chat-new.test.d.ts +6 -0
  136. package/dist/src/routes/chat-new.test.js +107 -0
  137. package/dist/src/routes/chat-new.test.js.map +1 -0
  138. package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
  139. package/dist/src/routes/chat-stream-new.test.js +135 -0
  140. package/dist/src/routes/chat-stream-new.test.js.map +1 -0
  141. package/dist/src/routes/chat-stream.d.ts +14 -4
  142. package/dist/src/routes/chat-stream.js +47 -29
  143. package/dist/src/routes/chat-stream.js.map +1 -1
  144. package/dist/src/routes/chat.d.ts +13 -4
  145. package/dist/src/routes/chat.js +60 -23
  146. package/dist/src/routes/chat.js.map +1 -1
  147. package/dist/src/routes/health.d.ts +3 -2
  148. package/dist/src/routes/health.js.map +1 -1
  149. package/dist/src/routes/route-helpers.d.ts +50 -0
  150. package/dist/src/routes/route-helpers.js +80 -0
  151. package/dist/src/routes/route-helpers.js.map +1 -0
  152. package/dist/src/routes/session-resolver.d.ts +72 -0
  153. package/dist/src/routes/session-resolver.js +123 -0
  154. package/dist/src/routes/session-resolver.js.map +1 -0
  155. package/dist/src/routes/session-resolver.test.d.ts +6 -0
  156. package/dist/src/routes/session-resolver.test.js +206 -0
  157. package/dist/src/routes/session-resolver.test.js.map +1 -0
  158. package/dist/src/routes/webhooks.d.ts +3 -1
  159. package/dist/src/routes/webhooks.js +12 -4
  160. package/dist/src/routes/webhooks.js.map +1 -1
  161. package/dist/src/security/permission-checker.d.ts +80 -0
  162. package/dist/src/security/permission-checker.js +75 -0
  163. package/dist/src/security/permission-checker.js.map +1 -0
  164. package/dist/src/security/permission-checker.test.d.ts +6 -0
  165. package/dist/src/security/permission-checker.test.js +208 -0
  166. package/dist/src/security/permission-checker.test.js.map +1 -0
  167. package/dist/src/server.d.ts +12 -11
  168. package/dist/src/server.js +44 -46
  169. package/dist/src/server.js.map +1 -1
  170. package/dist/src/server.test.d.ts +1 -1
  171. package/dist/src/server.test.js +6 -144
  172. package/dist/src/server.test.js.map +1 -1
  173. package/dist/src/session/manager.d.ts +98 -0
  174. package/dist/src/session/manager.js +364 -0
  175. package/dist/src/session/manager.js.map +1 -0
  176. package/dist/src/session/manager.test.d.ts +6 -0
  177. package/dist/src/session/manager.test.js +315 -0
  178. package/dist/src/session/manager.test.js.map +1 -0
  179. package/dist/src/session/session-builder.d.ts +71 -0
  180. package/dist/src/session/session-builder.js +364 -0
  181. package/dist/src/session/session-builder.js.map +1 -0
  182. package/dist/src/session/session-builder.test.d.ts +6 -0
  183. package/dist/src/session/session-builder.test.js +352 -0
  184. package/dist/src/session/session-builder.test.js.map +1 -0
  185. package/dist/src/session/store.d.ts +57 -0
  186. package/dist/src/session/store.js +167 -0
  187. package/dist/src/session/store.js.map +1 -0
  188. package/dist/src/session/store.test.d.ts +6 -0
  189. package/dist/src/session/store.test.js +145 -0
  190. package/dist/src/session/store.test.js.map +1 -0
  191. package/dist/src/session/stream-hooks.d.ts +39 -0
  192. package/dist/src/session/stream-hooks.js +7 -0
  193. package/dist/src/session/stream-hooks.js.map +1 -0
  194. package/dist/src/session/tool-context-factory.d.ts +60 -0
  195. package/dist/src/session/tool-context-factory.js +190 -0
  196. package/dist/src/session/tool-context-factory.js.map +1 -0
  197. package/dist/src/session/tool-context-factory.test.d.ts +6 -0
  198. package/dist/src/session/tool-context-factory.test.js +287 -0
  199. package/dist/src/session/tool-context-factory.test.js.map +1 -0
  200. package/dist/src/session/types.d.ts +188 -0
  201. package/dist/src/session/types.js +7 -0
  202. package/dist/src/session/types.js.map +1 -0
  203. package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
  204. package/dist/src/stores/drizzle-store-backend.js +306 -0
  205. package/dist/src/stores/drizzle-store-backend.js.map +1 -0
  206. package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
  207. package/dist/src/stores/drizzle-store-backend.test.js +215 -0
  208. package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
  209. package/dist/src/stores/index.d.ts +4 -0
  210. package/dist/src/stores/index.js +2 -0
  211. package/dist/src/stores/index.js.map +1 -1
  212. package/dist/src/stores/pglite-store-backend.d.ts +16 -19
  213. package/dist/src/stores/pglite-store-backend.js +85 -239
  214. package/dist/src/stores/pglite-store-backend.js.map +1 -1
  215. package/dist/src/stores/postgres-store-backend.d.ts +30 -0
  216. package/dist/src/stores/postgres-store-backend.js +100 -0
  217. package/dist/src/stores/postgres-store-backend.js.map +1 -0
  218. package/dist/src/stores/schema.d.ts +491 -0
  219. package/dist/src/stores/schema.js +57 -0
  220. package/dist/src/stores/schema.js.map +1 -0
  221. package/dist/src/tools/admin-file-tools.d.ts +13 -0
  222. package/dist/src/tools/admin-file-tools.js +200 -0
  223. package/dist/src/tools/admin-file-tools.js.map +1 -0
  224. package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
  225. package/dist/src/tools/admin-file-tools.test.js +152 -0
  226. package/dist/src/tools/admin-file-tools.test.js.map +1 -0
  227. package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
  228. package/dist/src/tools/custom-tool-adapter.js +190 -0
  229. package/dist/src/tools/custom-tool-adapter.js.map +1 -0
  230. package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
  231. package/dist/src/tools/custom-tool-adapter.test.js +244 -0
  232. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
  233. package/dist/src/tools/dispatch-tool.d.ts +52 -0
  234. package/dist/src/tools/dispatch-tool.js +71 -0
  235. package/dist/src/tools/dispatch-tool.js.map +1 -0
  236. package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
  237. package/dist/src/tools/dispatch-tool.test.js +75 -0
  238. package/dist/src/tools/dispatch-tool.test.js.map +1 -0
  239. package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
  240. package/dist/src/tools/mcp-tool-adapter.js +135 -0
  241. package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
  242. package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
  243. package/dist/src/tools/mcp-tool-adapter.test.js +227 -0
  244. package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
  245. package/dist/src/tools/registry.d.ts +25 -0
  246. package/dist/src/tools/registry.js +72 -0
  247. package/dist/src/tools/registry.js.map +1 -0
  248. package/dist/src/tools/registry.test.d.ts +6 -0
  249. package/dist/src/tools/registry.test.js +121 -0
  250. package/dist/src/tools/registry.test.js.map +1 -0
  251. package/dist/src/tools/request-tool.d.ts +42 -0
  252. package/dist/src/tools/request-tool.js +190 -0
  253. package/dist/src/tools/request-tool.js.map +1 -0
  254. package/dist/src/tools/request-tool.test.d.ts +6 -0
  255. package/dist/src/tools/request-tool.test.js +254 -0
  256. package/dist/src/tools/request-tool.test.js.map +1 -0
  257. package/dist/src/tools/store-tools.d.ts +29 -0
  258. package/dist/src/tools/store-tools.js +224 -0
  259. package/dist/src/tools/store-tools.js.map +1 -0
  260. package/dist/src/tools/store-tools.test.d.ts +6 -0
  261. package/dist/src/tools/store-tools.test.js +216 -0
  262. package/dist/src/tools/store-tools.test.js.map +1 -0
  263. package/dist/src/tools/types.d.ts +111 -0
  264. package/dist/src/tools/types.js +7 -0
  265. package/dist/src/tools/types.js.map +1 -0
  266. package/dist/src/types.d.ts +20 -12
  267. package/dist/src/types.js +3 -2
  268. package/dist/src/types.js.map +1 -1
  269. package/dist/tsconfig.tsbuildinfo +1 -1
  270. package/package.json +13 -4
  271. package/dist/src/__tests__/sse-contract.test.js +0 -464
  272. package/dist/src/__tests__/sse-contract.test.js.map +0 -1
  273. package/dist/src/__tests__/tools.test.js +0 -583
  274. package/dist/src/__tests__/tools.test.js.map +0 -1
  275. package/dist/src/agent/agent-runner.d.ts +0 -33
  276. package/dist/src/agent/agent-runner.js +0 -1040
  277. package/dist/src/agent/agent-runner.js.map +0 -1
  278. package/dist/src/agent/custom-tools-e2e.test.d.ts +0 -6
  279. package/dist/src/agent/custom-tools-e2e.test.js +0 -566
  280. package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
  281. package/dist/src/agent/request-helper.d.ts +0 -16
  282. package/dist/src/agent/request-helper.js +0 -96
  283. package/dist/src/agent/request-helper.js.map +0 -1
  284. package/dist/src/agent/stores-e2e.test.js +0 -433
  285. package/dist/src/agent/stores-e2e.test.js.map +0 -1
  286. package/dist/src/agent/tool-context-builder.d.ts +0 -11
  287. package/dist/src/agent/tool-context-builder.js +0 -102
  288. package/dist/src/agent/tool-context-builder.js.map +0 -1
  289. package/dist/src/agent/tool-context-builder.test.d.ts +0 -6
  290. package/dist/src/agent/tool-context-builder.test.js +0 -152
  291. package/dist/src/agent/tool-context-builder.test.js.map +0 -1
  292. package/dist/src/agent/write-repo-file.test.js +0 -270
  293. package/dist/src/agent/write-repo-file.test.js.map +0 -1
  294. package/dist/src/cron/heartbeat-runner.d.ts +0 -21
  295. package/dist/src/cron/heartbeat-runner.js +0 -79
  296. package/dist/src/cron/heartbeat-runner.js.map +0 -1
  297. package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
  298. package/dist/src/cron/heartbeat-runner.test.js +0 -120
  299. package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
  300. package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
  301. package/dist/src/cron/heartbeat-scheduler.js +0 -55
  302. package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
  303. package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
  304. package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
  305. package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
  306. package/dist/src/routes/ai-stream.test.d.ts +0 -6
  307. package/dist/src/routes/ai-stream.test.js +0 -586
  308. package/dist/src/routes/ai-stream.test.js.map +0 -1
  309. package/dist/src/routes/ask-user-response.d.ts +0 -30
  310. package/dist/src/routes/ask-user-response.js +0 -61
  311. package/dist/src/routes/ask-user-response.js.map +0 -1
  312. package/dist/src/routes/ask-user-response.test.d.ts +0 -6
  313. package/dist/src/routes/ask-user-response.test.js +0 -88
  314. package/dist/src/routes/ask-user-response.test.js.map +0 -1
  315. package/dist/src/routes/chat-stream.test.d.ts +0 -6
  316. package/dist/src/routes/chat-stream.test.js +0 -155
  317. package/dist/src/routes/chat-stream.test.js.map +0 -1
  318. package/dist/src/routes/chat.test.d.ts +0 -6
  319. package/dist/src/routes/chat.test.js +0 -99
  320. package/dist/src/routes/chat.test.js.map +0 -1
  321. package/dist/src/routes/widget-actions.d.ts +0 -49
  322. package/dist/src/routes/widget-actions.js +0 -78
  323. package/dist/src/routes/widget-actions.js.map +0 -1
  324. package/dist/src/session/custom-tool-adapter.d.ts +0 -74
  325. package/dist/src/session/custom-tool-adapter.js +0 -180
  326. package/dist/src/session/custom-tool-adapter.js.map +0 -1
  327. package/dist/src/session/history-converter.d.ts +0 -21
  328. package/dist/src/session/history-converter.js +0 -59
  329. package/dist/src/session/history-converter.js.map +0 -1
  330. package/dist/src/session/history-converter.test.d.ts +0 -6
  331. package/dist/src/session/history-converter.test.js +0 -130
  332. package/dist/src/session/history-converter.test.js.map +0 -1
  333. package/dist/src/session/session-manager.d.ts +0 -219
  334. package/dist/src/session/session-manager.js +0 -915
  335. package/dist/src/session/session-manager.js.map +0 -1
  336. package/dist/src/session/session-manager.test.d.ts +0 -6
  337. package/dist/src/session/session-manager.test.js +0 -455
  338. package/dist/src/session/session-manager.test.js.map +0 -1
  339. package/dist/src/session/session-runner.d.ts +0 -45
  340. package/dist/src/session/session-runner.js +0 -719
  341. package/dist/src/session/session-runner.js.map +0 -1
  342. package/dist/src/session/session-runner.test.d.ts +0 -6
  343. package/dist/src/session/session-runner.test.js +0 -834
  344. package/dist/src/session/session-runner.test.js.map +0 -1
  345. /package/dist/src/{__tests__/sse-contract.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
  346. /package/dist/src/{__tests__/tools.test.d.ts → agent/loop.test.d.ts} +0 -0
  347. /package/dist/src/{agent/write-repo-file.test.d.ts → context/compiler.test.d.ts} +0 -0
@@ -0,0 +1,306 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Shared Drizzle-ORM StoreBackend implementation.
8
+ *
9
+ * One query layer used by both PGLiteStoreBackend (local dev, in-process
10
+ * WASM Postgres) and PostgresStoreBackend (hosted runtime, real Postgres).
11
+ * Each concrete factory constructs the underlying db client and passes it
12
+ * here along with an `onClose` callback for teardown.
13
+ *
14
+ * Errors bubble up as StoreError — callers at module edges (routes,
15
+ * tool-context factory) are responsible for handling.
16
+ */
17
+ import { sql, and, eq, lte, gt, isNull, or, desc, asc, count } from 'drizzle-orm';
18
+ import { storeDocuments, storeDocumentVersions } from './schema.js';
19
+ import { resolveTtl } from './ttl-resolver.js';
20
+ import { StoreError } from '../errors.js';
21
+ // Valid JSONB field identifier — alphanumerics and underscore only, must
22
+ // start with a letter or underscore. Used to guard filter/sort fields
23
+ // before interpolating into raw SQL via Drizzle's sql`` tag.
24
+ const FIELD_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
25
+ export class DrizzleStoreBackend {
26
+ db;
27
+ storeConfigs;
28
+ logger;
29
+ onClose;
30
+ writeQueue = Promise.resolve();
31
+ closed = false;
32
+ constructor(opts) {
33
+ this.db = opts.db;
34
+ this.logger = opts.logger;
35
+ this.onClose = opts.onClose;
36
+ this.storeConfigs = new Map(opts.stores.map((s) => [s.name, s]));
37
+ }
38
+ /**
39
+ * StoreBackend.initialize() — no-op on this class. The concrete
40
+ * factory (createPGLiteStoreBackend / createPostgresStoreBackend)
41
+ * creates the db client and runs DDL before constructing this
42
+ * backend. Kept for interface compliance.
43
+ */
44
+ async initialize(_stores) {
45
+ // Intentionally empty — initialization happens in the factories.
46
+ }
47
+ /**
48
+ * Serialize write operations through a queue so that PGLite's
49
+ * single-threaded WASM engine never sees concurrent writes. Postgres
50
+ * doesn't need this strictly, but the overhead is negligible and the
51
+ * shared ordering semantics are valuable.
52
+ */
53
+ enqueue(fn) {
54
+ const task = this.writeQueue.then(fn, fn);
55
+ this.writeQueue = task.then(() => { }, () => { });
56
+ return task;
57
+ }
58
+ ensureOpen(store, operation) {
59
+ if (this.closed) {
60
+ throw new StoreError('Store backend is closed', { store, operation });
61
+ }
62
+ }
63
+ async get(appId, store, key) {
64
+ this.ensureOpen(store, 'get');
65
+ try {
66
+ const rows = await this.db
67
+ .select()
68
+ .from(storeDocuments)
69
+ .where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)))
70
+ .limit(1);
71
+ if (rows.length === 0)
72
+ return null;
73
+ return this.rowToDocument(rows[0]);
74
+ }
75
+ catch (err) {
76
+ throw new StoreError('get failed', { store, operation: 'get', context: { appId, key }, cause: err });
77
+ }
78
+ }
79
+ async put(appId, store, key, payload, meta) {
80
+ this.ensureOpen(store, 'put');
81
+ return this.enqueue(async () => {
82
+ const storeConfig = this.storeConfigs.get(store);
83
+ const ttlSeconds = resolveTtl(storeConfig?.ttl, payload);
84
+ const maxVersions = storeConfig?.history?.versions;
85
+ const fullMeta = {
86
+ computedAt: new Date().toISOString(),
87
+ stale: false,
88
+ ...meta,
89
+ ttl: ttlSeconds,
90
+ };
91
+ const expiresAt = ttlSeconds ? new Date(Date.now() + ttlSeconds * 1000) : null;
92
+ try {
93
+ const existing = await this.db
94
+ .select({
95
+ version: storeDocuments.version,
96
+ payload: storeDocuments.payload,
97
+ meta: storeDocuments.meta,
98
+ })
99
+ .from(storeDocuments)
100
+ .where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)))
101
+ .limit(1);
102
+ if (existing.length > 0) {
103
+ const oldVersion = existing[0].version;
104
+ const newVersion = oldVersion + 1;
105
+ if (maxVersions && maxVersions > 0) {
106
+ await this.db.insert(storeDocumentVersions).values({
107
+ appId,
108
+ store,
109
+ key,
110
+ version: oldVersion,
111
+ payload: existing[0].payload,
112
+ meta: existing[0].meta,
113
+ });
114
+ // Trim history: keep only the most recent maxVersions rows.
115
+ await this.db.execute(sql `
116
+ DELETE FROM ${storeDocumentVersions}
117
+ WHERE ${storeDocumentVersions.appId} = ${appId}
118
+ AND ${storeDocumentVersions.store} = ${store}
119
+ AND ${storeDocumentVersions.key} = ${key}
120
+ AND ${storeDocumentVersions.version} <= (
121
+ SELECT COALESCE(MAX(${storeDocumentVersions.version}), 0) - ${maxVersions}
122
+ FROM ${storeDocumentVersions}
123
+ WHERE ${storeDocumentVersions.appId} = ${appId}
124
+ AND ${storeDocumentVersions.store} = ${store}
125
+ AND ${storeDocumentVersions.key} = ${key}
126
+ )
127
+ `);
128
+ }
129
+ await this.db
130
+ .update(storeDocuments)
131
+ .set({
132
+ version: newVersion,
133
+ payload,
134
+ meta: fullMeta,
135
+ expiresAt,
136
+ updatedAt: new Date(),
137
+ })
138
+ .where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)));
139
+ return { stored: true, key, version: newVersion, previousVersion: oldVersion };
140
+ }
141
+ await this.db.insert(storeDocuments).values({
142
+ appId,
143
+ store,
144
+ key,
145
+ version: 1,
146
+ payload,
147
+ meta: fullMeta,
148
+ expiresAt,
149
+ });
150
+ return { stored: true, key, version: 1 };
151
+ }
152
+ catch (err) {
153
+ throw new StoreError('put failed', { store, operation: 'put', context: { appId, key }, cause: err });
154
+ }
155
+ });
156
+ }
157
+ async list(appId, store, options = {}) {
158
+ this.ensureOpen(store, 'list');
159
+ const { filter, sort, limit = 100, offset = 0, includeStale = false } = options;
160
+ try {
161
+ const conds = [eq(storeDocuments.appId, appId), eq(storeDocuments.store, store)];
162
+ if (!includeStale) {
163
+ const staleCond = or(isNull(storeDocuments.expiresAt), gt(storeDocuments.expiresAt, new Date()));
164
+ if (staleCond)
165
+ conds.push(staleCond);
166
+ }
167
+ if (filter) {
168
+ for (const [field, value] of Object.entries(filter)) {
169
+ if (!FIELD_NAME_RE.test(field)) {
170
+ throw new StoreError(`Invalid store filter field name: ${field}`, {
171
+ store,
172
+ operation: 'list',
173
+ context: { field },
174
+ });
175
+ }
176
+ // `field` is regex-validated (safe to inline). `value` is bound as a parameter.
177
+ conds.push(sql `${storeDocuments.payload}->>${sql.raw(`'${field}'`)} = ${String(value)}`);
178
+ }
179
+ }
180
+ const whereClause = and(...conds);
181
+ const totalRows = await this.db
182
+ .select({ total: count() })
183
+ .from(storeDocuments)
184
+ .where(whereClause);
185
+ const total = Number(totalRows[0]?.total ?? 0);
186
+ // If limit is 0, the caller only wants the count — skip the data fetch.
187
+ if (limit === 0) {
188
+ return { documents: [], total, hasMore: total > 0 };
189
+ }
190
+ let orderExpr;
191
+ if (sort) {
192
+ const descOrder = sort.startsWith('-');
193
+ const field = descOrder ? sort.slice(1) : sort;
194
+ if (!FIELD_NAME_RE.test(field)) {
195
+ throw new StoreError(`Invalid store sort field name: ${field}`, {
196
+ store,
197
+ operation: 'list',
198
+ context: { sort },
199
+ });
200
+ }
201
+ const fieldSql = sql `${storeDocuments.payload}->>${sql.raw(`'${field}'`)}`;
202
+ orderExpr = descOrder ? desc(fieldSql) : asc(fieldSql);
203
+ }
204
+ else {
205
+ orderExpr = desc(storeDocuments.updatedAt);
206
+ }
207
+ const rows = await this.db
208
+ .select()
209
+ .from(storeDocuments)
210
+ .where(whereClause)
211
+ .orderBy(orderExpr)
212
+ .limit(limit)
213
+ .offset(offset);
214
+ const documents = rows.map((r) => this.rowToDocument(r));
215
+ return { documents, total, hasMore: offset + documents.length < total };
216
+ }
217
+ catch (err) {
218
+ if (err instanceof StoreError)
219
+ throw err;
220
+ throw new StoreError('list failed', { store, operation: 'list', context: { appId }, cause: err });
221
+ }
222
+ }
223
+ async delete(appId, store, key) {
224
+ this.ensureOpen(store, 'delete');
225
+ return this.enqueue(async () => {
226
+ try {
227
+ await this.db
228
+ .delete(storeDocumentVersions)
229
+ .where(and(eq(storeDocumentVersions.appId, appId), eq(storeDocumentVersions.store, store), eq(storeDocumentVersions.key, key)));
230
+ const deleted = await this.db
231
+ .delete(storeDocuments)
232
+ .where(and(eq(storeDocuments.appId, appId), eq(storeDocuments.store, store), eq(storeDocuments.key, key)))
233
+ .returning({ key: storeDocuments.key });
234
+ return deleted.length > 0;
235
+ }
236
+ catch (err) {
237
+ throw new StoreError('delete failed', { store, operation: 'delete', context: { appId, key }, cause: err });
238
+ }
239
+ });
240
+ }
241
+ async history(appId, store, key) {
242
+ this.ensureOpen(store, 'history');
243
+ try {
244
+ const rows = await this.db
245
+ .select()
246
+ .from(storeDocumentVersions)
247
+ .where(and(eq(storeDocumentVersions.appId, appId), eq(storeDocumentVersions.store, store), eq(storeDocumentVersions.key, key)))
248
+ .orderBy(desc(storeDocumentVersions.version));
249
+ return rows.map((r) => ({
250
+ key: r.key,
251
+ appId: r.appId,
252
+ store: r.store,
253
+ version: r.version,
254
+ payload: r.payload,
255
+ meta: r.meta,
256
+ }));
257
+ }
258
+ catch (err) {
259
+ throw new StoreError('history failed', { store, operation: 'history', context: { appId, key }, cause: err });
260
+ }
261
+ }
262
+ async purgeExpired(appId, store) {
263
+ this.ensureOpen(store ?? '(all)', 'purgeExpired');
264
+ return this.enqueue(async () => {
265
+ try {
266
+ const conds = [
267
+ eq(storeDocuments.appId, appId),
268
+ sql `${storeDocuments.expiresAt} IS NOT NULL`,
269
+ lte(storeDocuments.expiresAt, new Date()),
270
+ ];
271
+ if (store)
272
+ conds.push(eq(storeDocuments.store, store));
273
+ const deleted = await this.db
274
+ .delete(storeDocuments)
275
+ .where(and(...conds))
276
+ .returning({ key: storeDocuments.key });
277
+ return deleted.length;
278
+ }
279
+ catch (err) {
280
+ throw new StoreError('purgeExpired failed', { store: store ?? '(all)', operation: 'purgeExpired', context: { appId }, cause: err });
281
+ }
282
+ });
283
+ }
284
+ async close() {
285
+ if (this.closed)
286
+ return;
287
+ this.closed = true;
288
+ // Wait for any in-flight writes to settle before closing the db.
289
+ await this.writeQueue.catch(() => { });
290
+ await this.onClose();
291
+ this.logger.debug('store_backend_closed', {});
292
+ }
293
+ rowToDocument(row) {
294
+ const isStale = row.expiresAt ? row.expiresAt <= new Date() : false;
295
+ const meta = { ...row.meta, stale: isStale };
296
+ return {
297
+ key: row.key,
298
+ appId: row.appId,
299
+ store: row.store,
300
+ version: row.version,
301
+ payload: row.payload,
302
+ meta,
303
+ };
304
+ }
305
+ }
306
+ //# sourceMappingURL=drizzle-store-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle-store-backend.js","sourceRoot":"","sources":["../../../src/stores/drizzle-store-backend.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,MAAM,aAAa,CAAC;AAYhF,OAAO,EAAC,cAAc,EAAE,qBAAqB,EAAC,MAAM,aAAa,CAAC;AAClE,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAGxC,yEAAyE;AACzE,sEAAsE;AACtE,6DAA6D;AAC7D,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAWjD,MAAM,OAAO,mBAAmB;IACb,EAAE,CAAgB;IAClB,YAAY,CAA2B;IACvC,MAAM,CAAS;IACf,OAAO,CAAsB;IACtC,UAAU,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,IAAgC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,iEAAiE;IACnE,CAAC;IAED;;;;;OAKG;IACK,OAAO,CAAI,EAAoB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,KAAa,EAAE,SAAiB;QACjD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,UAAU,CAAC,yBAAyB,EAAE,EAAC,KAAK,EAAE,SAAS,EAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW;QACjD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;iBACvB,MAAM,EAAE;iBACR,IAAI,CAAC,cAAc,CAAC;iBACpB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAC5B,CACF;iBACA,KAAK,CAAC,CAAC,CAAC,CAAC;YAEZ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CAAC,YAAY,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAC,KAAK,EAAE,GAAG,EAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,KAAa,EACb,KAAa,EACb,GAAW,EACX,OAAgC,EAChC,IAAgC;QAEhC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;YAEnD,MAAM,QAAQ,GAAsB;gBAClC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,KAAK,EAAE,KAAK;gBACZ,GAAG,IAAI;gBACP,GAAG,EAAE,UAAU;aAChB,CAAC;YAEF,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE/E,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE;qBAC3B,MAAM,CAAC;oBACN,OAAO,EAAE,cAAc,CAAC,OAAO;oBAC/B,OAAO,EAAE,cAAc,CAAC,OAAO;oBAC/B,IAAI,EAAE,cAAc,CAAC,IAAI;iBAC1B,CAAC;qBACD,IAAI,CAAC,cAAc,CAAC;qBACpB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAC5B,CACF;qBACA,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEZ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBACvC,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;oBAElC,IAAI,WAAW,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;wBACnC,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC;4BACjD,KAAK;4BACL,KAAK;4BACL,GAAG;4BACH,OAAO,EAAE,UAAU;4BACnB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO;4BAC5B,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;yBACvB,CAAC,CAAC;wBAEH,4DAA4D;wBAC5D,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA;4BACT,qBAAqB;sBAC3B,qBAAqB,CAAC,KAAK,MAAM,KAAK;sBACtC,qBAAqB,CAAC,KAAK,MAAM,KAAK;sBACtC,qBAAqB,CAAC,GAAG,MAAM,GAAG;sBAClC,qBAAqB,CAAC,OAAO;wCACX,qBAAqB,CAAC,OAAO,WAAW,WAAW;yBAClE,qBAAqB;0BACpB,qBAAqB,CAAC,KAAK,MAAM,KAAK;0BACtC,qBAAqB,CAAC,KAAK,MAAM,KAAK;0BACtC,qBAAqB,CAAC,GAAG,MAAM,GAAG;;aAE/C,CAAC,CAAC;oBACL,CAAC;oBAED,MAAM,IAAI,CAAC,EAAE;yBACV,MAAM,CAAC,cAAc,CAAC;yBACtB,GAAG,CAAC;wBACH,OAAO,EAAE,UAAU;wBACnB,OAAO;wBACP,IAAI,EAAE,QAAQ;wBACd,SAAS;wBACT,SAAS,EAAE,IAAI,IAAI,EAAE;qBACtB,CAAC;yBACD,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAC5B,CACF,CAAC;oBAEJ,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAC,CAAC;gBAC/E,CAAC;gBAED,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;oBAC1C,KAAK;oBACL,KAAK;oBACL,GAAG;oBACH,OAAO,EAAE,CAAC;oBACV,OAAO;oBACP,IAAI,EAAE,QAAQ;oBACd,SAAS;iBACV,CAAC,CAAC;gBAEH,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAC,CAAC;YACzC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,UAAU,CAAC,YAAY,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAC,KAAK,EAAE,GAAG,EAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;YACnG,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAa,EACb,KAAa,EACb,UAA4B,EAAE;QAE9B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY,GAAG,KAAK,EAAC,GAAG,OAAO,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAEjF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;gBACjG,IAAI,SAAS;oBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/B,MAAM,IAAI,UAAU,CAAC,oCAAoC,KAAK,EAAE,EAAE;4BAChE,KAAK;4BACL,SAAS,EAAE,MAAM;4BACjB,OAAO,EAAE,EAAC,KAAK,EAAC;yBACjB,CAAC,CAAC;oBACL,CAAC;oBACD,gFAAgF;oBAChF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAA,GAAG,cAAc,CAAC,OAAO,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;YAED,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YAElC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE;iBAC5B,MAAM,CAAC,EAAC,KAAK,EAAE,KAAK,EAAE,EAAC,CAAC;iBACxB,IAAI,CAAC,cAAc,CAAC;iBACpB,KAAK,CAAC,WAAW,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;YAE/C,wEAAwE;YACxE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAC,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,EAAC,CAAC;YACpD,CAAC;YAED,IAAI,SAAS,CAAC;YACd,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,UAAU,CAAC,kCAAkC,KAAK,EAAE,EAAE;wBAC9D,KAAK;wBACL,SAAS,EAAE,MAAM;wBACjB,OAAO,EAAE,EAAC,IAAI,EAAC;qBAChB,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,QAAQ,GAAG,GAAG,CAAA,GAAG,cAAc,CAAC,OAAO,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC3E,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;iBACvB,MAAM,EAAE;iBACR,IAAI,CAAC,cAAc,CAAC;iBACpB,KAAK,CAAC,WAAW,CAAC;iBAClB,OAAO,CAAC,SAAS,CAAC;iBAClB,KAAK,CAAC,KAAK,CAAC;iBACZ,MAAM,CAAC,MAAM,CAAC,CAAC;YAElB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO,EAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,EAAC,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,UAAU;gBAAE,MAAM,GAAG,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,aAAa,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAC,KAAK,EAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,EAAE;qBACV,MAAM,CAAC,qBAAqB,CAAC;qBAC7B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EACtC,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EACtC,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CACnC,CACF,CAAC;gBAEJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE;qBAC1B,MAAM,CAAC,cAAc,CAAC;qBACtB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAC/B,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAC5B,CACF;qBACA,SAAS,CAAC,EAAC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAC,CAAC,CAAC;gBAExC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAC,KAAK,EAAE,GAAG,EAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;YACzG,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW;QACrD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;iBACvB,MAAM,EAAE;iBACR,IAAI,CAAC,qBAAqB,CAAC;iBAC3B,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EACtC,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EACtC,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CACnC,CACF;iBACA,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;YAEhD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EAAC,KAAK,EAAE,GAAG,EAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,KAAc;QAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG;oBACZ,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC;oBAC/B,GAAG,CAAA,GAAG,cAAc,CAAC,SAAS,cAAc;oBAC5C,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;iBAC1C,CAAC;gBACF,IAAI,KAAK;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAEvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE;qBAC1B,MAAM,CAAC,cAAc,CAAC;qBACtB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;qBACpB,SAAS,CAAC,EAAC,GAAG,EAAE,cAAc,CAAC,GAAG,EAAC,CAAC,CAAC;gBAExC,OAAO,OAAO,CAAC,MAAM,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAC,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAC,KAAK,EAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;YAClI,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,iEAAiE;QACjE,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,aAAa,CAAC,GAAuC;QAC3D,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACpE,MAAM,IAAI,GAAsB,EAAC,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAC,CAAC;QAC9D,OAAO;YACL,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI;SACL,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
@@ -0,0 +1,215 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Shared Drizzle store backend tests.
8
+ *
9
+ * Runs the full behaviour matrix (tenant isolation, concurrent writes,
10
+ * TTL/purge, filter-field validation) against the PGLite-backed factory.
11
+ *
12
+ * A Postgres variant runs only when TEST_POSTGRES_URL is set in the
13
+ * environment — otherwise that `describe` block is skipped. This lets
14
+ * CI stay fast and local devs can opt into the Postgres path.
15
+ */
16
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
17
+ import { createPGLiteStoreBackend } from './pglite-store-backend.js';
18
+ import { createPostgresStoreBackend } from './postgres-store-backend.js';
19
+ import { StoreError } from '../errors.js';
20
+ function makeStore(overrides = {}) {
21
+ return {
22
+ name: 'test-store',
23
+ entity: {
24
+ name: 'TestEntity',
25
+ key: '{id}',
26
+ schema: {
27
+ id: { type: 'string' },
28
+ value: { type: 'string' },
29
+ },
30
+ },
31
+ location: '/test/stores/test-store.json',
32
+ ...overrides,
33
+ };
34
+ }
35
+ const STORES = [
36
+ makeStore(),
37
+ makeStore({ name: 'ttl-store', ttl: 1 }),
38
+ makeStore({ name: 'versioned-store', history: { versions: 3 } }),
39
+ ];
40
+ function runSuite(makeBackend) {
41
+ let backend;
42
+ let cleanup;
43
+ beforeEach(async () => {
44
+ const b = await makeBackend();
45
+ backend = b.backend;
46
+ cleanup = b.cleanup;
47
+ });
48
+ afterEach(async () => {
49
+ await cleanup();
50
+ });
51
+ describe('tenant isolation', () => {
52
+ it('same (store, key) across different appIds do not collide', async () => {
53
+ await backend.put('tenant-a', 'test-store', 'shared', { id: 'shared', value: 'A' }, {});
54
+ await backend.put('tenant-b', 'test-store', 'shared', { id: 'shared', value: 'B' }, {});
55
+ const a = await backend.get('tenant-a', 'test-store', 'shared');
56
+ const b = await backend.get('tenant-b', 'test-store', 'shared');
57
+ expect(a?.payload['value']).toBe('A');
58
+ expect(b?.payload['value']).toBe('B');
59
+ });
60
+ it('list only returns the caller\'s appId rows', async () => {
61
+ await backend.put('tenant-a', 'test-store', 'a1', { id: 'a1' }, {});
62
+ await backend.put('tenant-a', 'test-store', 'a2', { id: 'a2' }, {});
63
+ await backend.put('tenant-b', 'test-store', 'b1', { id: 'b1' }, {});
64
+ const resA = await backend.list('tenant-a', 'test-store');
65
+ const resB = await backend.list('tenant-b', 'test-store');
66
+ expect(resA.total).toBe(2);
67
+ expect(resB.total).toBe(1);
68
+ expect(resA.documents.every((d) => d.appId === 'tenant-a')).toBe(true);
69
+ expect(resB.documents.every((d) => d.appId === 'tenant-b')).toBe(true);
70
+ });
71
+ it('delete on one tenant does not affect the other', async () => {
72
+ await backend.put('tenant-a', 'test-store', 'k', { id: 'k' }, {});
73
+ await backend.put('tenant-b', 'test-store', 'k', { id: 'k' }, {});
74
+ await backend.delete('tenant-a', 'test-store', 'k');
75
+ expect(await backend.get('tenant-a', 'test-store', 'k')).toBeNull();
76
+ expect(await backend.get('tenant-b', 'test-store', 'k')).not.toBeNull();
77
+ });
78
+ });
79
+ describe('concurrent writes', () => {
80
+ it('serializes parallel puts to the same key via write queue', async () => {
81
+ // Fire 20 concurrent puts at the same key. The write queue must
82
+ // serialize them so each read-modify-write sees the previous
83
+ // version — final version should be exactly 20.
84
+ const writes = Array.from({ length: 20 }, (_, i) => backend.put('app', 'test-store', 'same-key', { id: 'same-key', n: i }, {}));
85
+ const results = await Promise.all(writes);
86
+ // All writes reported stored:true
87
+ expect(results.every((r) => r.stored)).toBe(true);
88
+ const final = await backend.get('app', 'test-store', 'same-key');
89
+ expect(final?.version).toBe(20);
90
+ });
91
+ });
92
+ describe('purgeExpired', () => {
93
+ it('removes only expired rows and returns the count', async () => {
94
+ // ttl-store has ttl=1s
95
+ await backend.put('app', 'ttl-store', 'e1', { id: 'e1' }, {});
96
+ await backend.put('app', 'ttl-store', 'e2', { id: 'e2' }, {});
97
+ // Non-TTL store — should never be purged
98
+ await backend.put('app', 'test-store', 'keep', { id: 'keep' }, {});
99
+ // Wait for TTL to elapse
100
+ await new Promise((r) => setTimeout(r, 1100));
101
+ const purged = await backend.purgeExpired('app');
102
+ expect(purged).toBe(2);
103
+ expect(await backend.get('app', 'ttl-store', 'e1')).toBeNull();
104
+ expect(await backend.get('app', 'ttl-store', 'e2')).toBeNull();
105
+ expect(await backend.get('app', 'test-store', 'keep')).not.toBeNull();
106
+ });
107
+ it('scoped purge only touches the named store', async () => {
108
+ await backend.put('app', 'ttl-store', 'a', { id: 'a' }, {});
109
+ await backend.put('app', 'test-store', 'b', { id: 'b' }, {});
110
+ // put with manual expires_at on test-store via TTL=0 is not exposed;
111
+ // instead, verify purgeExpired scoped to ttl-store only affects ttl-store.
112
+ await new Promise((r) => setTimeout(r, 1100));
113
+ const purged = await backend.purgeExpired('app', 'ttl-store');
114
+ expect(purged).toBe(1);
115
+ expect(await backend.get('app', 'test-store', 'b')).not.toBeNull();
116
+ });
117
+ it('excludes expired rows from list() when includeStale is false', async () => {
118
+ await backend.put('app', 'ttl-store', 'x', { id: 'x' }, {});
119
+ await new Promise((r) => setTimeout(r, 1100));
120
+ const defaultList = await backend.list('app', 'ttl-store');
121
+ expect(defaultList.total).toBe(0);
122
+ const withStale = await backend.list('app', 'ttl-store', { includeStale: true });
123
+ expect(withStale.total).toBe(1);
124
+ expect(withStale.documents[0].meta.stale).toBe(true);
125
+ });
126
+ });
127
+ describe('filter-field validation', () => {
128
+ it('rejects filter field names with injection characters', async () => {
129
+ await backend.put('app', 'test-store', 'k', { id: 'k' }, {});
130
+ await expect(backend.list('app', 'test-store', { filter: { "'; DROP TABLE store_documents; --": 'x' } })).rejects.toBeInstanceOf(StoreError);
131
+ });
132
+ it('rejects filter fields containing whitespace or punctuation', async () => {
133
+ await expect(backend.list('app', 'test-store', { filter: { 'value OR 1=1': 'x' } })).rejects.toBeInstanceOf(StoreError);
134
+ });
135
+ it('rejects sort field with injection characters', async () => {
136
+ await expect(backend.list('app', 'test-store', { sort: "value); DROP TABLE x; --" })).rejects.toBeInstanceOf(StoreError);
137
+ });
138
+ it('accepts valid snake_case filter field', async () => {
139
+ await backend.put('app', 'test-store', 'k', { id: 'k', my_field: 'yes' }, {});
140
+ const result = await backend.list('app', 'test-store', { filter: { my_field: 'yes' } });
141
+ expect(result.total).toBe(1);
142
+ });
143
+ });
144
+ describe('versioning edge cases', () => {
145
+ it('history respects maxVersions trim', async () => {
146
+ // versioned-store has history.versions=3
147
+ for (let i = 1; i <= 6; i++) {
148
+ await backend.put('app', 'versioned-store', 'k', { id: 'k', n: i }, {});
149
+ }
150
+ const history = await backend.history('app', 'versioned-store', 'k');
151
+ // Current version is 6; history should hold the trailing 3 prior versions (3,4,5)
152
+ expect(history).toHaveLength(3);
153
+ expect(history[0].version).toBe(5);
154
+ expect(history[2].version).toBe(3);
155
+ });
156
+ });
157
+ describe('close() idempotency', () => {
158
+ it('double-close is safe and ops after close throw StoreError', async () => {
159
+ await backend.put('app', 'test-store', 'k', { id: 'k' }, {});
160
+ await backend.close();
161
+ // Second close should be a no-op, not throw
162
+ await backend.close();
163
+ // Operations after close throw StoreError
164
+ await expect(backend.get('app', 'test-store', 'k')).rejects.toBeInstanceOf(StoreError);
165
+ await expect(backend.put('app', 'test-store', 'k', { id: 'k' }, {})).rejects.toBeInstanceOf(StoreError);
166
+ // The cleanup() in afterEach expects to close a live backend; re-open
167
+ // via the factory so afterEach doesn't blow up on a double-cleanup.
168
+ // (It's simpler to just no-op cleanup here by setting a flag — but
169
+ // the suite-wide afterEach would need the hook. Instead, since
170
+ // close() is idempotent, let afterEach call it again safely.)
171
+ });
172
+ });
173
+ }
174
+ // ---------------------------------------------------------------------------
175
+ // PGLite suite (always runs)
176
+ // ---------------------------------------------------------------------------
177
+ describe('DrizzleStoreBackend (PGLite)', () => {
178
+ runSuite(async () => {
179
+ const backend = await createPGLiteStoreBackend(STORES);
180
+ return {
181
+ backend,
182
+ cleanup: () => backend.close(),
183
+ };
184
+ });
185
+ });
186
+ // ---------------------------------------------------------------------------
187
+ // Postgres suite (opt-in via TEST_POSTGRES_URL env var)
188
+ // ---------------------------------------------------------------------------
189
+ const pgUrl = process.env['TEST_POSTGRES_URL'] ?? '';
190
+ const pgDescribe = pgUrl ? describe : describe.skip;
191
+ pgDescribe('DrizzleStoreBackend (Postgres, via TEST_POSTGRES_URL)', () => {
192
+ runSuite(async () => {
193
+ // Drop any existing tables so every test run starts clean. Use a
194
+ // dedicated database for TEST_POSTGRES_URL — these DROPs are
195
+ // destructive and will wipe any store tables in the target DB.
196
+ const pg = await import('pg');
197
+ const { Pool: CleanPool } = pg.default ?? pg;
198
+ const cleanPool = new CleanPool({ connectionString: pgUrl });
199
+ try {
200
+ await cleanPool.query('DROP TABLE IF EXISTS store_document_versions CASCADE');
201
+ await cleanPool.query('DROP TABLE IF EXISTS store_documents CASCADE');
202
+ }
203
+ finally {
204
+ await cleanPool.end();
205
+ }
206
+ const backend = await createPostgresStoreBackend(STORES, {
207
+ connectionString: pgUrl,
208
+ });
209
+ return {
210
+ backend,
211
+ cleanup: () => backend.close(),
212
+ };
213
+ });
214
+ });
215
+ //# sourceMappingURL=drizzle-store-backend.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle-store-backend.test.js","sourceRoot":"","sources":["../../../src/stores/drizzle-store-backend.test.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,9 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  export { PGLiteStoreBackend, createPGLiteStoreBackend } from './pglite-store-backend.js';
7
+ export type { PGLiteStoreBackendOptions } from './pglite-store-backend.js';
8
+ export { DrizzleStoreBackend } from './drizzle-store-backend.js';
9
+ export { createPostgresStoreBackend } from './postgres-store-backend.js';
10
+ export type { PostgresStoreBackendOptions } from './postgres-store-backend.js';
7
11
  export { resolveKey } from './key-resolver.js';
8
12
  export { resolveTtl, evaluateCondition } from './ttl-resolver.js';
@@ -4,6 +4,8 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  export { PGLiteStoreBackend, createPGLiteStoreBackend } from './pglite-store-backend.js';
7
+ export { DrizzleStoreBackend } from './drizzle-store-backend.js';
8
+ export { createPostgresStoreBackend } from './postgres-store-backend.js';
7
9
  export { resolveKey } from './key-resolver.js';
8
10
  export { resolveTtl, evaluateCondition } from './ttl-resolver.js';
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,kBAAkB,EAAE,wBAAwB,EAAC,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,kBAAkB,EAAE,wBAAwB,EAAC,MAAM,2BAA2B,CAAC;AAEvF,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAC,0BAA0B,EAAC,MAAM,6BAA6B,CAAC;AAEvE,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC"}
@@ -4,29 +4,27 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  import type { LoadedStore } from '@amodalai/core';
7
- import type { StoreBackend, StoreDocument, StoreDocumentMeta, StorePutResult, StoreListOptions, StoreListResult } from '@amodalai/core';
7
+ import type { StoreBackend, StoreDocument, StoreDocumentMeta, StorePutResult, StoreListOptions, StoreListResult } from '@amodalai/types';
8
+ import type { Logger } from '../logger.js';
8
9
  /**
9
- * PGLite-backed store backend.
10
+ * PGLite store backend. Delegates all query logic to DrizzleStoreBackend
11
+ * once the underlying PGLite instance has been initialized.
10
12
  *
11
- * Uses in-process WASM Postgres via @electric-sql/pglite.
12
- * Data is stored in a configurable directory (default: .amodal/store-data/).
13
- *
14
- * All writes are serialized through a queue to prevent concurrent access
15
- * issues with PGLite's single-threaded WASM engine.
13
+ * Constructor + initialize() pattern is preserved for backwards
14
+ * compatibility with existing callers (and test suites that `new` then
15
+ * call `initialize()`).
16
16
  */
17
+ export interface PGLiteStoreBackendOptions {
18
+ dataDir?: string;
19
+ logger?: Logger;
20
+ }
17
21
  export declare class PGLiteStoreBackend implements StoreBackend {
18
- private db;
19
22
  private readonly dataDir;
20
- private stores;
21
- private writeQueue;
22
- constructor(dataDir?: string);
23
- /**
24
- * Serialize a write operation through the queue.
25
- * Ensures PGLite only processes one write at a time.
26
- */
27
- private enqueue;
23
+ private readonly logger;
24
+ private inner;
25
+ constructor(dataDirOrOpts?: string | PGLiteStoreBackendOptions);
28
26
  initialize(stores: LoadedStore[]): Promise<void>;
29
- private ensureDb;
27
+ private ensure;
30
28
  get(appId: string, store: string, key: string): Promise<StoreDocument | null>;
31
29
  put(appId: string, store: string, key: string, payload: Record<string, unknown>, meta: Partial<StoreDocumentMeta>): Promise<StorePutResult>;
32
30
  list(appId: string, store: string, options?: StoreListOptions): Promise<StoreListResult>;
@@ -34,9 +32,8 @@ export declare class PGLiteStoreBackend implements StoreBackend {
34
32
  history(appId: string, store: string, key: string): Promise<StoreDocument[]>;
35
33
  purgeExpired(appId: string, store?: string): Promise<number>;
36
34
  close(): Promise<void>;
37
- private rowToDocument;
38
35
  }
39
36
  /**
40
37
  * Create a PGLite store backend.
41
38
  */
42
- export declare function createPGLiteStoreBackend(stores: LoadedStore[], dataDir?: string): Promise<PGLiteStoreBackend>;
39
+ export declare function createPGLiteStoreBackend(stores: LoadedStore[], dataDirOrOpts?: string | PGLiteStoreBackendOptions): Promise<PGLiteStoreBackend>;