@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,224 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Store tools rewritten for the new ToolRegistry.
8
+ *
9
+ * These replace the BaseDeclarativeTool subclasses in core with Zod-based
10
+ * ToolDefinition objects. Each function returns a ToolDefinition that can
11
+ * be registered on the ToolRegistry.
12
+ *
13
+ * Three tools per store:
14
+ * - store_{name} — write a single document
15
+ * - store_{name}_batch — write multiple documents
16
+ * - query_store — query/get documents from any store
17
+ */
18
+ import { z } from 'zod';
19
+ import { StoreError } from '../errors.js';
20
+ // ---------------------------------------------------------------------------
21
+ // Helpers
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Convert a store name (kebab-case) to a tool name.
25
+ * Example: "active-alerts" → "store_active_alerts"
26
+ */
27
+ export function storeToToolName(storeName) {
28
+ return `store_${storeName.replace(/-/g, '_')}`;
29
+ }
30
+ /**
31
+ * Resolve a key template (e.g., "{alert_id}") from payload values.
32
+ */
33
+ function resolveKey(template, payload) {
34
+ return template.replace(/\{(\w+)\}/g, (_match, field) => {
35
+ const value = payload[field];
36
+ if (value === undefined || value === null) {
37
+ throw new StoreError(`Missing required field "${field}" for key template "${template}"`, {
38
+ store: '',
39
+ operation: 'resolve_key',
40
+ context: { template, field },
41
+ });
42
+ }
43
+ return String(value);
44
+ });
45
+ }
46
+ /**
47
+ * Build a Zod schema from a store's entity field definitions.
48
+ */
49
+ function buildStoreZodSchema(store) {
50
+ const shape = {};
51
+ for (const [name, field] of Object.entries(store.entity.schema)) {
52
+ shape[name] = fieldToZod(field);
53
+ }
54
+ return z.object(shape).passthrough();
55
+ }
56
+ function fieldToZod(field) {
57
+ let schema;
58
+ switch (field.type) {
59
+ case 'string':
60
+ schema = z.string();
61
+ break;
62
+ case 'number': {
63
+ let numSchema = z.number();
64
+ if (field.min !== undefined)
65
+ numSchema = numSchema.min(field.min);
66
+ if (field.max !== undefined)
67
+ numSchema = numSchema.max(field.max);
68
+ schema = numSchema;
69
+ break;
70
+ }
71
+ case 'boolean':
72
+ schema = z.boolean();
73
+ break;
74
+ case 'datetime':
75
+ schema = z.string();
76
+ break;
77
+ case 'enum':
78
+ schema = field.values && field.values.length > 0
79
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- guarded by length > 0 check
80
+ ? z.enum(field.values)
81
+ : z.string();
82
+ break;
83
+ case 'array':
84
+ schema = z.array(field.item ? fieldToZod(field.item) : z.string());
85
+ break;
86
+ case 'object':
87
+ if (field.fields) {
88
+ const nested = {};
89
+ for (const [n, f] of Object.entries(field.fields)) {
90
+ nested[n] = fieldToZod(f);
91
+ }
92
+ schema = z.object(nested);
93
+ }
94
+ else {
95
+ schema = z.record(z.unknown());
96
+ }
97
+ break;
98
+ case 'ref':
99
+ schema = z.string();
100
+ break;
101
+ default:
102
+ schema = z.unknown();
103
+ break;
104
+ }
105
+ if (field.nullable) {
106
+ schema = schema.nullable();
107
+ }
108
+ return schema;
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // Store write tool
112
+ // ---------------------------------------------------------------------------
113
+ /**
114
+ * Create a store write ToolDefinition for a single store.
115
+ */
116
+ export function createStoreWriteTool(store, backend, appId) {
117
+ const entitySchema = buildStoreZodSchema(store);
118
+ return {
119
+ description: `Write a single ${store.entity.name} to the ${store.name} store. Creates or updates the document by key.`,
120
+ parameters: entitySchema,
121
+ readOnly: false,
122
+ metadata: { category: 'store' },
123
+ async execute(params, _ctx) {
124
+ const key = resolveKey(store.entity.key, params);
125
+ const result = await backend.put(appId, store.name, key, params, {});
126
+ return { stored: true, key, version: result.version };
127
+ },
128
+ };
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ // Store batch tool
132
+ // ---------------------------------------------------------------------------
133
+ /**
134
+ * Create a store batch write ToolDefinition for a single store.
135
+ */
136
+ export function createStoreBatchTool(store, backend, appId) {
137
+ const entitySchema = buildStoreZodSchema(store);
138
+ return {
139
+ description: `Write multiple ${store.entity.name}(s) to the ${store.name} store in one call. Each item is created or updated by key.`,
140
+ parameters: z.object({
141
+ items: z.array(entitySchema).min(1),
142
+ }),
143
+ readOnly: false,
144
+ metadata: { category: 'store' },
145
+ async execute(params, _ctx) {
146
+ let stored = 0;
147
+ let failed = 0;
148
+ const errors = [];
149
+ for (const item of params.items) {
150
+ try {
151
+ const key = resolveKey(store.entity.key, item);
152
+ await backend.put(appId, store.name, key, item, {});
153
+ stored++;
154
+ }
155
+ catch (err) {
156
+ failed++;
157
+ errors.push(err instanceof Error ? err.message : String(err));
158
+ }
159
+ }
160
+ return {
161
+ stored,
162
+ failed,
163
+ total: params.items.length,
164
+ ...(errors.length > 0 ? { errors: errors.slice(0, 3) } : {}),
165
+ };
166
+ },
167
+ };
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // Store query tool
171
+ // ---------------------------------------------------------------------------
172
+ export const QUERY_STORE_TOOL_NAME = 'query_store';
173
+ /**
174
+ * Create a store query ToolDefinition that reads from any store.
175
+ */
176
+ export function createStoreQueryTool(stores, backend, appId) {
177
+ const storeNames = stores.map((s) => s.name);
178
+ return {
179
+ description: `Query documents from a data store. Use the "store" parameter to specify which store (${storeNames.join(', ')}). Pass "key" to fetch a single document by ID, or "filter" to search for documents matching field values. Returns the matching document(s) with all fields.`,
180
+ parameters: z.object({
181
+ store: (storeNames.length > 0
182
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- guarded by length > 0 check
183
+ ? z.enum(storeNames)
184
+ : z.string()).describe(`Name of the store to query (${storeNames.join(', ')})`),
185
+ key: z.string().optional().describe('Fetch a single document by its key/ID'),
186
+ filter: z.record(z.unknown()).optional().describe('Filter documents by field values, e.g. {"status": "active"}'),
187
+ sort: z.string().optional().describe('Sort field name'),
188
+ limit: z.number().optional().describe('Max number of documents to return'),
189
+ }),
190
+ readOnly: true,
191
+ metadata: { category: 'store' },
192
+ async execute(params, _ctx) {
193
+ if (params.key) {
194
+ const doc = await backend.get(appId, params.store, params.key);
195
+ if (!doc) {
196
+ return { found: false, key: params.key };
197
+ }
198
+ return { found: true, ...doc };
199
+ }
200
+ const result = await backend.list(appId, params.store, {
201
+ filter: params.filter,
202
+ sort: params.sort,
203
+ limit: typeof params.limit === 'number' ? params.limit : 20,
204
+ });
205
+ return result;
206
+ },
207
+ };
208
+ }
209
+ // ---------------------------------------------------------------------------
210
+ // Register all store tools
211
+ // ---------------------------------------------------------------------------
212
+ /**
213
+ * Register store tools on a ToolRegistry for all stores in a bundle.
214
+ */
215
+ export function registerStoreTools(registry, stores, backend, appId) {
216
+ for (const store of stores) {
217
+ registry.register(storeToToolName(store.name), createStoreWriteTool(store, backend, appId));
218
+ registry.register(`${storeToToolName(store.name)}_batch`, createStoreBatchTool(store, backend, appId));
219
+ }
220
+ if (stores.length > 0) {
221
+ registry.register(QUERY_STORE_TOOL_NAME, createStoreQueryTool(stores, backend, appId));
222
+ }
223
+ }
224
+ //# sourceMappingURL=store-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-tools.js","sourceRoot":"","sources":["../../../src/tools/store-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
@@ -0,0 +1,216 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { createStoreWriteTool, createStoreBatchTool, createStoreQueryTool, registerStoreTools, storeToToolName, QUERY_STORE_TOOL_NAME, } from './store-tools.js';
8
+ import { createToolRegistry } from './registry.js';
9
+ import { StoreError } from '../errors.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Fixtures
12
+ // ---------------------------------------------------------------------------
13
+ const ALERTS_STORE = {
14
+ name: 'alerts',
15
+ entity: {
16
+ name: 'Alert',
17
+ key: '{alert_id}',
18
+ schema: {
19
+ alert_id: { type: 'string' },
20
+ severity: { type: 'enum', values: ['P1', 'P2', 'P3'] },
21
+ message: { type: 'string' },
22
+ },
23
+ },
24
+ location: '/tmp/test',
25
+ };
26
+ const mockCtx = {
27
+ request: vi.fn(),
28
+ store: vi.fn(),
29
+ env: vi.fn(),
30
+ log: vi.fn(),
31
+ user: { roles: ['admin'] },
32
+ signal: AbortSignal.timeout(5000),
33
+ sessionId: 'test-session',
34
+ tenantId: 'test-tenant',
35
+ };
36
+ function createMockBackend() {
37
+ const docs = new Map();
38
+ return {
39
+ initialize: vi.fn().mockResolvedValue(undefined),
40
+ get: vi.fn().mockImplementation(async (_appId, _store, key) => docs.get(key) ?? null),
41
+ put: vi.fn().mockImplementation(async (_appId, store, key, payload) => {
42
+ const doc = {
43
+ key,
44
+ appId: 'test',
45
+ store,
46
+ version: 1,
47
+ payload,
48
+ meta: { computedAt: new Date().toISOString(), stale: false },
49
+ };
50
+ docs.set(key, doc);
51
+ const result = { stored: true, key, version: 1 };
52
+ return result;
53
+ }),
54
+ list: vi.fn().mockImplementation(async () => ({ documents: [...docs.values()], total: docs.size, hasMore: false })),
55
+ delete: vi.fn().mockResolvedValue(true),
56
+ history: vi.fn().mockResolvedValue([]),
57
+ purgeExpired: vi.fn().mockResolvedValue(0),
58
+ close: vi.fn().mockResolvedValue(undefined),
59
+ };
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Tests
63
+ // ---------------------------------------------------------------------------
64
+ describe('storeToToolName', () => {
65
+ it('converts kebab-case to snake_case with store_ prefix', () => {
66
+ expect(storeToToolName('active-alerts')).toBe('store_active_alerts');
67
+ expect(storeToToolName('incidents')).toBe('store_incidents');
68
+ });
69
+ });
70
+ describe('createStoreWriteTool', () => {
71
+ let backend;
72
+ beforeEach(() => {
73
+ backend = createMockBackend();
74
+ });
75
+ it('creates a write tool with correct metadata', () => {
76
+ const tool = createStoreWriteTool(ALERTS_STORE, backend, 'test-app');
77
+ expect(tool.description).toContain('Alert');
78
+ expect(tool.description).toContain('alerts');
79
+ expect(tool.readOnly).toBe(false);
80
+ expect(tool.metadata?.category).toBe('store');
81
+ });
82
+ it('writes a document with resolved key', async () => {
83
+ const tool = createStoreWriteTool(ALERTS_STORE, backend, 'test-app');
84
+ const result = await tool.execute({ alert_id: 'a1', severity: 'P1', message: 'disk full' }, mockCtx);
85
+ expect(backend.put).toHaveBeenCalledWith('test-app', 'alerts', 'a1', { alert_id: 'a1', severity: 'P1', message: 'disk full' }, {});
86
+ expect(result).toEqual({ stored: true, key: 'a1', version: 1 });
87
+ });
88
+ it('throws StoreError when key field is missing', async () => {
89
+ const tool = createStoreWriteTool(ALERTS_STORE, backend, 'test-app');
90
+ await expect(tool.execute({ severity: 'P1', message: 'no id' }, mockCtx)).rejects.toThrow(StoreError);
91
+ });
92
+ });
93
+ describe('createStoreBatchTool', () => {
94
+ let backend;
95
+ beforeEach(() => {
96
+ backend = createMockBackend();
97
+ });
98
+ it('creates a batch tool with correct metadata', () => {
99
+ const tool = createStoreBatchTool(ALERTS_STORE, backend, 'test-app');
100
+ expect(tool.description).toContain('multiple');
101
+ expect(tool.readOnly).toBe(false);
102
+ expect(tool.metadata?.category).toBe('store');
103
+ });
104
+ it('writes multiple documents', async () => {
105
+ const tool = createStoreBatchTool(ALERTS_STORE, backend, 'test-app');
106
+ const result = await tool.execute({
107
+ items: [
108
+ { alert_id: 'a1', severity: 'P1', message: 'first' },
109
+ { alert_id: 'a2', severity: 'P2', message: 'second' },
110
+ ],
111
+ }, mockCtx);
112
+ expect(backend.put).toHaveBeenCalledTimes(2);
113
+ expect(result).toMatchObject({ stored: 2, failed: 0, total: 2 });
114
+ });
115
+ it('reports partial failures without throwing', async () => {
116
+ const failBackend = createMockBackend();
117
+ let callCount = 0;
118
+ failBackend.put = vi.fn().mockImplementation(async () => {
119
+ callCount++;
120
+ if (callCount === 2)
121
+ throw new Error('write failed');
122
+ return { stored: true, key: 'k', version: 1 };
123
+ });
124
+ const tool = createStoreBatchTool(ALERTS_STORE, failBackend, 'test-app');
125
+ const result = await tool.execute({
126
+ items: [
127
+ { alert_id: 'a1', severity: 'P1', message: 'ok' },
128
+ { alert_id: 'a2', severity: 'P2', message: 'fail' },
129
+ { alert_id: 'a3', severity: 'P3', message: 'ok' },
130
+ ],
131
+ }, mockCtx);
132
+ expect(result['stored']).toBe(2);
133
+ expect(result['failed']).toBe(1);
134
+ expect(result['errors']).toEqual(['write failed']);
135
+ });
136
+ });
137
+ describe('createStoreQueryTool', () => {
138
+ let backend;
139
+ beforeEach(() => {
140
+ backend = createMockBackend();
141
+ });
142
+ it('creates a query tool that is readOnly', () => {
143
+ const tool = createStoreQueryTool([ALERTS_STORE], backend, 'test-app');
144
+ expect(tool.readOnly).toBe(true);
145
+ expect(tool.metadata?.category).toBe('store');
146
+ });
147
+ it('gets a single document by key', async () => {
148
+ // Pre-populate
149
+ await backend.put('test-app', 'alerts', 'a1', { alert_id: 'a1', severity: 'P1' }, {});
150
+ const tool = createStoreQueryTool([ALERTS_STORE], backend, 'test-app');
151
+ const result = await tool.execute({ store: 'alerts', key: 'a1' }, mockCtx);
152
+ expect(result['found']).toBe(true);
153
+ expect(result['key']).toBe('a1');
154
+ });
155
+ it('returns found: false for missing document', async () => {
156
+ const tool = createStoreQueryTool([ALERTS_STORE], backend, 'test-app');
157
+ const result = await tool.execute({ store: 'alerts', key: 'missing' }, mockCtx);
158
+ expect(result['found']).toBe(false);
159
+ });
160
+ it('lists documents with default limit', async () => {
161
+ await backend.put('test-app', 'alerts', 'a1', { alert_id: 'a1' }, {});
162
+ await backend.put('test-app', 'alerts', 'a2', { alert_id: 'a2' }, {});
163
+ const tool = createStoreQueryTool([ALERTS_STORE], backend, 'test-app');
164
+ const result = await tool.execute({ store: 'alerts' }, mockCtx);
165
+ expect(result).toHaveProperty('documents');
166
+ expect(result).toHaveProperty('total');
167
+ });
168
+ it('passes filter and sort to backend', async () => {
169
+ const tool = createStoreQueryTool([ALERTS_STORE], backend, 'test-app');
170
+ await tool.execute({
171
+ store: 'alerts',
172
+ filter: { severity: 'P1' },
173
+ sort: '-severity',
174
+ limit: 5,
175
+ }, mockCtx);
176
+ expect(backend.list).toHaveBeenCalledWith('test-app', 'alerts', {
177
+ filter: { severity: 'P1' },
178
+ sort: '-severity',
179
+ limit: 5,
180
+ });
181
+ });
182
+ });
183
+ describe('registerStoreTools', () => {
184
+ it('registers write, batch, and query tools for each store', () => {
185
+ const registry = createToolRegistry();
186
+ const backend = createMockBackend();
187
+ registerStoreTools(registry, [ALERTS_STORE], backend, 'test-app');
188
+ expect(registry.names()).toContain('store_alerts');
189
+ expect(registry.names()).toContain('store_alerts_batch');
190
+ expect(registry.names()).toContain(QUERY_STORE_TOOL_NAME);
191
+ expect(registry.size).toBe(3);
192
+ });
193
+ it('registers tools for multiple stores', () => {
194
+ const registry = createToolRegistry();
195
+ const backend = createMockBackend();
196
+ const secondStore = {
197
+ ...ALERTS_STORE,
198
+ name: 'incidents',
199
+ entity: { ...ALERTS_STORE.entity, name: 'Incident', key: '{id}', schema: { id: { type: 'string' } } },
200
+ };
201
+ registerStoreTools(registry, [ALERTS_STORE, secondStore], backend, 'test-app');
202
+ expect(registry.names()).toContain('store_alerts');
203
+ expect(registry.names()).toContain('store_alerts_batch');
204
+ expect(registry.names()).toContain('store_incidents');
205
+ expect(registry.names()).toContain('store_incidents_batch');
206
+ expect(registry.names()).toContain(QUERY_STORE_TOOL_NAME);
207
+ expect(registry.size).toBe(5);
208
+ });
209
+ it('does not register query tool when no stores', () => {
210
+ const registry = createToolRegistry();
211
+ const backend = createMockBackend();
212
+ registerStoreTools(registry, [], backend, 'test-app');
213
+ expect(registry.size).toBe(0);
214
+ });
215
+ });
216
+ //# sourceMappingURL=store-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-tools.test.js","sourceRoot":"","sources":["../../../src/tools/store-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Tool system types for the Amodal runtime.
8
+ *
9
+ * Replaces the upstream gemini-cli-core ToolRegistry with our own that
10
+ * holds Vercel AI SDK-compatible tool definitions. Each tool has a Zod
11
+ * schema for parameter validation, an execute function, and metadata
12
+ * for permission/execution decisions.
13
+ */
14
+ import type { z } from 'zod';
15
+ import type { FlexibleSchema } from 'ai';
16
+ /**
17
+ * Context passed to every tool execute function.
18
+ *
19
+ * This is the runtime's version of the context — it provides access to
20
+ * connections, stores, logging, user info, and cancellation. Specific
21
+ * tool categories (store tools, connection tools) may wrap this with
22
+ * category-specific helpers.
23
+ */
24
+ export interface ToolContext {
25
+ /** Make an HTTP request through a configured connection */
26
+ request(connection: string, endpoint: string, params?: {
27
+ method?: string;
28
+ data?: unknown;
29
+ params?: Record<string, string>;
30
+ }): Promise<unknown>;
31
+ /** Write a document to a store */
32
+ store(storeName: string, payload: Record<string, unknown>): Promise<{
33
+ key: string;
34
+ }>;
35
+ /** Read an environment variable (only if in the tool's env allowlist) */
36
+ env(name: string): string | undefined;
37
+ /** Log a message (emitted as tool_log SSE event) */
38
+ log(message: string): void;
39
+ /** Current user info */
40
+ user: {
41
+ roles: string[];
42
+ [key: string]: unknown;
43
+ };
44
+ /** Abort signal for cancellation/timeout */
45
+ signal: AbortSignal;
46
+ /** Session ID for correlation */
47
+ sessionId: string;
48
+ /** Tenant ID for multi-tenant isolation (store scoping, permission checks) */
49
+ tenantId: string;
50
+ }
51
+ /** Tool category for permission lookup and UI grouping. */
52
+ export type ToolCategory = 'store' | 'connection' | 'custom' | 'mcp' | 'admin' | 'system';
53
+ /**
54
+ * Metadata attached to a tool for permission, routing, and execution decisions.
55
+ */
56
+ export interface ToolMetadata {
57
+ /** Category for permission lookup and UI grouping */
58
+ category: ToolCategory;
59
+ /** Which connection this tool belongs to (for permission lookup) */
60
+ connection?: string;
61
+ /** Source tool name before any prefixing (for MCP tools) */
62
+ originalName?: string;
63
+ }
64
+ /**
65
+ * A registered tool definition.
66
+ *
67
+ * This is what gets passed to the AI SDK's `tools` parameter and also
68
+ * drives our execution pipeline. The `parameters` schema is used both
69
+ * for LLM function calling (converted to JSON Schema) and runtime
70
+ * validation of the LLM's arguments.
71
+ */
72
+ export interface ToolDefinition<TParams = unknown> {
73
+ /** Description shown to the LLM */
74
+ description: string;
75
+ /** Schema for parameter validation — Zod schema or AI SDK jsonSchema() */
76
+ parameters: z.ZodType<TParams> | FlexibleSchema<TParams>;
77
+ /** Execute the tool with validated parameters */
78
+ execute(params: TParams, ctx: ToolContext): Promise<unknown>;
79
+ /**
80
+ * Whether this tool only reads data (no side effects).
81
+ *
82
+ * Used for:
83
+ * - Pre-execution: read-only tools can start during streaming
84
+ * - Parallel execution: read-only tools can run concurrently (Roadmap 2.5)
85
+ * - Confirmation flow: write tools may require user confirmation
86
+ */
87
+ readOnly: boolean;
88
+ /** Optional metadata for permission, routing, and UI */
89
+ metadata?: ToolMetadata;
90
+ }
91
+ /**
92
+ * Registry holding all available tools for a session.
93
+ *
94
+ * Tools are registered at session creation time and may change across
95
+ * sessions (different agents have different tools). The registry is
96
+ * the single source of truth for what tools the LLM can call.
97
+ */
98
+ export interface ToolRegistry {
99
+ /** Register a tool. Throws if a tool with this name is already registered. */
100
+ register(name: string, def: ToolDefinition): void;
101
+ /** Get a tool by name. Returns undefined if not found. */
102
+ get(name: string): ToolDefinition | undefined;
103
+ /** Get all tools as a Record (for passing to AI SDK streamText/generateText). */
104
+ getTools(): Record<string, ToolDefinition>;
105
+ /** List all registered tool names. */
106
+ names(): string[];
107
+ /** Get a subset of tools by name (for sub-agent dispatch). */
108
+ subset(names: string[]): Record<string, ToolDefinition>;
109
+ /** Number of registered tools. */
110
+ size: number;
111
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}