@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,352 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Tests for Session Builder.
8
+ *
9
+ * Covers:
10
+ * 1. Build from fixture bundle → all tool types registered
11
+ * 2. Admin session → admin skills, user skills absent
12
+ * 3. Build with MCP → MCP tools registered
13
+ * 4. Build with pinned model → provider uses pinned model
14
+ * 5. stop_execution tool is registered
15
+ * 6. present tool is registered
16
+ * 7. shell_exec is NOT registered (G24 — dropped by design)
17
+ * 8. System prompt includes connection, skill, knowledge (G9)
18
+ */
19
+ import { describe, it, expect, vi } from 'vitest';
20
+ import { buildSessionComponents, PRESENT_TOOL_NAME, STOP_EXECUTION_TOOL_NAME } from './session-builder.js';
21
+ import { createLogger } from '../logger.js';
22
+ const logger = createLogger({ component: 'test:session-builder' });
23
+ // ---------------------------------------------------------------------------
24
+ // Mocks
25
+ // ---------------------------------------------------------------------------
26
+ // Mock the provider creation to avoid real API key requirements
27
+ vi.mock('../providers/create-provider.js', () => ({
28
+ createProvider: vi.fn((config) => ({
29
+ model: config.model,
30
+ provider: config.provider,
31
+ languageModel: {},
32
+ streamText: () => { throw new Error('not implemented'); },
33
+ generateText: () => Promise.reject(new Error('not implemented')),
34
+ })),
35
+ }));
36
+ // ---------------------------------------------------------------------------
37
+ // Fixtures
38
+ // ---------------------------------------------------------------------------
39
+ function makeConnection(name) {
40
+ return {
41
+ name,
42
+ spec: {
43
+ protocol: 'rest',
44
+ baseUrl: `https://api.${name}.com`,
45
+ auth: { type: 'bearer', token: 'env:API_KEY' },
46
+ },
47
+ access: {
48
+ endpoints: {
49
+ 'GET /items': { returns: ['id', 'name'] },
50
+ 'POST /items': { returns: ['id'], confirm: true },
51
+ },
52
+ },
53
+ surface: [
54
+ { method: 'GET', path: '/items', description: 'List items', included: true },
55
+ { method: 'POST', path: '/items', description: 'Create item', included: true },
56
+ ],
57
+ entities: 'Item — a thing',
58
+ rules: 'Always paginate',
59
+ location: '/tmp/connections/' + name,
60
+ };
61
+ }
62
+ function makeStore() {
63
+ return {
64
+ name: 'deals',
65
+ entity: {
66
+ name: 'Deal',
67
+ key: '{company}_{quarter}',
68
+ schema: {
69
+ company: { type: 'string' },
70
+ quarter: { type: 'string' },
71
+ amount: { type: 'number' },
72
+ },
73
+ },
74
+ location: '/tmp/stores/deals',
75
+ };
76
+ }
77
+ function makeSkill() {
78
+ return {
79
+ name: 'revenue-report',
80
+ description: 'Generate revenue report',
81
+ trigger: 'When user asks about revenue',
82
+ body: 'Step 1: Query charges. Step 2: Aggregate.',
83
+ location: '/tmp/skills/revenue-report',
84
+ };
85
+ }
86
+ function makeKnowledge() {
87
+ return {
88
+ name: 'style-guide',
89
+ title: 'Style Guide',
90
+ body: 'Always use markdown tables.',
91
+ location: '/tmp/knowledge/style-guide',
92
+ };
93
+ }
94
+ function makeCustomTool() {
95
+ return {
96
+ name: 'analyze_data',
97
+ description: 'Analyze data',
98
+ parameters: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },
99
+ confirm: true,
100
+ timeout: 30000,
101
+ env: ['OPENAI_API_KEY'],
102
+ handlerPath: '/tmp/tools/analyze/handler.ts',
103
+ location: '/tmp/tools/analyze',
104
+ hasPackageJson: false,
105
+ hasSetupScript: false,
106
+ hasRequirementsTxt: false,
107
+ hasDockerfile: false,
108
+ sandboxLanguage: 'typescript',
109
+ };
110
+ }
111
+ function makeBundle(overrides) {
112
+ const connections = new Map();
113
+ connections.set('stripe', makeConnection('stripe'));
114
+ return {
115
+ source: 'local',
116
+ origin: '/tmp/agent',
117
+ config: {
118
+ name: 'test-agent',
119
+ version: '1.0.0',
120
+ description: 'A test agent',
121
+ userContext: 'Be helpful and concise.',
122
+ models: {
123
+ main: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' },
124
+ },
125
+ },
126
+ connections,
127
+ skills: [makeSkill()],
128
+ agents: { main: undefined, simple: undefined, subagents: [] },
129
+ automations: [],
130
+ knowledge: [makeKnowledge()],
131
+ evals: [],
132
+ tools: [],
133
+ stores: [makeStore()],
134
+ ...overrides,
135
+ };
136
+ }
137
+ function makeStoreBackend() {
138
+ return {
139
+ put: vi.fn().mockResolvedValue({ version: 1 }),
140
+ get: vi.fn(),
141
+ list: vi.fn(),
142
+ delete: vi.fn(),
143
+ history: vi.fn(),
144
+ close: vi.fn(),
145
+ initialize: vi.fn(),
146
+ purgeExpired: vi.fn(),
147
+ };
148
+ }
149
+ function makeOpts(overrides) {
150
+ return {
151
+ bundle: makeBundle(),
152
+ storeBackend: makeStoreBackend(),
153
+ mcpManager: null,
154
+ logger,
155
+ ...overrides,
156
+ };
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ // Tests
160
+ // ---------------------------------------------------------------------------
161
+ describe('buildSessionComponents', () => {
162
+ it('returns all required components', () => {
163
+ const components = buildSessionComponents(makeOpts());
164
+ expect(components.provider).toBeDefined();
165
+ expect(components.toolRegistry).toBeDefined();
166
+ expect(components.permissionChecker).toBeDefined();
167
+ expect(components.systemPrompt).toBeTruthy();
168
+ expect(components.toolContextFactory).toBeInstanceOf(Function);
169
+ expect(components.userRoles).toEqual([]);
170
+ });
171
+ it('registers store tools', () => {
172
+ const components = buildSessionComponents(makeOpts());
173
+ const names = components.toolRegistry.names();
174
+ expect(names).toContain('store_deals');
175
+ expect(names).toContain('store_deals_batch');
176
+ expect(names).toContain('query_store');
177
+ });
178
+ it('registers request tool when connections exist', () => {
179
+ const components = buildSessionComponents(makeOpts());
180
+ expect(components.toolRegistry.names()).toContain('request');
181
+ });
182
+ it('does not register request tool when no connections', () => {
183
+ const bundle = makeBundle({ connections: new Map() });
184
+ const components = buildSessionComponents(makeOpts({ bundle }));
185
+ expect(components.toolRegistry.names()).not.toContain('request');
186
+ });
187
+ it('registers present tool', () => {
188
+ const components = buildSessionComponents(makeOpts());
189
+ expect(components.toolRegistry.names()).toContain(PRESENT_TOOL_NAME);
190
+ });
191
+ it('registers stop_execution tool', () => {
192
+ const components = buildSessionComponents(makeOpts());
193
+ expect(components.toolRegistry.names()).toContain(STOP_EXECUTION_TOOL_NAME);
194
+ });
195
+ it('does NOT register shell_exec (dropped by design)', () => {
196
+ const components = buildSessionComponents(makeOpts());
197
+ expect(components.toolRegistry.names()).not.toContain('shell_exec');
198
+ });
199
+ it('does NOT register ask_user (dropped by design)', () => {
200
+ const components = buildSessionComponents(makeOpts());
201
+ expect(components.toolRegistry.names()).not.toContain('ask_user');
202
+ });
203
+ it('does NOT register activate_skill (dropped by design)', () => {
204
+ const components = buildSessionComponents(makeOpts());
205
+ expect(components.toolRegistry.names()).not.toContain('activate_skill');
206
+ });
207
+ it('does NOT register load_knowledge (dropped by design)', () => {
208
+ const components = buildSessionComponents(makeOpts());
209
+ expect(components.toolRegistry.names()).not.toContain('load_knowledge');
210
+ });
211
+ describe('custom tools', () => {
212
+ it('registers custom tools when executor provided', () => {
213
+ const bundle = makeBundle({ tools: [makeCustomTool()] });
214
+ const executor = { execute: vi.fn() };
215
+ const components = buildSessionComponents(makeOpts({ bundle, toolExecutor: executor }));
216
+ expect(components.toolRegistry.names()).toContain('analyze_data');
217
+ });
218
+ it('skips custom tools with confirm: never', () => {
219
+ const tool = makeCustomTool();
220
+ tool.confirm = 'never';
221
+ const bundle = makeBundle({ tools: [tool] });
222
+ const executor = { execute: vi.fn() };
223
+ const components = buildSessionComponents(makeOpts({ bundle, toolExecutor: executor }));
224
+ expect(components.toolRegistry.names()).not.toContain('analyze_data');
225
+ });
226
+ it('does not register custom tools without executor', () => {
227
+ const bundle = makeBundle({ tools: [makeCustomTool()] });
228
+ const components = buildSessionComponents(makeOpts({ bundle }));
229
+ expect(components.toolRegistry.names()).not.toContain('analyze_data');
230
+ });
231
+ });
232
+ describe('MCP tools', () => {
233
+ it('registers MCP tools when mcpManager provided', () => {
234
+ const mcpManager = {
235
+ getDiscoveredTools: vi.fn().mockReturnValue([
236
+ {
237
+ name: 'mcp-server__tool1',
238
+ description: 'A tool',
239
+ parameters: { type: 'object', properties: {} },
240
+ serverName: 'mcp-server',
241
+ originalName: 'tool1',
242
+ },
243
+ ]),
244
+ callTool: vi.fn(),
245
+ };
246
+ const components = buildSessionComponents(makeOpts({ mcpManager: mcpManager }));
247
+ expect(components.toolRegistry.names()).toContain('mcp-server__tool1');
248
+ });
249
+ });
250
+ describe('admin sessions', () => {
251
+ it('uses admin skills/knowledge in system prompt', () => {
252
+ const adminContent = {
253
+ agentPrompt: 'You are the admin agent.',
254
+ skills: [{ name: 'manage-connections', description: 'Manage connections', body: 'Admin skill body', location: '/tmp' }],
255
+ knowledge: [{ name: 'admin-guide', title: 'Admin Guide', body: 'Admin knowledge body', location: '/tmp' }],
256
+ };
257
+ const components = buildSessionComponents(makeOpts({
258
+ sessionType: 'admin',
259
+ adminContent,
260
+ repoRoot: '/tmp/agent',
261
+ }));
262
+ // Admin skills should appear in prompt
263
+ expect(components.systemPrompt).toContain('manage-connections');
264
+ expect(components.systemPrompt).toContain('Admin skill body');
265
+ // User skills should NOT appear
266
+ expect(components.systemPrompt).not.toContain('revenue-report');
267
+ });
268
+ it('registers admin file tools', () => {
269
+ const adminContent = {
270
+ agentPrompt: null,
271
+ skills: [],
272
+ knowledge: [],
273
+ };
274
+ const components = buildSessionComponents(makeOpts({
275
+ sessionType: 'admin',
276
+ adminContent,
277
+ repoRoot: '/tmp/agent',
278
+ }));
279
+ const names = components.toolRegistry.names();
280
+ expect(names).toContain('read_repo_file');
281
+ expect(names).toContain('write_repo_file');
282
+ expect(names).toContain('delete_repo_file');
283
+ expect(names).toContain('internal_api');
284
+ });
285
+ it('does not register admin file tools for chat sessions', () => {
286
+ const components = buildSessionComponents(makeOpts());
287
+ const names = components.toolRegistry.names();
288
+ expect(names).not.toContain('read_repo_file');
289
+ expect(names).not.toContain('write_repo_file');
290
+ expect(names).not.toContain('delete_repo_file');
291
+ });
292
+ });
293
+ describe('pinned model', () => {
294
+ it('uses pinned model over bundle config', () => {
295
+ const components = buildSessionComponents(makeOpts({
296
+ pinnedModel: { provider: 'openai', model: 'gpt-4o' },
297
+ }));
298
+ expect(components.provider.model).toBe('gpt-4o');
299
+ expect(components.provider.provider).toBe('openai');
300
+ });
301
+ });
302
+ describe('system prompt (G9)', () => {
303
+ it('includes connection endpoints', () => {
304
+ const components = buildSessionComponents(makeOpts());
305
+ expect(components.systemPrompt).toContain('/items');
306
+ });
307
+ it('includes skill body', () => {
308
+ const components = buildSessionComponents(makeOpts());
309
+ expect(components.systemPrompt).toContain('Query charges');
310
+ });
311
+ it('includes knowledge body', () => {
312
+ const components = buildSessionComponents(makeOpts());
313
+ expect(components.systemPrompt).toContain('markdown tables');
314
+ });
315
+ it('includes userContext (G10)', () => {
316
+ const components = buildSessionComponents(makeOpts());
317
+ expect(components.systemPrompt).toContain('Be helpful and concise');
318
+ });
319
+ });
320
+ describe('stop_execution tool', () => {
321
+ it('returns __stop sentinel', async () => {
322
+ const components = buildSessionComponents(makeOpts());
323
+ const tool = components.toolRegistry.get(STOP_EXECUTION_TOOL_NAME);
324
+ expect(tool).toBeDefined();
325
+ const result = await tool.execute({ reason: 'Task complete' }, {});
326
+ expect(result).toEqual({ __stop: true, reason: 'Task complete' });
327
+ });
328
+ });
329
+ describe('present tool', () => {
330
+ it('returns rendered widget data', async () => {
331
+ const components = buildSessionComponents(makeOpts());
332
+ const tool = components.toolRegistry.get(PRESENT_TOOL_NAME);
333
+ expect(tool).toBeDefined();
334
+ const result = await tool.execute({ widget: 'entity-card', data: { name: 'Test' } }, {});
335
+ expect(result).toEqual({ widget: 'entity-card', data: { name: 'Test' }, rendered: true });
336
+ });
337
+ });
338
+ describe('tool context factory', () => {
339
+ it('factory produces ToolContext with correct session info', () => {
340
+ const components = buildSessionComponents(makeOpts({
341
+ sessionId: 'sess-123',
342
+ tenantId: 'tenant-456',
343
+ userRoles: ['analyst'],
344
+ }));
345
+ const ctx = components.toolContextFactory('call-1');
346
+ expect(ctx.sessionId).toBe('sess-123');
347
+ expect(ctx.tenantId).toBe('tenant-456');
348
+ expect(ctx.user.roles).toEqual(['analyst']);
349
+ });
350
+ });
351
+ });
352
+ //# sourceMappingURL=session-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-builder.test.js","sourceRoot":"","sources":["../../../src/session/session-builder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { PersistedSession } from './types.js';
7
+ import type { Logger } from '../logger.js';
8
+ /**
9
+ * Interface for session persistence backends.
10
+ *
11
+ * Implementations: PGLiteSessionStore (local dev), future Postgres
12
+ * (hosted runtime via shared Drizzle schema).
13
+ */
14
+ export interface SessionStore {
15
+ /** Initialize the backing store (create tables, run migrations). */
16
+ initialize(): Promise<void>;
17
+ /** Save or update a session. */
18
+ save(session: PersistedSession): Promise<void>;
19
+ /** Load a session by ID. Returns null if not found. */
20
+ load(sessionId: string): Promise<PersistedSession | null>;
21
+ /** List sessions for a tenant, newest first. */
22
+ list(tenantId: string, opts?: {
23
+ limit?: number;
24
+ }): Promise<PersistedSession[]>;
25
+ /** Delete a session by ID. Returns true if deleted. */
26
+ delete(sessionId: string): Promise<boolean>;
27
+ /** Delete sessions not updated since `before`. Returns count deleted. */
28
+ cleanup(before: Date): Promise<number>;
29
+ /** Close the backing store. */
30
+ close(): Promise<void>;
31
+ }
32
+ /**
33
+ * PGLite-backed session store using Drizzle ORM.
34
+ *
35
+ * Runs an in-process WASM Postgres instance. Data is persisted to a
36
+ * configurable directory (default: in-memory).
37
+ */
38
+ export declare class PGLiteSessionStore implements SessionStore {
39
+ private db;
40
+ private pglite;
41
+ private readonly dataDir;
42
+ private readonly logger;
43
+ constructor(opts: {
44
+ dataDir?: string;
45
+ logger: Logger;
46
+ });
47
+ initialize(): Promise<void>;
48
+ save(session: PersistedSession): Promise<void>;
49
+ load(sessionId: string): Promise<PersistedSession | null>;
50
+ list(tenantId: string, opts?: {
51
+ limit?: number;
52
+ }): Promise<PersistedSession[]>;
53
+ delete(sessionId: string): Promise<boolean>;
54
+ cleanup(before: Date): Promise<number>;
55
+ close(): Promise<void>;
56
+ private ensureDb;
57
+ }
@@ -0,0 +1,167 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Session persistence layer.
8
+ *
9
+ * Defines the `SessionStore` interface and a PGLite implementation
10
+ * backed by Drizzle ORM. The Drizzle schema is in `stores/schema.ts`,
11
+ * shared with the store document tables.
12
+ */
13
+ import { eq, lt, desc } from 'drizzle-orm';
14
+ import { drizzle } from 'drizzle-orm/pglite';
15
+ import { agentSessions } from '../stores/schema.js';
16
+ import { ConfigError } from '../errors.js';
17
+ // ---------------------------------------------------------------------------
18
+ // PGLite implementation
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * PGLite-backed session store using Drizzle ORM.
22
+ *
23
+ * Runs an in-process WASM Postgres instance. Data is persisted to a
24
+ * configurable directory (default: in-memory).
25
+ */
26
+ export class PGLiteSessionStore {
27
+ db = null;
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- PGLite instance type is not exported cleanly
29
+ pglite = null;
30
+ dataDir;
31
+ logger;
32
+ constructor(opts) {
33
+ this.dataDir = opts.dataDir;
34
+ this.logger = opts.logger;
35
+ }
36
+ async initialize() {
37
+ if (this.db)
38
+ return;
39
+ if (this.dataDir) {
40
+ const { mkdirSync } = await import('node:fs');
41
+ mkdirSync(this.dataDir, { recursive: true });
42
+ }
43
+ const { PGlite } = await import('@electric-sql/pglite');
44
+ this.pglite = new PGlite(this.dataDir ?? undefined);
45
+ this.db = drizzle(this.pglite);
46
+ // Create table via raw SQL — Drizzle schema defines the shape,
47
+ // but we use raw DDL for initialization (no drizzle-kit in runtime).
48
+ await this.pglite.exec(`
49
+ CREATE TABLE IF NOT EXISTS agent_sessions (
50
+ id TEXT PRIMARY KEY,
51
+ tenant_id TEXT NOT NULL,
52
+ user_id TEXT NOT NULL,
53
+ messages JSONB NOT NULL,
54
+ token_usage JSONB NOT NULL,
55
+ metadata JSONB DEFAULT '{}',
56
+ version INTEGER NOT NULL DEFAULT 1,
57
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
58
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
59
+ );
60
+
61
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_tenant
62
+ ON agent_sessions (tenant_id, updated_at DESC);
63
+ `);
64
+ this.logger.info('session_store_initialized', {
65
+ dataDir: this.dataDir ?? 'in-memory',
66
+ });
67
+ }
68
+ async save(session) {
69
+ this.ensureDb();
70
+ const values = {
71
+ id: session.id,
72
+ tenantId: session.tenantId,
73
+ userId: session.userId,
74
+ messages: session.messages,
75
+ tokenUsage: session.tokenUsage,
76
+ metadata: session.metadata,
77
+ version: session.version,
78
+ createdAt: session.createdAt,
79
+ updatedAt: session.updatedAt,
80
+ };
81
+ await this.db
82
+ .insert(agentSessions)
83
+ .values(values)
84
+ .onConflictDoUpdate({
85
+ target: agentSessions.id,
86
+ set: {
87
+ messages: values.messages,
88
+ tokenUsage: values.tokenUsage,
89
+ metadata: values.metadata,
90
+ updatedAt: values.updatedAt,
91
+ },
92
+ });
93
+ }
94
+ async load(sessionId) {
95
+ this.ensureDb();
96
+ const rows = await this.db
97
+ .select()
98
+ .from(agentSessions)
99
+ .where(eq(agentSessions.id, sessionId))
100
+ .limit(1);
101
+ if (rows.length === 0)
102
+ return null;
103
+ return rowToPersistedSession(rows[0]);
104
+ }
105
+ async list(tenantId, opts) {
106
+ this.ensureDb();
107
+ const rows = await this.db
108
+ .select()
109
+ .from(agentSessions)
110
+ .where(eq(agentSessions.tenantId, tenantId))
111
+ .orderBy(desc(agentSessions.updatedAt))
112
+ .limit(opts?.limit ?? 50);
113
+ return rows.map(rowToPersistedSession);
114
+ }
115
+ async delete(sessionId) {
116
+ this.ensureDb();
117
+ const result = await this.db
118
+ .delete(agentSessions)
119
+ .where(eq(agentSessions.id, sessionId))
120
+ .returning({ id: agentSessions.id });
121
+ return result.length > 0;
122
+ }
123
+ async cleanup(before) {
124
+ this.ensureDb();
125
+ const result = await this.db
126
+ .delete(agentSessions)
127
+ .where(lt(agentSessions.updatedAt, before))
128
+ .returning({ id: agentSessions.id });
129
+ if (result.length > 0) {
130
+ this.logger.info('session_store_cleanup', { deleted: result.length });
131
+ }
132
+ return result.length;
133
+ }
134
+ async close() {
135
+ if (this.pglite) {
136
+ await this.pglite.close();
137
+ this.pglite = null;
138
+ this.db = null;
139
+ }
140
+ }
141
+ ensureDb() {
142
+ if (!this.db) {
143
+ throw new ConfigError('PGLiteSessionStore not initialized — call initialize() first', {
144
+ key: 'sessionStore',
145
+ suggestion: 'Call initialize() before using the session store',
146
+ });
147
+ }
148
+ }
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // Row conversion
152
+ // ---------------------------------------------------------------------------
153
+ function rowToPersistedSession(row) {
154
+ return {
155
+ version: 1,
156
+ id: row.id,
157
+ tenantId: row.tenantId,
158
+ userId: row.userId,
159
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- JSONB boundary: we wrote these values
160
+ messages: row.messages,
161
+ tokenUsage: row.tokenUsage,
162
+ metadata: (row.metadata ?? {}),
163
+ createdAt: row.createdAt,
164
+ updatedAt: row.updatedAt,
165
+ };
166
+ }
167
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/session/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAmCzC,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACrB,EAAE,GAAsC,IAAI,CAAC;IACrD,8GAA8G;IACtG,MAAM,GAAQ,IAAI,CAAC;IACV,OAAO,CAAqB;IAC5B,MAAM,CAAS;IAEhC,YAAY,IAAwC;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO;QAEpB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,EAAC,SAAS,EAAC,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/B,+DAA+D;QAC/D,qEAAqE;QACrE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;KAetB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;YAC5C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW;SACrC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAyB;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAqB;YACvC,UAAU,EAAE,OAAO,CAAC,UAA8E;YAClG,QAAQ,EAAE,OAAO,CAAC,QAAmC;YACrD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QAEF,MAAM,IAAI,CAAC,EAAG;aACX,MAAM,CAAC,aAAa,CAAC;aACrB,MAAM,CAAC,MAAM,CAAC;aACd,kBAAkB,CAAC;YAClB,MAAM,EAAE,aAAa,CAAC,EAAE;YACxB,GAAG,EAAE;gBACH,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;SACF,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAG;aACxB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;aACtC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,IAAuB;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAG;aACxB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAC3C,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;aACtC,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAE5B,OAAO,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAG;aAC1B,MAAM,CAAC,aAAa,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;aACtC,SAAS,CAAC,EAAC,EAAE,EAAE,aAAa,CAAC,EAAE,EAAC,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAY;QACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAG;aAC1B,MAAM,CAAC,aAAa,CAAC;aACrB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aAC1C,SAAS,CAAC,EAAC,EAAE,EAAE,aAAa,CAAC,EAAE,EAAC,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAC,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CAAC,8DAA8D,EAAE;gBACpF,GAAG,EAAE,cAAc;gBACnB,UAAU,EAAE,kDAAkD;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,qBAAqB,CAAC,GAAsC;IACnE,OAAO;QACL,OAAO,EAAE,CAAC;QACV,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,gHAAgH;QAChH,QAAQ,EAAE,GAAG,CAAC,QAA0B;QAExC,UAAU,EAAE,GAAG,CAAC,UAAwB;QAExC,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAoB;QACjD,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};