@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,190 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Connection request tool rewritten for the new ToolRegistry.
8
+ *
9
+ * Makes HTTP requests through configured connections with:
10
+ * - Permission checking via PermissionChecker interface
11
+ * - Field scrubbing on responses
12
+ * - Intent-based write confirmation flow
13
+ * - Auth header injection from connection config
14
+ * - Environment variable expansion in endpoints
15
+ */
16
+ import { z } from 'zod';
17
+ import { ConnectionError } from '../errors.js';
18
+ // ---------------------------------------------------------------------------
19
+ // Constants
20
+ // ---------------------------------------------------------------------------
21
+ export const REQUEST_TOOL_NAME = 'request';
22
+ const REQUEST_TIMEOUT_MS = 30_000;
23
+ // ---------------------------------------------------------------------------
24
+ // Params schema
25
+ // ---------------------------------------------------------------------------
26
+ const RequestParamsSchema = z.object({
27
+ connection: z.string().min(1),
28
+ method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']),
29
+ endpoint: z.string().min(1),
30
+ params: z.record(z.string()).optional(),
31
+ data: z.unknown().optional(),
32
+ headers: z.record(z.string()).optional(),
33
+ intent: z.enum(['read', 'write', 'confirmed_write']),
34
+ });
35
+ // ---------------------------------------------------------------------------
36
+ // Helpers
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Resolve auth template variables: "Bearer {{API_KEY}}" → "Bearer token123"
40
+ */
41
+ function resolveAuthTemplate(template, connectionConfig) {
42
+ return template.replace(/\{\{(\w+)\}\}/g, (_match, varName) => {
43
+ const value = connectionConfig[varName];
44
+ return value !== undefined ? String(value) : '';
45
+ });
46
+ }
47
+ /**
48
+ * Expand $ENV_VAR references in a string using session-scoped env.
49
+ * Uses replaceAll loop instead of regex to avoid greedy matching
50
+ * ($FOO would incorrectly match inside $FOOBAR with regex).
51
+ */
52
+ function expandEnvVars(value, sessionEnv) {
53
+ let result = value;
54
+ for (const [key, val] of Object.entries(sessionEnv)) {
55
+ result = result.replaceAll(`$${key}`, val);
56
+ }
57
+ return result;
58
+ }
59
+ /**
60
+ * Build headers from connection config auth + defaults + user overrides.
61
+ */
62
+ function buildHeaders(connectionConfig, requestConfig, extraHeaders) {
63
+ const headers = {};
64
+ // Default headers from connection config
65
+ if (requestConfig?.default_headers) {
66
+ Object.assign(headers, requestConfig.default_headers);
67
+ }
68
+ // Auth headers
69
+ if (requestConfig?.auth) {
70
+ for (const authEntry of requestConfig.auth) {
71
+ headers[authEntry.header] = resolveAuthTemplate(authEntry.value_template, connectionConfig);
72
+ }
73
+ }
74
+ // User-provided headers (override defaults)
75
+ if (extraHeaders) {
76
+ Object.assign(headers, extraHeaders);
77
+ }
78
+ return headers;
79
+ }
80
+ /**
81
+ * Create the connection request tool.
82
+ */
83
+ export function createRequestTool(options) {
84
+ const { connectionsMap, permissionChecker, fieldScrubber, sessionEnv = {}, readOnly = false, planModeActive } = options;
85
+ return {
86
+ description: 'Make an HTTP request to a configured connection. Use intent "write" for mutating operations (POST, PUT, PATCH, DELETE) — a preview will be shown first. Then call again with intent "confirmed_write" to execute.',
87
+ parameters: RequestParamsSchema,
88
+ readOnly: false,
89
+ metadata: { category: 'connection' },
90
+ async execute(params, ctx) {
91
+ const { connection, method, endpoint, data, headers: extraHeaders, intent } = params;
92
+ // Resolve connection config
93
+ const connConfig = connectionsMap[connection];
94
+ if (!connConfig) {
95
+ throw new ConnectionError(`Connection "${connection}" not found`, {
96
+ connection,
97
+ action: `${method} ${endpoint}`,
98
+ });
99
+ }
100
+ const requestConfig = connConfig['_request_config'];
101
+ const baseUrl = connConfig['base_url'];
102
+ if (!baseUrl || typeof baseUrl !== 'string') {
103
+ throw new ConnectionError(`Connection "${connection}" has no base_url configured`, {
104
+ connection,
105
+ action: `${method} ${endpoint}`,
106
+ });
107
+ }
108
+ // Build endpoint path
109
+ const endpointPath = `${method.toUpperCase()} ${endpoint}`;
110
+ // Permission check
111
+ const permission = permissionChecker.check({
112
+ connection,
113
+ endpointPath,
114
+ intent,
115
+ method,
116
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- data validated as object above
117
+ params: typeof data === 'object' && data !== null ? data : undefined,
118
+ readOnly,
119
+ planModeActive: planModeActive?.() ?? false,
120
+ });
121
+ if (!permission.allowed) {
122
+ return { error: permission.reason };
123
+ }
124
+ // Write preview flow
125
+ if (permission.allowed && permission.requiresConfirmation && intent === 'write') {
126
+ return {
127
+ preview: true,
128
+ method: method.toUpperCase(),
129
+ endpoint,
130
+ connection,
131
+ reason: permission.reason,
132
+ instruction: 'Call this tool again with intent "confirmed_write" to execute.',
133
+ };
134
+ }
135
+ // Build URL
136
+ const expandedEndpoint = expandEnvVars(endpoint, sessionEnv);
137
+ // Strip trailing/leading slashes without regex (CodeQL flags /\/+$/ on library input)
138
+ let cleanBase = baseUrl;
139
+ while (cleanBase.endsWith('/'))
140
+ cleanBase = cleanBase.slice(0, -1);
141
+ let cleanEndpoint = expandedEndpoint;
142
+ while (cleanEndpoint.startsWith('/'))
143
+ cleanEndpoint = cleanEndpoint.slice(1);
144
+ let url = `${cleanBase}/${cleanEndpoint}`;
145
+ // Append query params
146
+ if (params.params) {
147
+ const searchParams = new URLSearchParams();
148
+ for (const [key, value] of Object.entries(params.params)) {
149
+ searchParams.set(key, expandEnvVars(String(value), sessionEnv));
150
+ }
151
+ url += `?${searchParams.toString()}`;
152
+ }
153
+ // Build headers
154
+ const resolvedHeaders = buildHeaders(connConfig, requestConfig, extraHeaders);
155
+ // Execute HTTP request
156
+ const fetchOptions = {
157
+ method: method.toUpperCase(),
158
+ headers: resolvedHeaders,
159
+ signal: ctx.signal ?? AbortSignal.timeout(REQUEST_TIMEOUT_MS),
160
+ };
161
+ if (data !== undefined && ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {
162
+ fetchOptions.body = JSON.stringify(data);
163
+ resolvedHeaders['Content-Type'] = resolvedHeaders['Content-Type'] ?? 'application/json';
164
+ }
165
+ const response = await fetch(url, fetchOptions);
166
+ const responseText = await response.text();
167
+ let responseData;
168
+ try {
169
+ responseData = JSON.parse(responseText);
170
+ }
171
+ catch {
172
+ responseData = responseText;
173
+ }
174
+ // Field scrubbing
175
+ if (fieldScrubber && typeof responseData === 'object' && responseData !== null) {
176
+ const scrubResult = fieldScrubber.scrub(responseData, connection, endpointPath);
177
+ return {
178
+ status: response.status,
179
+ data: scrubResult.data,
180
+ ...(scrubResult.strippedCount > 0 ? { fields_stripped: scrubResult.strippedCount } : {}),
181
+ };
182
+ }
183
+ return {
184
+ status: response.status,
185
+ data: responseData,
186
+ };
187
+ },
188
+ };
189
+ }
190
+ //# sourceMappingURL=request-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-tool.js","sourceRoot":"","sources":["../../../src/tools/request-tool.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,254 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect, vi, beforeAll, afterAll } from 'vitest';
7
+ import { createServer } from 'node:http';
8
+ import { createRequestTool, REQUEST_TOOL_NAME } from './request-tool.js';
9
+ import { ConnectionError } from '../errors.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Mock HTTP server
12
+ // ---------------------------------------------------------------------------
13
+ let server;
14
+ let baseUrl;
15
+ beforeAll(async () => {
16
+ server = createServer((req, res) => {
17
+ // Echo back request details
18
+ let body = '';
19
+ req.on('data', (chunk) => {
20
+ body += chunk.toString();
21
+ });
22
+ req.on('end', () => {
23
+ res.setHeader('Content-Type', 'application/json');
24
+ res.end(JSON.stringify({
25
+ method: req.method,
26
+ url: req.url,
27
+ headers: req.headers,
28
+ body: body || undefined,
29
+ }));
30
+ });
31
+ });
32
+ await new Promise((resolve) => {
33
+ server.listen(0, '127.0.0.1', () => resolve());
34
+ });
35
+ const addr = server.address();
36
+ if (typeof addr === 'object' && addr !== null) {
37
+ baseUrl = `http://127.0.0.1:${String(addr.port)}`;
38
+ }
39
+ });
40
+ afterAll(() => {
41
+ server.close();
42
+ });
43
+ // ---------------------------------------------------------------------------
44
+ // Helpers
45
+ // ---------------------------------------------------------------------------
46
+ const allowAllChecker = {
47
+ check: () => ({ allowed: true }),
48
+ };
49
+ const confirmChecker = {
50
+ check: () => ({ allowed: true, requiresConfirmation: true, reason: 'Needs confirmation' }),
51
+ };
52
+ const denyChecker = {
53
+ check: () => ({ allowed: false, reason: 'Operation blocked' }),
54
+ };
55
+ function makeConnectionsMap(overrides = {}) {
56
+ return {
57
+ 'test-api': {
58
+ base_url: baseUrl,
59
+ API_KEY: 'test-token-123',
60
+ _request_config: {
61
+ base_url_field: 'base_url',
62
+ auth: [{ header: 'Authorization', value_template: 'Bearer {{API_KEY}}' }],
63
+ default_headers: { 'X-Source': 'amodal' },
64
+ },
65
+ ...overrides,
66
+ },
67
+ };
68
+ }
69
+ const mockCtx = {
70
+ request: vi.fn(),
71
+ store: vi.fn(),
72
+ env: vi.fn(),
73
+ log: vi.fn(),
74
+ user: { roles: ['admin'] },
75
+ signal: AbortSignal.timeout(5000),
76
+ sessionId: 'test-session',
77
+ tenantId: 'test-tenant',
78
+ };
79
+ // ---------------------------------------------------------------------------
80
+ // Tests
81
+ // ---------------------------------------------------------------------------
82
+ describe('createRequestTool', () => {
83
+ it('has correct name and metadata', () => {
84
+ const tool = createRequestTool({
85
+ connectionsMap: makeConnectionsMap(),
86
+ permissionChecker: allowAllChecker,
87
+ });
88
+ expect(tool.readOnly).toBe(false);
89
+ expect(tool.metadata?.category).toBe('connection');
90
+ expect(REQUEST_TOOL_NAME).toBe('request');
91
+ });
92
+ it('makes a GET request with auth headers', async () => {
93
+ const tool = createRequestTool({
94
+ connectionsMap: makeConnectionsMap(),
95
+ permissionChecker: allowAllChecker,
96
+ });
97
+ const result = await tool.execute({
98
+ connection: 'test-api',
99
+ method: 'GET',
100
+ endpoint: '/users',
101
+ intent: 'read',
102
+ }, mockCtx);
103
+ expect(result['status']).toBe(200);
104
+ const data = result['data'];
105
+ expect(data['method']).toBe('GET');
106
+ const headers = data['headers'];
107
+ expect(headers['authorization']).toBe('Bearer test-token-123');
108
+ expect(headers['x-source']).toBe('amodal');
109
+ });
110
+ it('makes a POST request with body', async () => {
111
+ const tool = createRequestTool({
112
+ connectionsMap: makeConnectionsMap(),
113
+ permissionChecker: allowAllChecker,
114
+ });
115
+ const result = await tool.execute({
116
+ connection: 'test-api',
117
+ method: 'POST',
118
+ endpoint: '/articles',
119
+ intent: 'confirmed_write',
120
+ data: { title: 'Test Article' },
121
+ }, mockCtx);
122
+ expect(result['status']).toBe(200);
123
+ const data = result['data'];
124
+ expect(data['method']).toBe('POST');
125
+ expect(data['body']).toBe('{"title":"Test Article"}');
126
+ });
127
+ it('returns preview for write intent when confirmation required', async () => {
128
+ const tool = createRequestTool({
129
+ connectionsMap: makeConnectionsMap(),
130
+ permissionChecker: confirmChecker,
131
+ });
132
+ const result = await tool.execute({
133
+ connection: 'test-api',
134
+ method: 'POST',
135
+ endpoint: '/articles',
136
+ intent: 'write',
137
+ data: { title: 'Draft' },
138
+ }, mockCtx);
139
+ expect(result['preview']).toBe(true);
140
+ expect(result['method']).toBe('POST');
141
+ expect(result['instruction']).toContain('confirmed_write');
142
+ });
143
+ it('returns error when permission denied', async () => {
144
+ const tool = createRequestTool({
145
+ connectionsMap: makeConnectionsMap(),
146
+ permissionChecker: denyChecker,
147
+ });
148
+ const result = await tool.execute({
149
+ connection: 'test-api',
150
+ method: 'DELETE',
151
+ endpoint: '/articles/1',
152
+ intent: 'write',
153
+ }, mockCtx);
154
+ expect(result['error']).toBe('Operation blocked');
155
+ });
156
+ it('throws ConnectionError for unknown connection', async () => {
157
+ const tool = createRequestTool({
158
+ connectionsMap: makeConnectionsMap(),
159
+ permissionChecker: allowAllChecker,
160
+ });
161
+ await expect(tool.execute({
162
+ connection: 'nonexistent',
163
+ method: 'GET',
164
+ endpoint: '/test',
165
+ intent: 'read',
166
+ }, mockCtx)).rejects.toThrow(ConnectionError);
167
+ });
168
+ it('throws ConnectionError when no base_url', async () => {
169
+ const tool = createRequestTool({
170
+ connectionsMap: { 'no-url': {} },
171
+ permissionChecker: allowAllChecker,
172
+ });
173
+ await expect(tool.execute({
174
+ connection: 'no-url',
175
+ method: 'GET',
176
+ endpoint: '/test',
177
+ intent: 'read',
178
+ }, mockCtx)).rejects.toThrow(ConnectionError);
179
+ });
180
+ it('expands $ENV_VAR in endpoints', async () => {
181
+ const tool = createRequestTool({
182
+ connectionsMap: makeConnectionsMap(),
183
+ permissionChecker: allowAllChecker,
184
+ sessionEnv: { APP_ID: 'my-app' },
185
+ });
186
+ const result = await tool.execute({
187
+ connection: 'test-api',
188
+ method: 'GET',
189
+ endpoint: '/apps/$APP_ID/status',
190
+ intent: 'read',
191
+ }, mockCtx);
192
+ const data = result['data'];
193
+ expect(data['url']).toBe('/apps/my-app/status');
194
+ });
195
+ it('appends query params', async () => {
196
+ const tool = createRequestTool({
197
+ connectionsMap: makeConnectionsMap(),
198
+ permissionChecker: allowAllChecker,
199
+ });
200
+ const result = await tool.execute({
201
+ connection: 'test-api',
202
+ method: 'GET',
203
+ endpoint: '/search',
204
+ intent: 'read',
205
+ params: { q: 'test', limit: '10' },
206
+ }, mockCtx);
207
+ const data = result['data'];
208
+ const url = data['url'];
209
+ expect(url).toContain('q=test');
210
+ expect(url).toContain('limit=10');
211
+ });
212
+ it('handles non-string query param values without crashing (G7)', async () => {
213
+ const tool = createRequestTool({
214
+ connectionsMap: makeConnectionsMap(),
215
+ permissionChecker: allowAllChecker,
216
+ });
217
+ const result = await tool.execute({
218
+ connection: 'test-api',
219
+ method: 'GET',
220
+ endpoint: '/search',
221
+ intent: 'read',
222
+ params: { per_page: 30, tag: 'ai', active: true },
223
+ }, mockCtx);
224
+ const data = result['data'];
225
+ const url = data['url'];
226
+ expect(url).toContain('per_page=30');
227
+ expect(url).toContain('tag=ai');
228
+ expect(url).toContain('active=true');
229
+ });
230
+ it('passes permission checker the correct request shape', async () => {
231
+ const checkSpy = vi.fn().mockReturnValue({ allowed: true });
232
+ const spyChecker = { check: checkSpy };
233
+ const tool = createRequestTool({
234
+ connectionsMap: makeConnectionsMap(),
235
+ permissionChecker: spyChecker,
236
+ readOnly: true,
237
+ planModeActive: () => true,
238
+ });
239
+ await tool.execute({
240
+ connection: 'test-api',
241
+ method: 'GET',
242
+ endpoint: '/data',
243
+ intent: 'read',
244
+ }, mockCtx).catch(() => { });
245
+ expect(checkSpy).toHaveBeenCalledWith(expect.objectContaining({
246
+ connection: 'test-api',
247
+ method: 'GET',
248
+ intent: 'read',
249
+ readOnly: true,
250
+ planModeActive: true,
251
+ }));
252
+ });
253
+ });
254
+ //# sourceMappingURL=request-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-tool.test.js","sourceRoot":"","sources":["../../../src/tools/request-tool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { LoadedStore, StoreBackend } from '@amodalai/types';
7
+ import type { ToolDefinition } from './types.js';
8
+ /**
9
+ * Convert a store name (kebab-case) to a tool name.
10
+ * Example: "active-alerts" → "store_active_alerts"
11
+ */
12
+ export declare function storeToToolName(storeName: string): string;
13
+ /**
14
+ * Create a store write ToolDefinition for a single store.
15
+ */
16
+ export declare function createStoreWriteTool(store: LoadedStore, backend: StoreBackend, appId: string): ToolDefinition;
17
+ /**
18
+ * Create a store batch write ToolDefinition for a single store.
19
+ */
20
+ export declare function createStoreBatchTool(store: LoadedStore, backend: StoreBackend, appId: string): ToolDefinition;
21
+ export declare const QUERY_STORE_TOOL_NAME = "query_store";
22
+ /**
23
+ * Create a store query ToolDefinition that reads from any store.
24
+ */
25
+ export declare function createStoreQueryTool(stores: LoadedStore[], backend: StoreBackend, appId: string): ToolDefinition;
26
+ /**
27
+ * Register store tools on a ToolRegistry for all stores in a bundle.
28
+ */
29
+ export declare function registerStoreTools(registry: import('./types.js').ToolRegistry, stores: LoadedStore[], backend: StoreBackend, appId: string): void;