@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,315 @@
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 PGLiteSessionStore — 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 { PGLiteSessionStore } from './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
+ tenantId: 'tenant-1',
73
+ userId: 'user-1',
74
+ provider: stubProvider(),
75
+ toolRegistry: createToolRegistry(),
76
+ permissionChecker: stubPermissionChecker(),
77
+ systemPrompt: 'You are a helpful assistant.',
78
+ ...overrides,
79
+ };
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Tests
83
+ // ---------------------------------------------------------------------------
84
+ describe('StandaloneSessionManager', () => {
85
+ let store;
86
+ beforeAll(async () => {
87
+ store = new PGLiteSessionStore({ logger });
88
+ await store.initialize();
89
+ });
90
+ afterAll(async () => {
91
+ await store.close();
92
+ });
93
+ describe('create', () => {
94
+ it('creates a session with a generated ID', () => {
95
+ const mgr = new StandaloneSessionManager({ logger, store });
96
+ const session = mgr.create(makeCreateOpts());
97
+ expect(session.id).toBeTruthy();
98
+ expect(session.tenantId).toBe('tenant-1');
99
+ expect(session.userId).toBe('user-1');
100
+ expect(session.model).toBe('test-model');
101
+ expect(session.providerName).toBe('test-provider');
102
+ expect(session.messages).toEqual([]);
103
+ expect(session.usage.inputTokens).toBe(0);
104
+ });
105
+ it('stores session in memory', () => {
106
+ const mgr = new StandaloneSessionManager({ logger, store });
107
+ const session = mgr.create(makeCreateOpts());
108
+ expect(mgr.has(session.id)).toBe(true);
109
+ expect(mgr.get(session.id)).toBe(session);
110
+ expect(mgr.size).toBe(1);
111
+ });
112
+ it('uses custom maxTurns and maxContextTokens', () => {
113
+ const mgr = new StandaloneSessionManager({ logger, store });
114
+ const session = mgr.create(makeCreateOpts({
115
+ maxTurns: 10,
116
+ maxContextTokens: 100_000,
117
+ }));
118
+ expect(session.maxTurns).toBe(10);
119
+ expect(session.maxContextTokens).toBe(100_000);
120
+ });
121
+ it('uses manager defaults when not specified', () => {
122
+ const mgr = new StandaloneSessionManager({
123
+ logger,
124
+ store,
125
+ defaultMaxTurns: 25,
126
+ defaultMaxContextTokens: 150_000,
127
+ });
128
+ const session = mgr.create(makeCreateOpts());
129
+ expect(session.maxTurns).toBe(25);
130
+ expect(session.maxContextTokens).toBe(150_000);
131
+ });
132
+ });
133
+ describe('persist and resume', () => {
134
+ it('persists a session and resumes it with preserved messages', async () => {
135
+ const mgr = new StandaloneSessionManager({ logger, store });
136
+ const session = mgr.create(makeCreateOpts());
137
+ // Simulate some messages
138
+ session.messages = [
139
+ { role: 'user', content: 'Hello' },
140
+ { role: 'assistant', content: 'Hi there!' },
141
+ ];
142
+ session.usage = { inputTokens: 100, outputTokens: 50, totalTokens: 150 };
143
+ await mgr.persist(session);
144
+ // Destroy and resume
145
+ await mgr.destroy(session.id);
146
+ expect(mgr.has(session.id)).toBe(false);
147
+ const resumed = await mgr.resume(session.id, makeCreateOpts({
148
+ systemPrompt: 'Updated system prompt',
149
+ }));
150
+ expect(resumed).not.toBeNull();
151
+ expect(resumed.id).toBe(session.id);
152
+ expect(resumed.messages).toHaveLength(2);
153
+ expect(resumed.usage.totalTokens).toBe(150);
154
+ // System prompt should be fresh, not stale
155
+ expect(resumed.systemPrompt).toBe('Updated system prompt');
156
+ });
157
+ it('resume returns null for missing session', async () => {
158
+ const mgr = new StandaloneSessionManager({ logger, store });
159
+ const result = await mgr.resume('nonexistent', makeCreateOpts());
160
+ expect(result).toBeNull();
161
+ });
162
+ it('version field is present on persisted sessions', async () => {
163
+ const mgr = new StandaloneSessionManager({ logger, store });
164
+ const session = mgr.create(makeCreateOpts());
165
+ await mgr.persist(session);
166
+ const persisted = await store.load(session.id);
167
+ expect(persisted.version).toBe(1);
168
+ });
169
+ it('deduplicates concurrent resume calls for the same session ID', async () => {
170
+ const mgr = new StandaloneSessionManager({ logger, store });
171
+ const session = mgr.create(makeCreateOpts());
172
+ session.messages = [{ role: 'user', content: 'test' }];
173
+ await mgr.persist(session);
174
+ await mgr.destroy(session.id);
175
+ // Spy on store.load to verify it's called once
176
+ const loadSpy = vi.spyOn(store, 'load');
177
+ // Fire two concurrent resumes for the same session
178
+ const opts = makeCreateOpts({ systemPrompt: 'fresh' });
179
+ const [result1, result2] = await Promise.all([
180
+ mgr.resume(session.id, opts),
181
+ mgr.resume(session.id, opts),
182
+ ]);
183
+ // Both should resolve to the same session (same ID)
184
+ expect(result1).not.toBeNull();
185
+ expect(result2).not.toBeNull();
186
+ expect(result1.id).toBe(session.id);
187
+ expect(result2.id).toBe(session.id);
188
+ // Store should only be hit once (deduplication)
189
+ expect(loadSpy).toHaveBeenCalledTimes(1);
190
+ loadSpy.mockRestore();
191
+ });
192
+ });
193
+ describe('list persisted', () => {
194
+ it('lists sessions filtered by tenant', async () => {
195
+ const tenantId = `tenant-list-mgr-${Date.now()}`;
196
+ const mgr = new StandaloneSessionManager({ logger, store });
197
+ const s1 = mgr.create(makeCreateOpts({ tenantId }));
198
+ const s2 = mgr.create(makeCreateOpts({ tenantId }));
199
+ mgr.create(makeCreateOpts({ tenantId: 'other-tenant' }));
200
+ await mgr.persist(s1);
201
+ await mgr.persist(s2);
202
+ const list = await mgr.listPersisted(tenantId);
203
+ expect(list.length).toBeGreaterThanOrEqual(2);
204
+ expect(list.every((s) => s.tenantId === tenantId)).toBe(true);
205
+ });
206
+ });
207
+ describe('destroy', () => {
208
+ it('removes session from memory', async () => {
209
+ const mgr = new StandaloneSessionManager({ logger, store });
210
+ const session = mgr.create(makeCreateOpts());
211
+ await mgr.destroy(session.id);
212
+ expect(mgr.has(session.id)).toBe(false);
213
+ expect(mgr.size).toBe(0);
214
+ });
215
+ it('optionally deletes from store', async () => {
216
+ const mgr = new StandaloneSessionManager({ logger, store });
217
+ const session = mgr.create(makeCreateOpts());
218
+ await mgr.persist(session);
219
+ await mgr.destroy(session.id, { deleteFromStore: true });
220
+ const loaded = await store.load(session.id);
221
+ expect(loaded).toBeNull();
222
+ });
223
+ });
224
+ describe('cleanup', () => {
225
+ it('destroys sessions idle beyond TTL', async () => {
226
+ const mgr = new StandaloneSessionManager({ logger, store, ttlMs: 1 });
227
+ const session = mgr.create(makeCreateOpts());
228
+ // Force old lastAccessedAt
229
+ session.lastAccessedAt = Date.now() - 1000;
230
+ const destroyed = await mgr.cleanup();
231
+ expect(destroyed).toBeGreaterThanOrEqual(1);
232
+ expect(mgr.has(session.id)).toBe(false);
233
+ });
234
+ it('does not destroy recently accessed sessions', async () => {
235
+ const mgr = new StandaloneSessionManager({ logger, store, ttlMs: 60_000 });
236
+ const session = mgr.create(makeCreateOpts());
237
+ const destroyed = await mgr.cleanup();
238
+ expect(destroyed).toBe(0);
239
+ expect(mgr.has(session.id)).toBe(true);
240
+ });
241
+ });
242
+ describe('shutdown', () => {
243
+ it('destroys all sessions and closes store', async () => {
244
+ const shutdownStore = new PGLiteSessionStore({ logger });
245
+ await shutdownStore.initialize();
246
+ const mgr = new StandaloneSessionManager({ logger, store: shutdownStore });
247
+ mgr.start();
248
+ mgr.create(makeCreateOpts());
249
+ mgr.create(makeCreateOpts());
250
+ expect(mgr.size).toBe(2);
251
+ await mgr.shutdown();
252
+ expect(mgr.size).toBe(0);
253
+ });
254
+ });
255
+ describe('runMessage', () => {
256
+ it('executes a message through the agent loop and yields SSE events', async () => {
257
+ const mgr = new StandaloneSessionManager({ logger, store });
258
+ const session = mgr.create(makeCreateOpts({
259
+ provider: streamingProvider('Hello from the agent!'),
260
+ }));
261
+ const events = [];
262
+ for await (const event of mgr.runMessage(session.id, 'Hi there')) {
263
+ events.push(event);
264
+ }
265
+ // Should have init, text delta, and done events
266
+ const types = events.map((e) => e.type);
267
+ expect(types).toContain(SSEEventType.Init);
268
+ expect(types).toContain(SSEEventType.TextDelta);
269
+ expect(types).toContain(SSEEventType.Done);
270
+ });
271
+ it('persists session after execution', async () => {
272
+ const mgr = new StandaloneSessionManager({ logger, store });
273
+ const session = mgr.create(makeCreateOpts({
274
+ provider: streamingProvider('Persisted response'),
275
+ }));
276
+ // Drain the generator
277
+ for await (const _event of mgr.runMessage(session.id, 'Save me')) {
278
+ // consume
279
+ }
280
+ // Session should be persisted
281
+ const persisted = await store.load(session.id);
282
+ expect(persisted).not.toBeNull();
283
+ expect(persisted.messages.length).toBeGreaterThan(0);
284
+ });
285
+ it('fires onUsage callback with token counts', async () => {
286
+ const usageEvents = [];
287
+ const mgr = new StandaloneSessionManager({ logger, store });
288
+ const session = mgr.create(makeCreateOpts({
289
+ provider: streamingProvider('Usage test'),
290
+ }));
291
+ for await (const _event of mgr.runMessage(session.id, 'Count tokens', {
292
+ onUsage: (usage) => usageEvents.push(usage),
293
+ })) {
294
+ // consume
295
+ }
296
+ expect(usageEvents.length).toBe(1);
297
+ expect(usageEvents[0].inputTokens).toBe(10);
298
+ expect(usageEvents[0].outputTokens).toBe(5);
299
+ expect(usageEvents[0].turnNumber).toBe(1);
300
+ });
301
+ it('syncs messages back to session after execution', async () => {
302
+ const mgr = new StandaloneSessionManager({ logger, store });
303
+ const session = mgr.create(makeCreateOpts({
304
+ provider: streamingProvider('Response text'),
305
+ }));
306
+ expect(session.messages).toHaveLength(0);
307
+ for await (const _event of mgr.runMessage(session.id, 'Hello')) {
308
+ // consume
309
+ }
310
+ // Should have user + assistant messages
311
+ expect(session.messages.length).toBeGreaterThanOrEqual(2);
312
+ });
313
+ });
314
+ });
315
+ //# 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,71 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { AgentBundle, CustomToolExecutor, StoreBackend } from '@amodalai/types';
7
+ import type { McpManager, AdminAgentContent, FieldScrubber } from '@amodalai/core';
8
+ import type { LLMProvider } from '../providers/types.js';
9
+ import type { ToolRegistry, ToolContext } from '../tools/types.js';
10
+ import type { PermissionChecker } from '../security/permission-checker.js';
11
+ import { DISPATCH_TOOL_NAME } from '../tools/dispatch-tool.js';
12
+ import type { Logger } from '../logger.js';
13
+ /** Session type determines which content and tools are available. */
14
+ export type SessionType = 'chat' | 'admin' | 'automation';
15
+ /** Components needed to create a session via StandaloneSessionManager. */
16
+ export interface SessionComponents {
17
+ provider: LLMProvider;
18
+ toolRegistry: ToolRegistry;
19
+ permissionChecker: PermissionChecker;
20
+ systemPrompt: string;
21
+ toolContextFactory: (callId: string) => ToolContext;
22
+ userRoles: string[];
23
+ }
24
+ /** Options for building session components. */
25
+ export interface BuildSessionComponentsOptions {
26
+ /** The agent bundle (repo config). */
27
+ bundle: AgentBundle;
28
+ /** Shared store backend (lifecycle managed by the server). */
29
+ storeBackend: StoreBackend | null;
30
+ /** Shared MCP manager (lifecycle managed by the server). */
31
+ mcpManager: McpManager | null;
32
+ /** Session type — determines which content and tools are available. */
33
+ sessionType?: SessionType;
34
+ /** User roles for permission checks and field guidance. */
35
+ userRoles?: string[];
36
+ /** Pinned model override (takes precedence over bundle config). */
37
+ pinnedModel?: {
38
+ provider: string;
39
+ model: string;
40
+ };
41
+ /** Logger instance. */
42
+ logger: Logger;
43
+ /** App ID for store isolation (default: 'local'). */
44
+ appId?: string;
45
+ /** Custom tool executor for running compiled tool handlers. */
46
+ toolExecutor?: CustomToolExecutor;
47
+ /** Admin agent content (required when sessionType is 'admin'). */
48
+ adminContent?: AdminAgentContent;
49
+ /** Repo root path (required when sessionType is 'admin' for file tools). */
50
+ repoRoot?: string;
51
+ /** Callback to get the server port (for admin internal_api tool). */
52
+ getPort?: () => number | null;
53
+ /** Session ID for correlation in tool context (default: generated). */
54
+ sessionId?: string;
55
+ /** Tenant ID for multi-tenant isolation. */
56
+ tenantId?: string;
57
+ /** Optional field scrubber for response sanitization on ctx.request() */
58
+ fieldScrubber?: FieldScrubber;
59
+ }
60
+ declare const PRESENT_TOOL_NAME = "present";
61
+ declare const STOP_EXECUTION_TOOL_NAME = "stop_execution";
62
+ /**
63
+ * Build all session components from a bundle.
64
+ *
65
+ * This is the single entry point for translating repo config into runtime
66
+ * components. The caller (route handler or session manager) provides the
67
+ * bundle and shared resources; the builder returns everything needed to
68
+ * create a session.
69
+ */
70
+ export declare function buildSessionComponents(opts: BuildSessionComponentsOptions): SessionComponents;
71
+ export { PRESENT_TOOL_NAME, STOP_EXECUTION_TOOL_NAME, DISPATCH_TOOL_NAME };