@amodalai/runtime 0.1.26 → 0.2.1

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 (445) hide show
  1. package/dist/src/__fixtures__/README.md +88 -0
  2. package/dist/src/__fixtures__/e2e.test.js +211 -0
  3. package/dist/src/__fixtures__/e2e.test.js.map +1 -0
  4. package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
  5. package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -0
  6. package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
  7. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
  8. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
  9. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
  10. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
  11. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
  12. package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
  13. package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
  14. package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
  15. package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
  16. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
  17. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
  18. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
  19. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
  20. package/dist/src/__fixtures__/smoke.test.js +1404 -0
  21. package/dist/src/__fixtures__/smoke.test.js.map +1 -0
  22. package/dist/src/__fixtures__/test-env.d.ts +27 -0
  23. package/dist/src/__fixtures__/test-env.js +64 -0
  24. package/dist/src/__fixtures__/test-env.js.map +1 -0
  25. package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
  26. package/dist/src/__fixtures__/test-helpers.js +120 -0
  27. package/dist/src/__fixtures__/test-helpers.js.map +1 -0
  28. package/dist/src/__tests__/test-providers.d.ts +40 -0
  29. package/dist/src/__tests__/test-providers.js +61 -0
  30. package/dist/src/__tests__/test-providers.js.map +1 -0
  31. package/dist/src/agent/agent-types.d.ts +22 -0
  32. package/dist/src/agent/agent-types.js.map +1 -1
  33. package/dist/src/agent/automation-bridge.d.ts +9 -0
  34. package/dist/src/agent/automation-bridge.js +26 -0
  35. package/dist/src/agent/automation-bridge.js.map +1 -1
  36. package/dist/src/agent/automation-bridge.test.js +63 -0
  37. package/dist/src/agent/automation-bridge.test.js.map +1 -1
  38. package/dist/src/agent/local-server.d.ts +1 -8
  39. package/dist/src/agent/local-server.js +398 -163
  40. package/dist/src/agent/local-server.js.map +1 -1
  41. package/dist/src/agent/local-server.test.js +14 -8
  42. package/dist/src/agent/local-server.test.js.map +1 -1
  43. package/dist/src/agent/loop-types.d.ts +254 -0
  44. package/dist/src/agent/loop-types.js +24 -0
  45. package/dist/src/agent/loop-types.js.map +1 -0
  46. package/dist/src/agent/loop.d.ts +31 -0
  47. package/dist/src/agent/loop.js +152 -0
  48. package/dist/src/agent/loop.js.map +1 -0
  49. package/dist/src/agent/loop.test.js +1594 -0
  50. package/dist/src/agent/loop.test.js.map +1 -0
  51. package/dist/src/agent/mcp-config.d.ts +28 -0
  52. package/dist/src/agent/mcp-config.js +57 -0
  53. package/dist/src/agent/mcp-config.js.map +1 -0
  54. package/dist/src/agent/page-builder.js +6 -1
  55. package/dist/src/agent/page-builder.js.map +1 -1
  56. package/dist/src/agent/proactive/delivery-router.d.ts +68 -0
  57. package/dist/src/agent/proactive/delivery-router.js +337 -0
  58. package/dist/src/agent/proactive/delivery-router.js.map +1 -0
  59. package/dist/src/agent/{stores-e2e.test.d.ts → proactive/delivery-router.test.d.ts} +1 -1
  60. package/dist/src/agent/proactive/delivery-router.test.js +455 -0
  61. package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
  62. package/dist/src/agent/proactive/proactive-runner.d.ts +46 -8
  63. package/dist/src/agent/proactive/proactive-runner.js +67 -37
  64. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  65. package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
  66. package/dist/src/agent/proactive/proactive-runner.test.js +73 -87
  67. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  68. package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
  69. package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
  70. package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
  71. package/dist/src/agent/routes/admin-chat.d.ts +15 -3
  72. package/dist/src/agent/routes/admin-chat.js +61 -18
  73. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  74. package/dist/src/agent/routes/automations.js +5 -6
  75. package/dist/src/agent/routes/automations.js.map +1 -1
  76. package/dist/src/agent/routes/evals.d.ts +3 -2
  77. package/dist/src/agent/routes/evals.js +25 -12
  78. package/dist/src/agent/routes/evals.js.map +1 -1
  79. package/dist/src/agent/routes/files.js +7 -9
  80. package/dist/src/agent/routes/files.js.map +1 -1
  81. package/dist/src/agent/routes/inspect.d.ts +6 -2
  82. package/dist/src/agent/routes/inspect.js +31 -17
  83. package/dist/src/agent/routes/inspect.js.map +1 -1
  84. package/dist/src/agent/routes/inspect.test.js +18 -42
  85. package/dist/src/agent/routes/inspect.test.js.map +1 -1
  86. package/dist/src/agent/routes/stores.js +9 -12
  87. package/dist/src/agent/routes/stores.js.map +1 -1
  88. package/dist/src/agent/routes/task.d.ts +15 -3
  89. package/dist/src/agent/routes/task.js +16 -7
  90. package/dist/src/agent/routes/task.js.map +1 -1
  91. package/dist/src/agent/routes/task.test.d.ts +1 -1
  92. package/dist/src/agent/routes/task.test.js +68 -53
  93. package/dist/src/agent/routes/task.test.js.map +1 -1
  94. package/dist/src/agent/routes/webhooks.js +12 -3
  95. package/dist/src/agent/routes/webhooks.js.map +1 -1
  96. package/dist/src/agent/snapshot-server.d.ts +2 -22
  97. package/dist/src/agent/snapshot-server.js +48 -27
  98. package/dist/src/agent/snapshot-server.js.map +1 -1
  99. package/dist/src/agent/states/compacting.d.ts +14 -0
  100. package/dist/src/agent/states/compacting.js +260 -0
  101. package/dist/src/agent/states/compacting.js.map +1 -0
  102. package/dist/src/agent/states/confirming.d.ts +10 -0
  103. package/dist/src/agent/states/confirming.js +79 -0
  104. package/dist/src/agent/states/confirming.js.map +1 -0
  105. package/dist/src/agent/states/dispatching.d.ts +18 -0
  106. package/dist/src/agent/states/dispatching.js +285 -0
  107. package/dist/src/agent/states/dispatching.js.map +1 -0
  108. package/dist/src/agent/states/executing.d.ts +21 -0
  109. package/dist/src/agent/states/executing.js +452 -0
  110. package/dist/src/agent/states/executing.js.map +1 -0
  111. package/dist/src/agent/states/streaming.d.ts +10 -0
  112. package/dist/src/agent/states/streaming.js +169 -0
  113. package/dist/src/agent/states/streaming.js.map +1 -0
  114. package/dist/src/agent/states/thinking.d.ts +13 -0
  115. package/dist/src/agent/states/thinking.js +450 -0
  116. package/dist/src/agent/states/thinking.js.map +1 -0
  117. package/dist/src/agent/token-estimate.d.ts +31 -0
  118. package/dist/src/agent/token-estimate.js +34 -0
  119. package/dist/src/agent/token-estimate.js.map +1 -0
  120. package/dist/src/agent/token-estimate.test.d.ts +6 -0
  121. package/dist/src/agent/token-estimate.test.js +44 -0
  122. package/dist/src/agent/token-estimate.test.js.map +1 -0
  123. package/dist/src/agent/tool-executor-local.js +9 -18
  124. package/dist/src/agent/tool-executor-local.js.map +1 -1
  125. package/dist/src/agent/tool-executor-local.test.js +3 -5
  126. package/dist/src/agent/tool-executor-local.test.js.map +1 -1
  127. package/dist/src/api/create-agent.d.ts +15 -0
  128. package/dist/src/api/create-agent.js +134 -0
  129. package/dist/src/api/create-agent.js.map +1 -0
  130. package/dist/src/api/types.d.ts +66 -0
  131. package/dist/src/api/types.js +7 -0
  132. package/dist/src/api/types.js.map +1 -0
  133. package/dist/src/context/compiler.d.ts +13 -0
  134. package/dist/src/context/compiler.js +358 -0
  135. package/dist/src/context/compiler.js.map +1 -0
  136. package/dist/src/context/compiler.test.d.ts +6 -0
  137. package/dist/src/context/compiler.test.js +532 -0
  138. package/dist/src/context/compiler.test.js.map +1 -0
  139. package/dist/src/context/types.d.ts +110 -0
  140. package/dist/src/context/types.js +7 -0
  141. package/dist/src/context/types.js.map +1 -0
  142. package/dist/src/env-ref.d.ts +13 -0
  143. package/dist/src/env-ref.js +31 -0
  144. package/dist/src/env-ref.js.map +1 -0
  145. package/dist/src/env-ref.test.d.ts +6 -0
  146. package/dist/src/env-ref.test.js +34 -0
  147. package/dist/src/env-ref.test.js.map +1 -0
  148. package/dist/src/errors.d.ts +15 -0
  149. package/dist/src/errors.js +22 -0
  150. package/dist/src/errors.js.map +1 -1
  151. package/dist/src/errors.test.js +2 -2
  152. package/dist/src/errors.test.js.map +1 -1
  153. package/dist/src/events/event-bus.d.ts +54 -0
  154. package/dist/src/events/event-bus.js +84 -0
  155. package/dist/src/events/event-bus.js.map +1 -0
  156. package/dist/src/events/event-bus.test.d.ts +6 -0
  157. package/dist/src/events/event-bus.test.js +112 -0
  158. package/dist/src/events/event-bus.test.js.map +1 -0
  159. package/dist/src/events/events-route.d.ts +36 -0
  160. package/dist/src/events/events-route.js +80 -0
  161. package/dist/src/events/events-route.js.map +1 -0
  162. package/dist/src/events/events-route.test.d.ts +6 -0
  163. package/dist/src/events/events-route.test.js +134 -0
  164. package/dist/src/events/events-route.test.js.map +1 -0
  165. package/dist/src/events/store-event-wrapper.d.ts +19 -0
  166. package/dist/src/events/store-event-wrapper.js +57 -0
  167. package/dist/src/events/store-event-wrapper.js.map +1 -0
  168. package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
  169. package/dist/src/events/store-event-wrapper.test.js +91 -0
  170. package/dist/src/events/store-event-wrapper.test.js.map +1 -0
  171. package/dist/src/index.d.ts +33 -6
  172. package/dist/src/index.js +35 -21
  173. package/dist/src/index.js.map +1 -1
  174. package/dist/src/middleware/auth.d.ts +0 -2
  175. package/dist/src/middleware/auth.js.map +1 -1
  176. package/dist/src/providers/create-provider.d.ts +23 -0
  177. package/dist/src/providers/create-provider.js +185 -0
  178. package/dist/src/providers/create-provider.js.map +1 -0
  179. package/dist/src/providers/create-provider.test.d.ts +6 -0
  180. package/dist/src/providers/create-provider.test.js +95 -0
  181. package/dist/src/providers/create-provider.test.js.map +1 -0
  182. package/dist/src/providers/failover.d.ts +38 -0
  183. package/dist/src/providers/failover.js +147 -0
  184. package/dist/src/providers/failover.js.map +1 -0
  185. package/dist/src/providers/failover.test.d.ts +6 -0
  186. package/dist/src/providers/failover.test.js +169 -0
  187. package/dist/src/providers/failover.test.js.map +1 -0
  188. package/dist/src/providers/search-provider.d.ts +64 -0
  189. package/dist/src/providers/search-provider.js +174 -0
  190. package/dist/src/providers/search-provider.js.map +1 -0
  191. package/dist/src/providers/types.d.ts +118 -0
  192. package/dist/src/providers/types.js +7 -0
  193. package/dist/src/providers/types.js.map +1 -0
  194. package/dist/src/routes/ai-stream.d.ts +28 -10
  195. package/dist/src/routes/ai-stream.js +85 -41
  196. package/dist/src/routes/ai-stream.js.map +1 -1
  197. package/dist/src/routes/chat-new.test.d.ts +6 -0
  198. package/dist/src/routes/chat-new.test.js +107 -0
  199. package/dist/src/routes/chat-new.test.js.map +1 -0
  200. package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
  201. package/dist/src/routes/chat-stream-new.test.js +135 -0
  202. package/dist/src/routes/chat-stream-new.test.js.map +1 -0
  203. package/dist/src/routes/chat-stream.d.ts +20 -4
  204. package/dist/src/routes/chat-stream.js +49 -29
  205. package/dist/src/routes/chat-stream.js.map +1 -1
  206. package/dist/src/routes/chat.d.ts +19 -4
  207. package/dist/src/routes/chat.js +62 -23
  208. package/dist/src/routes/chat.js.map +1 -1
  209. package/dist/src/routes/health.d.ts +3 -2
  210. package/dist/src/routes/health.js.map +1 -1
  211. package/dist/src/routes/route-helpers.d.ts +50 -0
  212. package/dist/src/routes/route-helpers.js +80 -0
  213. package/dist/src/routes/route-helpers.js.map +1 -0
  214. package/dist/src/routes/session-resolver.d.ts +77 -0
  215. package/dist/src/routes/session-resolver.js +109 -0
  216. package/dist/src/routes/session-resolver.js.map +1 -0
  217. package/dist/src/routes/session-resolver.test.d.ts +6 -0
  218. package/dist/src/routes/session-resolver.test.js +207 -0
  219. package/dist/src/routes/session-resolver.test.js.map +1 -0
  220. package/dist/src/routes/webhooks.d.ts +3 -1
  221. package/dist/src/routes/webhooks.js +12 -4
  222. package/dist/src/routes/webhooks.js.map +1 -1
  223. package/dist/src/security/permission-checker.d.ts +80 -0
  224. package/dist/src/security/permission-checker.js +75 -0
  225. package/dist/src/security/permission-checker.js.map +1 -0
  226. package/dist/src/security/permission-checker.test.d.ts +6 -0
  227. package/dist/src/security/permission-checker.test.js +208 -0
  228. package/dist/src/security/permission-checker.test.js.map +1 -0
  229. package/dist/src/server.d.ts +18 -11
  230. package/dist/src/server.js +46 -46
  231. package/dist/src/server.js.map +1 -1
  232. package/dist/src/server.test.d.ts +1 -1
  233. package/dist/src/server.test.js +6 -144
  234. package/dist/src/server.test.js.map +1 -1
  235. package/dist/src/session/drizzle-session-store.d.ts +56 -0
  236. package/dist/src/session/drizzle-session-store.js +203 -0
  237. package/dist/src/session/drizzle-session-store.js.map +1 -0
  238. package/dist/src/session/manager.d.ts +101 -0
  239. package/dist/src/session/manager.js +394 -0
  240. package/dist/src/session/manager.js.map +1 -0
  241. package/dist/src/session/manager.test.d.ts +6 -0
  242. package/dist/src/session/manager.test.js +309 -0
  243. package/dist/src/session/manager.test.js.map +1 -0
  244. package/dist/src/session/pglite-session-store.d.ts +23 -0
  245. package/dist/src/session/pglite-session-store.js +70 -0
  246. package/dist/src/session/pglite-session-store.js.map +1 -0
  247. package/dist/src/session/postgres-session-store.d.ts +44 -0
  248. package/dist/src/session/postgres-session-store.js +138 -0
  249. package/dist/src/session/postgres-session-store.js.map +1 -0
  250. package/dist/src/session/session-builder.d.ts +69 -0
  251. package/dist/src/session/session-builder.js +384 -0
  252. package/dist/src/session/session-builder.js.map +1 -0
  253. package/dist/src/session/session-builder.test.d.ts +6 -0
  254. package/dist/src/session/session-builder.test.js +350 -0
  255. package/dist/src/session/session-builder.test.js.map +1 -0
  256. package/dist/src/session/session-store-selector.d.ts +49 -0
  257. package/dist/src/session/session-store-selector.js +60 -0
  258. package/dist/src/session/session-store-selector.js.map +1 -0
  259. package/dist/src/session/session-store-selector.test.d.ts +6 -0
  260. package/dist/src/session/session-store-selector.test.js +79 -0
  261. package/dist/src/session/session-store-selector.test.js.map +1 -0
  262. package/dist/src/session/store.d.ts +171 -0
  263. package/dist/src/session/store.js +155 -0
  264. package/dist/src/session/store.js.map +1 -0
  265. package/dist/src/session/store.test.d.ts +6 -0
  266. package/dist/src/session/store.test.js +423 -0
  267. package/dist/src/session/store.test.js.map +1 -0
  268. package/dist/src/session/stream-hooks.d.ts +39 -0
  269. package/dist/src/session/stream-hooks.js +7 -0
  270. package/dist/src/session/stream-hooks.js.map +1 -0
  271. package/dist/src/session/tool-context-factory.d.ts +61 -0
  272. package/dist/src/session/tool-context-factory.js +189 -0
  273. package/dist/src/session/tool-context-factory.js.map +1 -0
  274. package/dist/src/session/tool-context-factory.test.d.ts +6 -0
  275. package/dist/src/session/tool-context-factory.test.js +284 -0
  276. package/dist/src/session/tool-context-factory.test.js.map +1 -0
  277. package/dist/src/session/types.d.ts +195 -0
  278. package/dist/src/session/types.js +7 -0
  279. package/dist/src/session/types.js.map +1 -0
  280. package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
  281. package/dist/src/stores/drizzle-store-backend.js +306 -0
  282. package/dist/src/stores/drizzle-store-backend.js.map +1 -0
  283. package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
  284. package/dist/src/stores/drizzle-store-backend.test.js +215 -0
  285. package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
  286. package/dist/src/stores/index.d.ts +4 -0
  287. package/dist/src/stores/index.js +2 -0
  288. package/dist/src/stores/index.js.map +1 -1
  289. package/dist/src/stores/pglite-store-backend.d.ts +16 -19
  290. package/dist/src/stores/pglite-store-backend.js +85 -239
  291. package/dist/src/stores/pglite-store-backend.js.map +1 -1
  292. package/dist/src/stores/postgres-store-backend.d.ts +30 -0
  293. package/dist/src/stores/postgres-store-backend.js +100 -0
  294. package/dist/src/stores/postgres-store-backend.js.map +1 -0
  295. package/dist/src/stores/schema.d.ts +457 -0
  296. package/dist/src/stores/schema.js +59 -0
  297. package/dist/src/stores/schema.js.map +1 -0
  298. package/dist/src/tools/admin-file-tools.d.ts +42 -0
  299. package/dist/src/tools/admin-file-tools.js +714 -0
  300. package/dist/src/tools/admin-file-tools.js.map +1 -0
  301. package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
  302. package/dist/src/tools/admin-file-tools.test.js +521 -0
  303. package/dist/src/tools/admin-file-tools.test.js.map +1 -0
  304. package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
  305. package/dist/src/tools/custom-tool-adapter.js +190 -0
  306. package/dist/src/tools/custom-tool-adapter.js.map +1 -0
  307. package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
  308. package/dist/src/tools/custom-tool-adapter.test.js +243 -0
  309. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
  310. package/dist/src/tools/dispatch-tool.d.ts +52 -0
  311. package/dist/src/tools/dispatch-tool.js +71 -0
  312. package/dist/src/tools/dispatch-tool.js.map +1 -0
  313. package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
  314. package/dist/src/tools/dispatch-tool.test.js +75 -0
  315. package/dist/src/tools/dispatch-tool.test.js.map +1 -0
  316. package/dist/src/tools/fetch-url-tool.d.ts +23 -0
  317. package/dist/src/tools/fetch-url-tool.js +333 -0
  318. package/dist/src/tools/fetch-url-tool.js.map +1 -0
  319. package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
  320. package/dist/src/tools/fetch-url-tool.test.js +228 -0
  321. package/dist/src/tools/fetch-url-tool.test.js.map +1 -0
  322. package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
  323. package/dist/src/tools/mcp-tool-adapter.js +135 -0
  324. package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
  325. package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
  326. package/dist/src/tools/mcp-tool-adapter.test.js +226 -0
  327. package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
  328. package/dist/src/tools/registry.d.ts +25 -0
  329. package/dist/src/tools/registry.js +72 -0
  330. package/dist/src/tools/registry.js.map +1 -0
  331. package/dist/src/tools/registry.test.d.ts +6 -0
  332. package/dist/src/tools/registry.test.js +120 -0
  333. package/dist/src/tools/registry.test.js.map +1 -0
  334. package/dist/src/tools/request-tool.d.ts +42 -0
  335. package/dist/src/tools/request-tool.js +190 -0
  336. package/dist/src/tools/request-tool.js.map +1 -0
  337. package/dist/src/tools/request-tool.test.d.ts +6 -0
  338. package/dist/src/tools/request-tool.test.js +253 -0
  339. package/dist/src/tools/request-tool.test.js.map +1 -0
  340. package/dist/src/tools/store-tools.d.ts +29 -0
  341. package/dist/src/tools/store-tools.js +224 -0
  342. package/dist/src/tools/store-tools.js.map +1 -0
  343. package/dist/src/tools/store-tools.test.d.ts +6 -0
  344. package/dist/src/tools/store-tools.test.js +215 -0
  345. package/dist/src/tools/store-tools.test.js.map +1 -0
  346. package/dist/src/tools/types.d.ts +129 -0
  347. package/dist/src/tools/types.js +7 -0
  348. package/dist/src/tools/types.js.map +1 -0
  349. package/dist/src/tools/web-search-tool.d.ts +31 -0
  350. package/dist/src/tools/web-search-tool.js +170 -0
  351. package/dist/src/tools/web-search-tool.js.map +1 -0
  352. package/dist/src/tools/web-search-tool.test.d.ts +6 -0
  353. package/dist/src/tools/web-search-tool.test.js +153 -0
  354. package/dist/src/tools/web-search-tool.test.js.map +1 -0
  355. package/dist/src/tools/web-tools-shared.d.ts +21 -0
  356. package/dist/src/tools/web-tools-shared.js +32 -0
  357. package/dist/src/tools/web-tools-shared.js.map +1 -0
  358. package/dist/src/types.d.ts +40 -12
  359. package/dist/src/types.js +16 -2
  360. package/dist/src/types.js.map +1 -1
  361. package/dist/tsconfig.tsbuildinfo +1 -1
  362. package/package.json +27 -4
  363. package/dist/src/__tests__/sse-contract.test.js +0 -464
  364. package/dist/src/__tests__/sse-contract.test.js.map +0 -1
  365. package/dist/src/__tests__/tools.test.js +0 -583
  366. package/dist/src/__tests__/tools.test.js.map +0 -1
  367. package/dist/src/agent/agent-runner.d.ts +0 -33
  368. package/dist/src/agent/agent-runner.js +0 -1040
  369. package/dist/src/agent/agent-runner.js.map +0 -1
  370. package/dist/src/agent/custom-tools-e2e.test.d.ts +0 -6
  371. package/dist/src/agent/custom-tools-e2e.test.js +0 -566
  372. package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
  373. package/dist/src/agent/request-helper.d.ts +0 -16
  374. package/dist/src/agent/request-helper.js +0 -96
  375. package/dist/src/agent/request-helper.js.map +0 -1
  376. package/dist/src/agent/session-store.d.ts +0 -62
  377. package/dist/src/agent/session-store.js +0 -151
  378. package/dist/src/agent/session-store.js.map +0 -1
  379. package/dist/src/agent/stores-e2e.test.js +0 -433
  380. package/dist/src/agent/stores-e2e.test.js.map +0 -1
  381. package/dist/src/agent/tool-context-builder.d.ts +0 -11
  382. package/dist/src/agent/tool-context-builder.js +0 -102
  383. package/dist/src/agent/tool-context-builder.js.map +0 -1
  384. package/dist/src/agent/tool-context-builder.test.d.ts +0 -6
  385. package/dist/src/agent/tool-context-builder.test.js +0 -152
  386. package/dist/src/agent/tool-context-builder.test.js.map +0 -1
  387. package/dist/src/agent/write-repo-file.test.js +0 -270
  388. package/dist/src/agent/write-repo-file.test.js.map +0 -1
  389. package/dist/src/cron/heartbeat-runner.d.ts +0 -21
  390. package/dist/src/cron/heartbeat-runner.js +0 -79
  391. package/dist/src/cron/heartbeat-runner.js.map +0 -1
  392. package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
  393. package/dist/src/cron/heartbeat-runner.test.js +0 -120
  394. package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
  395. package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
  396. package/dist/src/cron/heartbeat-scheduler.js +0 -55
  397. package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
  398. package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
  399. package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
  400. package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
  401. package/dist/src/routes/ai-stream.test.d.ts +0 -6
  402. package/dist/src/routes/ai-stream.test.js +0 -586
  403. package/dist/src/routes/ai-stream.test.js.map +0 -1
  404. package/dist/src/routes/ask-user-response.d.ts +0 -30
  405. package/dist/src/routes/ask-user-response.js +0 -61
  406. package/dist/src/routes/ask-user-response.js.map +0 -1
  407. package/dist/src/routes/ask-user-response.test.d.ts +0 -6
  408. package/dist/src/routes/ask-user-response.test.js +0 -88
  409. package/dist/src/routes/ask-user-response.test.js.map +0 -1
  410. package/dist/src/routes/chat-stream.test.d.ts +0 -6
  411. package/dist/src/routes/chat-stream.test.js +0 -155
  412. package/dist/src/routes/chat-stream.test.js.map +0 -1
  413. package/dist/src/routes/chat.test.d.ts +0 -6
  414. package/dist/src/routes/chat.test.js +0 -99
  415. package/dist/src/routes/chat.test.js.map +0 -1
  416. package/dist/src/routes/widget-actions.d.ts +0 -49
  417. package/dist/src/routes/widget-actions.js +0 -78
  418. package/dist/src/routes/widget-actions.js.map +0 -1
  419. package/dist/src/session/admin-file-tools.d.ts +0 -136
  420. package/dist/src/session/admin-file-tools.js +0 -240
  421. package/dist/src/session/admin-file-tools.js.map +0 -1
  422. package/dist/src/session/custom-tool-adapter.d.ts +0 -74
  423. package/dist/src/session/custom-tool-adapter.js +0 -180
  424. package/dist/src/session/custom-tool-adapter.js.map +0 -1
  425. package/dist/src/session/history-converter.d.ts +0 -21
  426. package/dist/src/session/history-converter.js +0 -59
  427. package/dist/src/session/history-converter.js.map +0 -1
  428. package/dist/src/session/history-converter.test.d.ts +0 -6
  429. package/dist/src/session/history-converter.test.js +0 -130
  430. package/dist/src/session/history-converter.test.js.map +0 -1
  431. package/dist/src/session/session-manager.d.ts +0 -219
  432. package/dist/src/session/session-manager.js +0 -915
  433. package/dist/src/session/session-manager.js.map +0 -1
  434. package/dist/src/session/session-manager.test.d.ts +0 -6
  435. package/dist/src/session/session-manager.test.js +0 -455
  436. package/dist/src/session/session-manager.test.js.map +0 -1
  437. package/dist/src/session/session-runner.d.ts +0 -45
  438. package/dist/src/session/session-runner.js +0 -719
  439. package/dist/src/session/session-runner.js.map +0 -1
  440. package/dist/src/session/session-runner.test.d.ts +0 -6
  441. package/dist/src/session/session-runner.test.js +0 -834
  442. package/dist/src/session/session-runner.test.js.map +0 -1
  443. /package/dist/src/{__tests__/sse-contract.test.d.ts → __fixtures__/e2e.test.d.ts} +0 -0
  444. /package/dist/src/{__tests__/tools.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
  445. /package/dist/src/agent/{write-repo-file.test.d.ts → loop.test.d.ts} +0 -0
@@ -0,0 +1,309 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Tests for StandaloneSessionManager.
8
+ *
9
+ * Tests session lifecycle: create, persist, resume, destroy, cleanup.
10
+ * Uses a real PGLite-backed store — no mocks for persistence.
11
+ * LLM provider is stubbed since we're testing the manager, not the loop.
12
+ */
13
+ import { describe, it, expect, vi, beforeAll, afterAll } from 'vitest';
14
+ import { StandaloneSessionManager } from './manager.js';
15
+ import { createPGLiteSessionStore } from './pglite-session-store.js';
16
+ import { SSEEventType } from '../types.js';
17
+ import { createLogger } from '../logger.js';
18
+ import { createToolRegistry } from '../tools/registry.js';
19
+ const logger = createLogger({ component: 'test:session-manager' });
20
+ // ---------------------------------------------------------------------------
21
+ // Stubs
22
+ // ---------------------------------------------------------------------------
23
+ function stubProvider(model = 'test-model', provider = 'test-provider') {
24
+ return {
25
+ model,
26
+ provider,
27
+ languageModel: {},
28
+ streamText: () => {
29
+ throw new Error('streamText not implemented in stub');
30
+ },
31
+ generateText: () => Promise.reject(new Error('generateText not implemented in stub')),
32
+ };
33
+ }
34
+ /**
35
+ * Create a provider that streams a single text response and finishes.
36
+ */
37
+ function streamingProvider(responseText) {
38
+ return {
39
+ model: 'test-model',
40
+ provider: 'test-provider',
41
+ languageModel: {},
42
+ streamText() {
43
+ const usage = { inputTokens: 10, outputTokens: 5, totalTokens: 15 };
44
+ const events = [
45
+ { type: 'text-delta', textDelta: responseText },
46
+ { type: 'finish', usage },
47
+ ];
48
+ async function* makeFullStream() {
49
+ for (const e of events)
50
+ yield e;
51
+ }
52
+ async function* makeTextStream() {
53
+ yield responseText;
54
+ }
55
+ return {
56
+ fullStream: makeFullStream(),
57
+ textStream: makeTextStream(),
58
+ usage: Promise.resolve(usage),
59
+ text: Promise.resolve(responseText),
60
+ };
61
+ },
62
+ generateText: () => Promise.reject(new Error('not implemented')),
63
+ };
64
+ }
65
+ function stubPermissionChecker() {
66
+ return {
67
+ check: () => ({ allowed: true }),
68
+ };
69
+ }
70
+ function makeCreateOpts(overrides = {}) {
71
+ return {
72
+ provider: stubProvider(),
73
+ toolRegistry: createToolRegistry(),
74
+ permissionChecker: stubPermissionChecker(),
75
+ systemPrompt: 'You are a helpful assistant.',
76
+ ...overrides,
77
+ };
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Tests
81
+ // ---------------------------------------------------------------------------
82
+ describe('StandaloneSessionManager', () => {
83
+ let store;
84
+ beforeAll(async () => {
85
+ store = await createPGLiteSessionStore({ logger });
86
+ });
87
+ afterAll(async () => {
88
+ await store.close();
89
+ });
90
+ describe('create', () => {
91
+ it('creates a session with a generated ID', () => {
92
+ const mgr = new StandaloneSessionManager({ logger, store });
93
+ const session = mgr.create(makeCreateOpts());
94
+ expect(session.id).toBeTruthy();
95
+ expect(session.model).toBe('test-model');
96
+ expect(session.providerName).toBe('test-provider');
97
+ expect(session.messages).toEqual([]);
98
+ expect(session.usage.inputTokens).toBe(0);
99
+ });
100
+ it('stores session in memory', () => {
101
+ const mgr = new StandaloneSessionManager({ logger, store });
102
+ const session = mgr.create(makeCreateOpts());
103
+ expect(mgr.has(session.id)).toBe(true);
104
+ expect(mgr.get(session.id)).toBe(session);
105
+ expect(mgr.size).toBe(1);
106
+ });
107
+ it('uses custom maxTurns and maxContextTokens', () => {
108
+ const mgr = new StandaloneSessionManager({ logger, store });
109
+ const session = mgr.create(makeCreateOpts({
110
+ maxTurns: 10,
111
+ maxContextTokens: 100_000,
112
+ }));
113
+ expect(session.maxTurns).toBe(10);
114
+ expect(session.maxContextTokens).toBe(100_000);
115
+ });
116
+ it('uses manager defaults when not specified', () => {
117
+ const mgr = new StandaloneSessionManager({
118
+ logger,
119
+ store,
120
+ defaultMaxTurns: 25,
121
+ defaultMaxContextTokens: 150_000,
122
+ });
123
+ const session = mgr.create(makeCreateOpts());
124
+ expect(session.maxTurns).toBe(25);
125
+ expect(session.maxContextTokens).toBe(150_000);
126
+ });
127
+ });
128
+ describe('persist and resume', () => {
129
+ it('persists a session and resumes it with preserved messages', async () => {
130
+ const mgr = new StandaloneSessionManager({ logger, store });
131
+ const session = mgr.create(makeCreateOpts());
132
+ // Simulate some messages
133
+ session.messages = [
134
+ { role: 'user', content: 'Hello' },
135
+ { role: 'assistant', content: 'Hi there!' },
136
+ ];
137
+ session.usage = { inputTokens: 100, outputTokens: 50, totalTokens: 150 };
138
+ await mgr.persist(session);
139
+ // Destroy and resume
140
+ await mgr.destroy(session.id);
141
+ expect(mgr.has(session.id)).toBe(false);
142
+ const resumed = await mgr.resume(session.id, makeCreateOpts({
143
+ systemPrompt: 'Updated system prompt',
144
+ }));
145
+ expect(resumed).not.toBeNull();
146
+ expect(resumed.id).toBe(session.id);
147
+ expect(resumed.messages).toHaveLength(2);
148
+ expect(resumed.usage.totalTokens).toBe(150);
149
+ // System prompt should be fresh, not stale
150
+ expect(resumed.systemPrompt).toBe('Updated system prompt');
151
+ });
152
+ it('resume returns null for missing session', async () => {
153
+ const mgr = new StandaloneSessionManager({ logger, store });
154
+ const result = await mgr.resume('nonexistent', makeCreateOpts());
155
+ expect(result).toBeNull();
156
+ });
157
+ it('version field is present on persisted sessions', async () => {
158
+ const mgr = new StandaloneSessionManager({ logger, store });
159
+ const session = mgr.create(makeCreateOpts());
160
+ await mgr.persist(session);
161
+ const persisted = await store.load(session.id);
162
+ expect(persisted.version).toBe(1);
163
+ });
164
+ it('deduplicates concurrent resume calls for the same session ID', async () => {
165
+ const mgr = new StandaloneSessionManager({ logger, store });
166
+ const session = mgr.create(makeCreateOpts());
167
+ session.messages = [{ role: 'user', content: 'test' }];
168
+ await mgr.persist(session);
169
+ await mgr.destroy(session.id);
170
+ // Spy on store.load to verify it's called once
171
+ const loadSpy = vi.spyOn(store, 'load');
172
+ // Fire two concurrent resumes for the same session
173
+ const opts = makeCreateOpts({ systemPrompt: 'fresh' });
174
+ const [result1, result2] = await Promise.all([
175
+ mgr.resume(session.id, opts),
176
+ mgr.resume(session.id, opts),
177
+ ]);
178
+ // Both should resolve to the same session (same ID)
179
+ expect(result1).not.toBeNull();
180
+ expect(result2).not.toBeNull();
181
+ expect(result1.id).toBe(session.id);
182
+ expect(result2.id).toBe(session.id);
183
+ // Store should only be hit once (deduplication)
184
+ expect(loadSpy).toHaveBeenCalledTimes(1);
185
+ loadSpy.mockRestore();
186
+ });
187
+ });
188
+ describe('list persisted', () => {
189
+ it('lists persisted sessions newest first', async () => {
190
+ const mgr = new StandaloneSessionManager({ logger, store });
191
+ const s1 = mgr.create(makeCreateOpts());
192
+ const s2 = mgr.create(makeCreateOpts());
193
+ await mgr.persist(s1);
194
+ await mgr.persist(s2);
195
+ const list = await mgr.listPersisted();
196
+ // Should include at least the two we just persisted
197
+ const ids = list.map((s) => s.id);
198
+ expect(ids).toContain(s1.id);
199
+ expect(ids).toContain(s2.id);
200
+ });
201
+ });
202
+ describe('destroy', () => {
203
+ it('removes session from memory', async () => {
204
+ const mgr = new StandaloneSessionManager({ logger, store });
205
+ const session = mgr.create(makeCreateOpts());
206
+ await mgr.destroy(session.id);
207
+ expect(mgr.has(session.id)).toBe(false);
208
+ expect(mgr.size).toBe(0);
209
+ });
210
+ it('optionally deletes from store', async () => {
211
+ const mgr = new StandaloneSessionManager({ logger, store });
212
+ const session = mgr.create(makeCreateOpts());
213
+ await mgr.persist(session);
214
+ await mgr.destroy(session.id, { deleteFromStore: true });
215
+ const loaded = await store.load(session.id);
216
+ expect(loaded).toBeNull();
217
+ });
218
+ });
219
+ describe('cleanup', () => {
220
+ it('destroys sessions idle beyond TTL', async () => {
221
+ const mgr = new StandaloneSessionManager({ logger, store, ttlMs: 1 });
222
+ const session = mgr.create(makeCreateOpts());
223
+ // Force old lastAccessedAt
224
+ session.lastAccessedAt = Date.now() - 1000;
225
+ const destroyed = await mgr.cleanup();
226
+ expect(destroyed).toBeGreaterThanOrEqual(1);
227
+ expect(mgr.has(session.id)).toBe(false);
228
+ });
229
+ it('does not destroy recently accessed sessions', async () => {
230
+ const mgr = new StandaloneSessionManager({ logger, store, ttlMs: 60_000 });
231
+ const session = mgr.create(makeCreateOpts());
232
+ const destroyed = await mgr.cleanup();
233
+ expect(destroyed).toBe(0);
234
+ expect(mgr.has(session.id)).toBe(true);
235
+ });
236
+ });
237
+ describe('shutdown', () => {
238
+ it('destroys all sessions and closes store', async () => {
239
+ const shutdownStore = await createPGLiteSessionStore({ logger });
240
+ const mgr = new StandaloneSessionManager({ logger, store: shutdownStore });
241
+ mgr.start();
242
+ mgr.create(makeCreateOpts());
243
+ mgr.create(makeCreateOpts());
244
+ expect(mgr.size).toBe(2);
245
+ await mgr.shutdown();
246
+ expect(mgr.size).toBe(0);
247
+ });
248
+ });
249
+ describe('runMessage', () => {
250
+ it('executes a message through the agent loop and yields SSE events', async () => {
251
+ const mgr = new StandaloneSessionManager({ logger, store });
252
+ const session = mgr.create(makeCreateOpts({
253
+ provider: streamingProvider('Hello from the agent!'),
254
+ }));
255
+ const events = [];
256
+ for await (const event of mgr.runMessage(session.id, 'Hi there')) {
257
+ events.push(event);
258
+ }
259
+ // Should have init, text delta, and done events
260
+ const types = events.map((e) => e.type);
261
+ expect(types).toContain(SSEEventType.Init);
262
+ expect(types).toContain(SSEEventType.TextDelta);
263
+ expect(types).toContain(SSEEventType.Done);
264
+ });
265
+ it('persists session after execution', async () => {
266
+ const mgr = new StandaloneSessionManager({ logger, store });
267
+ const session = mgr.create(makeCreateOpts({
268
+ provider: streamingProvider('Persisted response'),
269
+ }));
270
+ // Drain the generator
271
+ for await (const _event of mgr.runMessage(session.id, 'Save me')) {
272
+ // consume
273
+ }
274
+ // Session should be persisted
275
+ const persisted = await store.load(session.id);
276
+ expect(persisted).not.toBeNull();
277
+ expect(persisted.messages.length).toBeGreaterThan(0);
278
+ });
279
+ it('fires onUsage callback with token counts', async () => {
280
+ const usageEvents = [];
281
+ const mgr = new StandaloneSessionManager({ logger, store });
282
+ const session = mgr.create(makeCreateOpts({
283
+ provider: streamingProvider('Usage test'),
284
+ }));
285
+ for await (const _event of mgr.runMessage(session.id, 'Count tokens', {
286
+ onUsage: (usage) => usageEvents.push(usage),
287
+ })) {
288
+ // consume
289
+ }
290
+ expect(usageEvents.length).toBe(1);
291
+ expect(usageEvents[0].inputTokens).toBe(10);
292
+ expect(usageEvents[0].outputTokens).toBe(5);
293
+ expect(usageEvents[0].turnNumber).toBe(1);
294
+ });
295
+ it('syncs messages back to session after execution', async () => {
296
+ const mgr = new StandaloneSessionManager({ logger, store });
297
+ const session = mgr.create(makeCreateOpts({
298
+ provider: streamingProvider('Response text'),
299
+ }));
300
+ expect(session.messages).toHaveLength(0);
301
+ for await (const _event of mgr.runMessage(session.id, 'Hello')) {
302
+ // consume
303
+ }
304
+ // Should have user + assistant messages
305
+ expect(session.messages.length).toBeGreaterThanOrEqual(2);
306
+ });
307
+ });
308
+ });
309
+ //# sourceMappingURL=manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/session/manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { Logger } from '../logger.js';
7
+ import { DrizzleSessionStore } from './drizzle-session-store.js';
8
+ import type { SessionStoreHooks } from './store.js';
9
+ export interface PGLiteSessionStoreOptions {
10
+ /** Data directory for PGLite. If unset, runs fully in-memory. */
11
+ dataDir?: string;
12
+ /** Logger. Defaults to the runtime's global logger. */
13
+ logger?: Logger;
14
+ /** Optional hooks for dual-write / observability. */
15
+ hooks?: SessionStoreHooks;
16
+ }
17
+ /**
18
+ * Create and initialize a PGLite-backed session store.
19
+ *
20
+ * Returns a `DrizzleSessionStore` whose `close()` will close the
21
+ * underlying PGLite instance.
22
+ */
23
+ export declare function createPGLiteSessionStore(opts?: PGLiteSessionStoreOptions): Promise<DrizzleSessionStore>;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * PGLite factory for the session store.
8
+ *
9
+ * Opens an in-process WASM Postgres (PGLite), runs idempotent DDL,
10
+ * and returns a `DrizzleSessionStore` wired to it. Thin factory —
11
+ * all query logic lives in DrizzleSessionStore.
12
+ *
13
+ * Default choice for `amodal dev`: zero config, no Docker, no DB to
14
+ * manage. Pair with `createPostgresSessionStore` for hosted runtime
15
+ * or ISV production deployments.
16
+ */
17
+ import { drizzle } from 'drizzle-orm/pglite';
18
+ import { agentSessions } from '../stores/schema.js';
19
+ import { log as defaultLogger } from '../logger.js';
20
+ import { DrizzleSessionStore } from './drizzle-session-store.js';
21
+ const BACKEND_NAME = 'pglite';
22
+ // Must match the Drizzle schema in ../stores/schema.ts exactly.
23
+ const CREATE_TABLE_DDL = `
24
+ CREATE TABLE IF NOT EXISTS agent_sessions (
25
+ id TEXT PRIMARY KEY,
26
+ messages JSONB NOT NULL,
27
+ token_usage JSONB NOT NULL,
28
+ metadata JSONB DEFAULT '{}',
29
+ version INTEGER NOT NULL DEFAULT 1,
30
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
31
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
32
+ );
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_updated
35
+ ON agent_sessions (updated_at DESC);
36
+ `;
37
+ /**
38
+ * Create and initialize a PGLite-backed session store.
39
+ *
40
+ * Returns a `DrizzleSessionStore` whose `close()` will close the
41
+ * underlying PGLite instance.
42
+ */
43
+ export async function createPGLiteSessionStore(opts = {}) {
44
+ const logger = opts.logger ?? defaultLogger;
45
+ if (opts.dataDir) {
46
+ const { mkdirSync } = await import('node:fs');
47
+ mkdirSync(opts.dataDir, { recursive: true });
48
+ }
49
+ // Dynamic import keeps PGLite lazy — Postgres-only deployments don't
50
+ // need to pay the WASM parsing cost.
51
+ const { PGlite } = await import('@electric-sql/pglite');
52
+ const pglite = new PGlite(opts.dataDir ?? undefined);
53
+ await pglite.exec(CREATE_TABLE_DDL);
54
+ const db = drizzle(pglite);
55
+ logger.info('session_store_initialized', {
56
+ backend: BACKEND_NAME,
57
+ dataDir: opts.dataDir ?? 'in-memory',
58
+ });
59
+ return new DrizzleSessionStore({
60
+ db,
61
+ table: agentSessions,
62
+ backendName: BACKEND_NAME,
63
+ logger,
64
+ hooks: opts.hooks,
65
+ onClose: async () => {
66
+ await pglite.close();
67
+ },
68
+ });
69
+ }
70
+ //# sourceMappingURL=pglite-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pglite-session-store.js","sourceRoot":"","sources":["../../../src/session/pglite-session-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAC,GAAG,IAAI,aAAa,EAAC,MAAM,cAAc,CAAC;AAElD,OAAO,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AAG/D,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B,gEAAgE;AAChE,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;CAaxB,CAAC;AAWF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAE5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,EAAC,SAAS,EAAC,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;IAC7C,CAAC;IAED,qEAAqE;IACrE,qCAAqC;IACrC,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IACrD,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;QACvC,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW;KACrC,CAAC,CAAC;IAEH,OAAO,IAAI,mBAAmB,CAAC;QAC7B,EAAE;QACF,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,YAAY;QACzB,MAAM;QACN,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { Pool } from 'pg';
7
+ import type { Logger } from '../logger.js';
8
+ import { DrizzleSessionStore } from './drizzle-session-store.js';
9
+ import type { SessionStoreHooks } from './store.js';
10
+ export interface PostgresSessionStoreOptions {
11
+ /** Postgres connection string. Required if `pool` is not provided. */
12
+ connectionString?: string;
13
+ /** Existing pg.Pool to reuse instead of opening a new one. */
14
+ pool?: Pool;
15
+ /** Pool size when opening a new pool (default 10). Ignored if `pool` is passed. */
16
+ max?: number;
17
+ /** Per-statement timeout in ms (default 30_000). Ignored if `pool` is passed. */
18
+ statementTimeoutMs?: number;
19
+ /**
20
+ * Custom table name (default `agent_sessions`). Lets consumers run
21
+ * this store in a DB that already uses that name for something else.
22
+ */
23
+ tableName?: string;
24
+ /** Logger. Defaults to the runtime's global logger. */
25
+ logger?: Logger;
26
+ /** Optional hooks for dual-write / observability. */
27
+ hooks?: SessionStoreHooks;
28
+ /**
29
+ * When true, `close()` will not `pool.end()` — use when the caller
30
+ * owns the pool lifecycle. Defaults to true iff `pool` was passed
31
+ * (caller-owned), false otherwise (store-owned).
32
+ */
33
+ ownsPool?: boolean;
34
+ }
35
+ /**
36
+ * Create and initialize a Postgres-backed session store.
37
+ *
38
+ * Accepts either a connection string (shorthand) or full options
39
+ * object. Validates `tableName` at construct time, opens (or adopts)
40
+ * a `pg.Pool`, runs idempotent DDL, and returns a DrizzleSessionStore.
41
+ * The returned store's `close()` will `pool.end()` unless
42
+ * `ownsPool: false` (set automatically when a pool is passed in).
43
+ */
44
+ export declare function createPostgresSessionStore(optsOrUrl: PostgresSessionStoreOptions | string): Promise<DrizzleSessionStore>;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Postgres factory for the session store.
8
+ *
9
+ * Opens a `pg.Pool` (or reuses one passed in), runs idempotent DDL,
10
+ * and returns a `DrizzleSessionStore` wired to it. Thin factory —
11
+ * all query logic lives in DrizzleSessionStore.
12
+ *
13
+ * For hosted runtime and ISV production deployments. Pair with
14
+ * `createPGLiteSessionStore` for `amodal dev`.
15
+ */
16
+ import { drizzle } from 'drizzle-orm/node-postgres';
17
+ import { pgTable, text, integer, jsonb, timestamp } from 'drizzle-orm/pg-core';
18
+ import { log as defaultLogger } from '../logger.js';
19
+ import { SessionStoreError } from '../errors.js';
20
+ import { DrizzleSessionStore } from './drizzle-session-store.js';
21
+ const BACKEND_NAME = 'postgres';
22
+ const DEFAULT_STATEMENT_TIMEOUT_MS = 30_000;
23
+ const DEFAULT_POOL_MAX = 10;
24
+ const DEFAULT_TABLE_NAME = 'agent_sessions';
25
+ // Reject table names that could be used for SQL injection. The name
26
+ // is interpolated into DDL so strict validation is mandatory.
27
+ const SAFE_TABLE_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;
28
+ function validateTableName(name) {
29
+ if (!SAFE_TABLE_NAME_RE.test(name)) {
30
+ throw new SessionStoreError(`Invalid table name: ${JSON.stringify(name)}`, {
31
+ backend: BACKEND_NAME,
32
+ operation: 'construct',
33
+ context: { tableName: name, expected: 'identifier: letters, digits, underscore' },
34
+ });
35
+ }
36
+ }
37
+ /**
38
+ * Build a Drizzle table binding for a given table name. Columns match
39
+ * the static `agentSessions` schema exactly; only the SQL table name
40
+ * differs. The return is cast to `AgentSessionsTable` (the type alias
41
+ * for `typeof agentSessions`) because the column shape is identical —
42
+ * Drizzle's inferred generic differs only in the `name` literal.
43
+ */
44
+ function makeAgentSessionsTable(name) {
45
+ const t = pgTable(name, {
46
+ id: text('id').primaryKey(),
47
+ messages: jsonb('messages').notNull().$type(),
48
+ tokenUsage: jsonb('token_usage').notNull().$type(),
49
+ metadata: jsonb('metadata').default({}).$type(),
50
+ version: integer('version').notNull().default(1),
51
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
52
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
53
+ });
54
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- dynamic-name table has identical column shape as the static `agentSessions`; only the `name` generic parameter differs
55
+ return t;
56
+ }
57
+ function buildDdl(tableName) {
58
+ return `
59
+ CREATE TABLE IF NOT EXISTS ${tableName} (
60
+ id TEXT PRIMARY KEY,
61
+ messages JSONB NOT NULL,
62
+ token_usage JSONB NOT NULL,
63
+ metadata JSONB DEFAULT '{}',
64
+ version INTEGER NOT NULL DEFAULT 1,
65
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
66
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
67
+ );
68
+
69
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_updated
70
+ ON ${tableName} (updated_at DESC);
71
+ `;
72
+ }
73
+ /**
74
+ * Create and initialize a Postgres-backed session store.
75
+ *
76
+ * Accepts either a connection string (shorthand) or full options
77
+ * object. Validates `tableName` at construct time, opens (or adopts)
78
+ * a `pg.Pool`, runs idempotent DDL, and returns a DrizzleSessionStore.
79
+ * The returned store's `close()` will `pool.end()` unless
80
+ * `ownsPool: false` (set automatically when a pool is passed in).
81
+ */
82
+ export async function createPostgresSessionStore(optsOrUrl) {
83
+ const opts = typeof optsOrUrl === 'string' ? { connectionString: optsOrUrl } : optsOrUrl;
84
+ if (!opts.connectionString && !opts.pool) {
85
+ throw new SessionStoreError('createPostgresSessionStore requires either connectionString or pool', { backend: BACKEND_NAME, operation: 'construct' });
86
+ }
87
+ const logger = opts.logger ?? defaultLogger;
88
+ const tableName = opts.tableName ?? DEFAULT_TABLE_NAME;
89
+ validateTableName(tableName);
90
+ const table = makeAgentSessionsTable(tableName);
91
+ const ownsPool = opts.ownsPool ?? !opts.pool;
92
+ let pool;
93
+ if (opts.pool) {
94
+ pool = opts.pool;
95
+ }
96
+ else {
97
+ // Dynamic import so `pg` stays an optional peer at the package
98
+ // level — PGLite users don't need it installed.
99
+ const pg = await import('pg');
100
+ const { Pool: PgPool } = pg.default ?? pg;
101
+ pool = new PgPool({
102
+ connectionString: opts.connectionString,
103
+ max: opts.max ?? DEFAULT_POOL_MAX,
104
+ statement_timeout: opts.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS,
105
+ });
106
+ }
107
+ try {
108
+ await pool.query(buildDdl(tableName));
109
+ }
110
+ catch (cause) {
111
+ throw new SessionStoreError('Failed to create session table', {
112
+ backend: BACKEND_NAME,
113
+ operation: 'initialize',
114
+ cause,
115
+ context: { tableName },
116
+ });
117
+ }
118
+ const db = drizzle(pool);
119
+ logger.info('session_store_initialized', {
120
+ backend: BACKEND_NAME,
121
+ tableName,
122
+ poolMax: opts.max ?? DEFAULT_POOL_MAX,
123
+ statementTimeoutMs: opts.statementTimeoutMs ?? DEFAULT_STATEMENT_TIMEOUT_MS,
124
+ ownsPool,
125
+ });
126
+ return new DrizzleSessionStore({
127
+ db,
128
+ table,
129
+ backendName: BACKEND_NAME,
130
+ logger,
131
+ hooks: opts.hooks,
132
+ onClose: async () => {
133
+ if (ownsPool)
134
+ await pool.end();
135
+ },
136
+ });
137
+ }
138
+ //# sourceMappingURL=postgres-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-session-store.js","sourceRoot":"","sources":["../../../src/session/postgres-session-store.ts"],"names":[],"mappings":"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"}