@amodalai/runtime 0.1.26 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/dist/src/__fixtures__/README.md +88 -0
  2. package/dist/src/__fixtures__/e2e.test.js +211 -0
  3. package/dist/src/__fixtures__/e2e.test.js.map +1 -0
  4. package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
  5. package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -0
  6. package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
  7. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
  8. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
  9. package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
  10. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
  11. package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
  12. package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
  13. package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
  14. package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
  15. package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
  16. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
  17. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
  18. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
  19. package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
  20. package/dist/src/__fixtures__/smoke.test.js +1404 -0
  21. package/dist/src/__fixtures__/smoke.test.js.map +1 -0
  22. package/dist/src/__fixtures__/test-env.d.ts +27 -0
  23. package/dist/src/__fixtures__/test-env.js +64 -0
  24. package/dist/src/__fixtures__/test-env.js.map +1 -0
  25. package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
  26. package/dist/src/__fixtures__/test-helpers.js +120 -0
  27. package/dist/src/__fixtures__/test-helpers.js.map +1 -0
  28. package/dist/src/__tests__/test-providers.d.ts +40 -0
  29. package/dist/src/__tests__/test-providers.js +61 -0
  30. package/dist/src/__tests__/test-providers.js.map +1 -0
  31. package/dist/src/agent/agent-types.d.ts +22 -0
  32. package/dist/src/agent/agent-types.js.map +1 -1
  33. package/dist/src/agent/automation-bridge.d.ts +9 -0
  34. package/dist/src/agent/automation-bridge.js +26 -0
  35. package/dist/src/agent/automation-bridge.js.map +1 -1
  36. package/dist/src/agent/automation-bridge.test.js +63 -0
  37. package/dist/src/agent/automation-bridge.test.js.map +1 -1
  38. package/dist/src/agent/local-server.d.ts +1 -8
  39. package/dist/src/agent/local-server.js +398 -163
  40. package/dist/src/agent/local-server.js.map +1 -1
  41. package/dist/src/agent/local-server.test.js +14 -8
  42. package/dist/src/agent/local-server.test.js.map +1 -1
  43. package/dist/src/agent/loop-types.d.ts +254 -0
  44. package/dist/src/agent/loop-types.js +24 -0
  45. package/dist/src/agent/loop-types.js.map +1 -0
  46. package/dist/src/agent/loop.d.ts +31 -0
  47. package/dist/src/agent/loop.js +152 -0
  48. package/dist/src/agent/loop.js.map +1 -0
  49. package/dist/src/agent/loop.test.js +1594 -0
  50. package/dist/src/agent/loop.test.js.map +1 -0
  51. package/dist/src/agent/mcp-config.d.ts +28 -0
  52. package/dist/src/agent/mcp-config.js +57 -0
  53. package/dist/src/agent/mcp-config.js.map +1 -0
  54. package/dist/src/agent/page-builder.js +6 -1
  55. package/dist/src/agent/page-builder.js.map +1 -1
  56. package/dist/src/agent/proactive/delivery-router.d.ts +68 -0
  57. package/dist/src/agent/proactive/delivery-router.js +337 -0
  58. package/dist/src/agent/proactive/delivery-router.js.map +1 -0
  59. package/dist/src/agent/{stores-e2e.test.d.ts → proactive/delivery-router.test.d.ts} +1 -1
  60. package/dist/src/agent/proactive/delivery-router.test.js +455 -0
  61. package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
  62. package/dist/src/agent/proactive/proactive-runner.d.ts +46 -8
  63. package/dist/src/agent/proactive/proactive-runner.js +67 -37
  64. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  65. package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
  66. package/dist/src/agent/proactive/proactive-runner.test.js +73 -87
  67. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  68. package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
  69. package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
  70. package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
  71. package/dist/src/agent/routes/admin-chat.d.ts +15 -3
  72. package/dist/src/agent/routes/admin-chat.js +61 -18
  73. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  74. package/dist/src/agent/routes/automations.js +5 -6
  75. package/dist/src/agent/routes/automations.js.map +1 -1
  76. package/dist/src/agent/routes/evals.d.ts +3 -2
  77. package/dist/src/agent/routes/evals.js +25 -12
  78. package/dist/src/agent/routes/evals.js.map +1 -1
  79. package/dist/src/agent/routes/files.js +7 -9
  80. package/dist/src/agent/routes/files.js.map +1 -1
  81. package/dist/src/agent/routes/inspect.d.ts +6 -2
  82. package/dist/src/agent/routes/inspect.js +31 -17
  83. package/dist/src/agent/routes/inspect.js.map +1 -1
  84. package/dist/src/agent/routes/inspect.test.js +18 -42
  85. package/dist/src/agent/routes/inspect.test.js.map +1 -1
  86. package/dist/src/agent/routes/stores.js +9 -12
  87. package/dist/src/agent/routes/stores.js.map +1 -1
  88. package/dist/src/agent/routes/task.d.ts +15 -3
  89. package/dist/src/agent/routes/task.js +16 -7
  90. package/dist/src/agent/routes/task.js.map +1 -1
  91. package/dist/src/agent/routes/task.test.d.ts +1 -1
  92. package/dist/src/agent/routes/task.test.js +68 -53
  93. package/dist/src/agent/routes/task.test.js.map +1 -1
  94. package/dist/src/agent/routes/webhooks.js +12 -3
  95. package/dist/src/agent/routes/webhooks.js.map +1 -1
  96. package/dist/src/agent/snapshot-server.d.ts +2 -22
  97. package/dist/src/agent/snapshot-server.js +48 -27
  98. package/dist/src/agent/snapshot-server.js.map +1 -1
  99. package/dist/src/agent/states/compacting.d.ts +14 -0
  100. package/dist/src/agent/states/compacting.js +260 -0
  101. package/dist/src/agent/states/compacting.js.map +1 -0
  102. package/dist/src/agent/states/confirming.d.ts +10 -0
  103. package/dist/src/agent/states/confirming.js +79 -0
  104. package/dist/src/agent/states/confirming.js.map +1 -0
  105. package/dist/src/agent/states/dispatching.d.ts +18 -0
  106. package/dist/src/agent/states/dispatching.js +285 -0
  107. package/dist/src/agent/states/dispatching.js.map +1 -0
  108. package/dist/src/agent/states/executing.d.ts +21 -0
  109. package/dist/src/agent/states/executing.js +452 -0
  110. package/dist/src/agent/states/executing.js.map +1 -0
  111. package/dist/src/agent/states/streaming.d.ts +10 -0
  112. package/dist/src/agent/states/streaming.js +169 -0
  113. package/dist/src/agent/states/streaming.js.map +1 -0
  114. package/dist/src/agent/states/thinking.d.ts +13 -0
  115. package/dist/src/agent/states/thinking.js +450 -0
  116. package/dist/src/agent/states/thinking.js.map +1 -0
  117. package/dist/src/agent/token-estimate.d.ts +31 -0
  118. package/dist/src/agent/token-estimate.js +34 -0
  119. package/dist/src/agent/token-estimate.js.map +1 -0
  120. package/dist/src/agent/token-estimate.test.d.ts +6 -0
  121. package/dist/src/agent/token-estimate.test.js +44 -0
  122. package/dist/src/agent/token-estimate.test.js.map +1 -0
  123. package/dist/src/agent/tool-executor-local.js +9 -18
  124. package/dist/src/agent/tool-executor-local.js.map +1 -1
  125. package/dist/src/agent/tool-executor-local.test.js +3 -5
  126. package/dist/src/agent/tool-executor-local.test.js.map +1 -1
  127. package/dist/src/api/create-agent.d.ts +15 -0
  128. package/dist/src/api/create-agent.js +134 -0
  129. package/dist/src/api/create-agent.js.map +1 -0
  130. package/dist/src/api/types.d.ts +66 -0
  131. package/dist/src/api/types.js +7 -0
  132. package/dist/src/api/types.js.map +1 -0
  133. package/dist/src/context/compiler.d.ts +13 -0
  134. package/dist/src/context/compiler.js +358 -0
  135. package/dist/src/context/compiler.js.map +1 -0
  136. package/dist/src/context/compiler.test.d.ts +6 -0
  137. package/dist/src/context/compiler.test.js +532 -0
  138. package/dist/src/context/compiler.test.js.map +1 -0
  139. package/dist/src/context/types.d.ts +110 -0
  140. package/dist/src/context/types.js +7 -0
  141. package/dist/src/context/types.js.map +1 -0
  142. package/dist/src/env-ref.d.ts +13 -0
  143. package/dist/src/env-ref.js +31 -0
  144. package/dist/src/env-ref.js.map +1 -0
  145. package/dist/src/env-ref.test.d.ts +6 -0
  146. package/dist/src/env-ref.test.js +34 -0
  147. package/dist/src/env-ref.test.js.map +1 -0
  148. package/dist/src/errors.d.ts +15 -0
  149. package/dist/src/errors.js +22 -0
  150. package/dist/src/errors.js.map +1 -1
  151. package/dist/src/errors.test.js +2 -2
  152. package/dist/src/errors.test.js.map +1 -1
  153. package/dist/src/events/event-bus.d.ts +54 -0
  154. package/dist/src/events/event-bus.js +84 -0
  155. package/dist/src/events/event-bus.js.map +1 -0
  156. package/dist/src/events/event-bus.test.d.ts +6 -0
  157. package/dist/src/events/event-bus.test.js +112 -0
  158. package/dist/src/events/event-bus.test.js.map +1 -0
  159. package/dist/src/events/events-route.d.ts +36 -0
  160. package/dist/src/events/events-route.js +80 -0
  161. package/dist/src/events/events-route.js.map +1 -0
  162. package/dist/src/events/events-route.test.d.ts +6 -0
  163. package/dist/src/events/events-route.test.js +134 -0
  164. package/dist/src/events/events-route.test.js.map +1 -0
  165. package/dist/src/events/store-event-wrapper.d.ts +19 -0
  166. package/dist/src/events/store-event-wrapper.js +57 -0
  167. package/dist/src/events/store-event-wrapper.js.map +1 -0
  168. package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
  169. package/dist/src/events/store-event-wrapper.test.js +91 -0
  170. package/dist/src/events/store-event-wrapper.test.js.map +1 -0
  171. package/dist/src/index.d.ts +33 -6
  172. package/dist/src/index.js +35 -21
  173. package/dist/src/index.js.map +1 -1
  174. package/dist/src/middleware/auth.d.ts +0 -2
  175. package/dist/src/middleware/auth.js.map +1 -1
  176. package/dist/src/providers/create-provider.d.ts +23 -0
  177. package/dist/src/providers/create-provider.js +185 -0
  178. package/dist/src/providers/create-provider.js.map +1 -0
  179. package/dist/src/providers/create-provider.test.d.ts +6 -0
  180. package/dist/src/providers/create-provider.test.js +95 -0
  181. package/dist/src/providers/create-provider.test.js.map +1 -0
  182. package/dist/src/providers/failover.d.ts +38 -0
  183. package/dist/src/providers/failover.js +147 -0
  184. package/dist/src/providers/failover.js.map +1 -0
  185. package/dist/src/providers/failover.test.d.ts +6 -0
  186. package/dist/src/providers/failover.test.js +169 -0
  187. package/dist/src/providers/failover.test.js.map +1 -0
  188. package/dist/src/providers/search-provider.d.ts +64 -0
  189. package/dist/src/providers/search-provider.js +174 -0
  190. package/dist/src/providers/search-provider.js.map +1 -0
  191. package/dist/src/providers/types.d.ts +118 -0
  192. package/dist/src/providers/types.js +7 -0
  193. package/dist/src/providers/types.js.map +1 -0
  194. package/dist/src/routes/ai-stream.d.ts +28 -10
  195. package/dist/src/routes/ai-stream.js +85 -41
  196. package/dist/src/routes/ai-stream.js.map +1 -1
  197. package/dist/src/routes/chat-new.test.d.ts +6 -0
  198. package/dist/src/routes/chat-new.test.js +107 -0
  199. package/dist/src/routes/chat-new.test.js.map +1 -0
  200. package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
  201. package/dist/src/routes/chat-stream-new.test.js +135 -0
  202. package/dist/src/routes/chat-stream-new.test.js.map +1 -0
  203. package/dist/src/routes/chat-stream.d.ts +20 -4
  204. package/dist/src/routes/chat-stream.js +49 -29
  205. package/dist/src/routes/chat-stream.js.map +1 -1
  206. package/dist/src/routes/chat.d.ts +19 -4
  207. package/dist/src/routes/chat.js +62 -23
  208. package/dist/src/routes/chat.js.map +1 -1
  209. package/dist/src/routes/health.d.ts +3 -2
  210. package/dist/src/routes/health.js.map +1 -1
  211. package/dist/src/routes/route-helpers.d.ts +50 -0
  212. package/dist/src/routes/route-helpers.js +80 -0
  213. package/dist/src/routes/route-helpers.js.map +1 -0
  214. package/dist/src/routes/session-resolver.d.ts +77 -0
  215. package/dist/src/routes/session-resolver.js +109 -0
  216. package/dist/src/routes/session-resolver.js.map +1 -0
  217. package/dist/src/routes/session-resolver.test.d.ts +6 -0
  218. package/dist/src/routes/session-resolver.test.js +207 -0
  219. package/dist/src/routes/session-resolver.test.js.map +1 -0
  220. package/dist/src/routes/webhooks.d.ts +3 -1
  221. package/dist/src/routes/webhooks.js +12 -4
  222. package/dist/src/routes/webhooks.js.map +1 -1
  223. package/dist/src/security/permission-checker.d.ts +80 -0
  224. package/dist/src/security/permission-checker.js +75 -0
  225. package/dist/src/security/permission-checker.js.map +1 -0
  226. package/dist/src/security/permission-checker.test.d.ts +6 -0
  227. package/dist/src/security/permission-checker.test.js +208 -0
  228. package/dist/src/security/permission-checker.test.js.map +1 -0
  229. package/dist/src/server.d.ts +18 -11
  230. package/dist/src/server.js +46 -46
  231. package/dist/src/server.js.map +1 -1
  232. package/dist/src/server.test.d.ts +1 -1
  233. package/dist/src/server.test.js +6 -144
  234. package/dist/src/server.test.js.map +1 -1
  235. package/dist/src/session/drizzle-session-store.d.ts +56 -0
  236. package/dist/src/session/drizzle-session-store.js +203 -0
  237. package/dist/src/session/drizzle-session-store.js.map +1 -0
  238. package/dist/src/session/manager.d.ts +101 -0
  239. package/dist/src/session/manager.js +394 -0
  240. package/dist/src/session/manager.js.map +1 -0
  241. package/dist/src/session/manager.test.d.ts +6 -0
  242. package/dist/src/session/manager.test.js +309 -0
  243. package/dist/src/session/manager.test.js.map +1 -0
  244. package/dist/src/session/pglite-session-store.d.ts +23 -0
  245. package/dist/src/session/pglite-session-store.js +70 -0
  246. package/dist/src/session/pglite-session-store.js.map +1 -0
  247. package/dist/src/session/postgres-session-store.d.ts +44 -0
  248. package/dist/src/session/postgres-session-store.js +138 -0
  249. package/dist/src/session/postgres-session-store.js.map +1 -0
  250. package/dist/src/session/session-builder.d.ts +69 -0
  251. package/dist/src/session/session-builder.js +384 -0
  252. package/dist/src/session/session-builder.js.map +1 -0
  253. package/dist/src/session/session-builder.test.d.ts +6 -0
  254. package/dist/src/session/session-builder.test.js +350 -0
  255. package/dist/src/session/session-builder.test.js.map +1 -0
  256. package/dist/src/session/session-store-selector.d.ts +49 -0
  257. package/dist/src/session/session-store-selector.js +60 -0
  258. package/dist/src/session/session-store-selector.js.map +1 -0
  259. package/dist/src/session/session-store-selector.test.d.ts +6 -0
  260. package/dist/src/session/session-store-selector.test.js +79 -0
  261. package/dist/src/session/session-store-selector.test.js.map +1 -0
  262. package/dist/src/session/store.d.ts +171 -0
  263. package/dist/src/session/store.js +155 -0
  264. package/dist/src/session/store.js.map +1 -0
  265. package/dist/src/session/store.test.d.ts +6 -0
  266. package/dist/src/session/store.test.js +423 -0
  267. package/dist/src/session/store.test.js.map +1 -0
  268. package/dist/src/session/stream-hooks.d.ts +39 -0
  269. package/dist/src/session/stream-hooks.js +7 -0
  270. package/dist/src/session/stream-hooks.js.map +1 -0
  271. package/dist/src/session/tool-context-factory.d.ts +61 -0
  272. package/dist/src/session/tool-context-factory.js +189 -0
  273. package/dist/src/session/tool-context-factory.js.map +1 -0
  274. package/dist/src/session/tool-context-factory.test.d.ts +6 -0
  275. package/dist/src/session/tool-context-factory.test.js +284 -0
  276. package/dist/src/session/tool-context-factory.test.js.map +1 -0
  277. package/dist/src/session/types.d.ts +195 -0
  278. package/dist/src/session/types.js +7 -0
  279. package/dist/src/session/types.js.map +1 -0
  280. package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
  281. package/dist/src/stores/drizzle-store-backend.js +306 -0
  282. package/dist/src/stores/drizzle-store-backend.js.map +1 -0
  283. package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
  284. package/dist/src/stores/drizzle-store-backend.test.js +215 -0
  285. package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
  286. package/dist/src/stores/index.d.ts +4 -0
  287. package/dist/src/stores/index.js +2 -0
  288. package/dist/src/stores/index.js.map +1 -1
  289. package/dist/src/stores/pglite-store-backend.d.ts +16 -19
  290. package/dist/src/stores/pglite-store-backend.js +85 -239
  291. package/dist/src/stores/pglite-store-backend.js.map +1 -1
  292. package/dist/src/stores/postgres-store-backend.d.ts +30 -0
  293. package/dist/src/stores/postgres-store-backend.js +100 -0
  294. package/dist/src/stores/postgres-store-backend.js.map +1 -0
  295. package/dist/src/stores/schema.d.ts +457 -0
  296. package/dist/src/stores/schema.js +59 -0
  297. package/dist/src/stores/schema.js.map +1 -0
  298. package/dist/src/tools/admin-file-tools.d.ts +42 -0
  299. package/dist/src/tools/admin-file-tools.js +714 -0
  300. package/dist/src/tools/admin-file-tools.js.map +1 -0
  301. package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
  302. package/dist/src/tools/admin-file-tools.test.js +521 -0
  303. package/dist/src/tools/admin-file-tools.test.js.map +1 -0
  304. package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
  305. package/dist/src/tools/custom-tool-adapter.js +190 -0
  306. package/dist/src/tools/custom-tool-adapter.js.map +1 -0
  307. package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
  308. package/dist/src/tools/custom-tool-adapter.test.js +243 -0
  309. package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
  310. package/dist/src/tools/dispatch-tool.d.ts +52 -0
  311. package/dist/src/tools/dispatch-tool.js +71 -0
  312. package/dist/src/tools/dispatch-tool.js.map +1 -0
  313. package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
  314. package/dist/src/tools/dispatch-tool.test.js +75 -0
  315. package/dist/src/tools/dispatch-tool.test.js.map +1 -0
  316. package/dist/src/tools/fetch-url-tool.d.ts +23 -0
  317. package/dist/src/tools/fetch-url-tool.js +333 -0
  318. package/dist/src/tools/fetch-url-tool.js.map +1 -0
  319. package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
  320. package/dist/src/tools/fetch-url-tool.test.js +228 -0
  321. package/dist/src/tools/fetch-url-tool.test.js.map +1 -0
  322. package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
  323. package/dist/src/tools/mcp-tool-adapter.js +135 -0
  324. package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
  325. package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
  326. package/dist/src/tools/mcp-tool-adapter.test.js +226 -0
  327. package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
  328. package/dist/src/tools/registry.d.ts +25 -0
  329. package/dist/src/tools/registry.js +72 -0
  330. package/dist/src/tools/registry.js.map +1 -0
  331. package/dist/src/tools/registry.test.d.ts +6 -0
  332. package/dist/src/tools/registry.test.js +120 -0
  333. package/dist/src/tools/registry.test.js.map +1 -0
  334. package/dist/src/tools/request-tool.d.ts +42 -0
  335. package/dist/src/tools/request-tool.js +190 -0
  336. package/dist/src/tools/request-tool.js.map +1 -0
  337. package/dist/src/tools/request-tool.test.d.ts +6 -0
  338. package/dist/src/tools/request-tool.test.js +253 -0
  339. package/dist/src/tools/request-tool.test.js.map +1 -0
  340. package/dist/src/tools/store-tools.d.ts +29 -0
  341. package/dist/src/tools/store-tools.js +224 -0
  342. package/dist/src/tools/store-tools.js.map +1 -0
  343. package/dist/src/tools/store-tools.test.d.ts +6 -0
  344. package/dist/src/tools/store-tools.test.js +215 -0
  345. package/dist/src/tools/store-tools.test.js.map +1 -0
  346. package/dist/src/tools/types.d.ts +129 -0
  347. package/dist/src/tools/types.js +7 -0
  348. package/dist/src/tools/types.js.map +1 -0
  349. package/dist/src/tools/web-search-tool.d.ts +31 -0
  350. package/dist/src/tools/web-search-tool.js +170 -0
  351. package/dist/src/tools/web-search-tool.js.map +1 -0
  352. package/dist/src/tools/web-search-tool.test.d.ts +6 -0
  353. package/dist/src/tools/web-search-tool.test.js +153 -0
  354. package/dist/src/tools/web-search-tool.test.js.map +1 -0
  355. package/dist/src/tools/web-tools-shared.d.ts +21 -0
  356. package/dist/src/tools/web-tools-shared.js +32 -0
  357. package/dist/src/tools/web-tools-shared.js.map +1 -0
  358. package/dist/src/types.d.ts +40 -12
  359. package/dist/src/types.js +16 -2
  360. package/dist/src/types.js.map +1 -1
  361. package/dist/tsconfig.tsbuildinfo +1 -1
  362. package/package.json +27 -4
  363. package/dist/src/__tests__/sse-contract.test.js +0 -464
  364. package/dist/src/__tests__/sse-contract.test.js.map +0 -1
  365. package/dist/src/__tests__/tools.test.js +0 -583
  366. package/dist/src/__tests__/tools.test.js.map +0 -1
  367. package/dist/src/agent/agent-runner.d.ts +0 -33
  368. package/dist/src/agent/agent-runner.js +0 -1040
  369. package/dist/src/agent/agent-runner.js.map +0 -1
  370. package/dist/src/agent/custom-tools-e2e.test.d.ts +0 -6
  371. package/dist/src/agent/custom-tools-e2e.test.js +0 -566
  372. package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
  373. package/dist/src/agent/request-helper.d.ts +0 -16
  374. package/dist/src/agent/request-helper.js +0 -96
  375. package/dist/src/agent/request-helper.js.map +0 -1
  376. package/dist/src/agent/session-store.d.ts +0 -62
  377. package/dist/src/agent/session-store.js +0 -151
  378. package/dist/src/agent/session-store.js.map +0 -1
  379. package/dist/src/agent/stores-e2e.test.js +0 -433
  380. package/dist/src/agent/stores-e2e.test.js.map +0 -1
  381. package/dist/src/agent/tool-context-builder.d.ts +0 -11
  382. package/dist/src/agent/tool-context-builder.js +0 -102
  383. package/dist/src/agent/tool-context-builder.js.map +0 -1
  384. package/dist/src/agent/tool-context-builder.test.d.ts +0 -6
  385. package/dist/src/agent/tool-context-builder.test.js +0 -152
  386. package/dist/src/agent/tool-context-builder.test.js.map +0 -1
  387. package/dist/src/agent/write-repo-file.test.js +0 -270
  388. package/dist/src/agent/write-repo-file.test.js.map +0 -1
  389. package/dist/src/cron/heartbeat-runner.d.ts +0 -21
  390. package/dist/src/cron/heartbeat-runner.js +0 -79
  391. package/dist/src/cron/heartbeat-runner.js.map +0 -1
  392. package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
  393. package/dist/src/cron/heartbeat-runner.test.js +0 -120
  394. package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
  395. package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
  396. package/dist/src/cron/heartbeat-scheduler.js +0 -55
  397. package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
  398. package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
  399. package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
  400. package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
  401. package/dist/src/routes/ai-stream.test.d.ts +0 -6
  402. package/dist/src/routes/ai-stream.test.js +0 -586
  403. package/dist/src/routes/ai-stream.test.js.map +0 -1
  404. package/dist/src/routes/ask-user-response.d.ts +0 -30
  405. package/dist/src/routes/ask-user-response.js +0 -61
  406. package/dist/src/routes/ask-user-response.js.map +0 -1
  407. package/dist/src/routes/ask-user-response.test.d.ts +0 -6
  408. package/dist/src/routes/ask-user-response.test.js +0 -88
  409. package/dist/src/routes/ask-user-response.test.js.map +0 -1
  410. package/dist/src/routes/chat-stream.test.d.ts +0 -6
  411. package/dist/src/routes/chat-stream.test.js +0 -155
  412. package/dist/src/routes/chat-stream.test.js.map +0 -1
  413. package/dist/src/routes/chat.test.d.ts +0 -6
  414. package/dist/src/routes/chat.test.js +0 -99
  415. package/dist/src/routes/chat.test.js.map +0 -1
  416. package/dist/src/routes/widget-actions.d.ts +0 -49
  417. package/dist/src/routes/widget-actions.js +0 -78
  418. package/dist/src/routes/widget-actions.js.map +0 -1
  419. package/dist/src/session/admin-file-tools.d.ts +0 -136
  420. package/dist/src/session/admin-file-tools.js +0 -240
  421. package/dist/src/session/admin-file-tools.js.map +0 -1
  422. package/dist/src/session/custom-tool-adapter.d.ts +0 -74
  423. package/dist/src/session/custom-tool-adapter.js +0 -180
  424. package/dist/src/session/custom-tool-adapter.js.map +0 -1
  425. package/dist/src/session/history-converter.d.ts +0 -21
  426. package/dist/src/session/history-converter.js +0 -59
  427. package/dist/src/session/history-converter.js.map +0 -1
  428. package/dist/src/session/history-converter.test.d.ts +0 -6
  429. package/dist/src/session/history-converter.test.js +0 -130
  430. package/dist/src/session/history-converter.test.js.map +0 -1
  431. package/dist/src/session/session-manager.d.ts +0 -219
  432. package/dist/src/session/session-manager.js +0 -915
  433. package/dist/src/session/session-manager.js.map +0 -1
  434. package/dist/src/session/session-manager.test.d.ts +0 -6
  435. package/dist/src/session/session-manager.test.js +0 -455
  436. package/dist/src/session/session-manager.test.js.map +0 -1
  437. package/dist/src/session/session-runner.d.ts +0 -45
  438. package/dist/src/session/session-runner.js +0 -719
  439. package/dist/src/session/session-runner.js.map +0 -1
  440. package/dist/src/session/session-runner.test.d.ts +0 -6
  441. package/dist/src/session/session-runner.test.js +0 -834
  442. package/dist/src/session/session-runner.test.js.map +0 -1
  443. /package/dist/src/{__tests__/sse-contract.test.d.ts → __fixtures__/e2e.test.d.ts} +0 -0
  444. /package/dist/src/{__tests__/tools.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
  445. /package/dist/src/agent/{write-repo-file.test.d.ts → loop.test.d.ts} +0 -0
@@ -0,0 +1,88 @@
1
+ # Smoke Tests
2
+
3
+ End-to-end integration tests that start a real `amodal dev` server with mock REST and MCP backends, then run assertions against the chat API using a live LLM.
4
+
5
+ ## Setup
6
+
7
+ Create `.env.test` at the **repo root** with your API key:
8
+
9
+ ```
10
+ ANTHROPIC_API_KEY=sk-ant-...
11
+ ```
12
+
13
+ This file is gitignored. Tests skip automatically if the key isn't set.
14
+
15
+ ## Running
16
+
17
+ ```bash
18
+ # All smoke tests (~90s, ~23 LLM calls)
19
+ pnpm --filter @amodalai/runtime run test:smoke
20
+
21
+ # Single test by name (~5s, 1 LLM call)
22
+ pnpm --filter @amodalai/runtime run test:smoke -t "dispatch_task tool is available"
23
+
24
+ # Multiple tests by pattern
25
+ pnpm --filter @amodalai/runtime run test:smoke -t "dispatch_task|persists data"
26
+
27
+ # Regex patterns work too
28
+ pnpm --filter @amodalai/runtime run test:smoke -t "store.*persist"
29
+ ```
30
+
31
+ > **No `--` before `-t`.** pnpm passes trailing args directly to vitest. Adding `--` breaks the flag parsing.
32
+
33
+ The `-t` flag filters which `it()` blocks execute. The server still starts once (shared `beforeAll`), but only matched tests make LLM calls — so filtering saves both time and money.
34
+
35
+ ## What's tested
36
+
37
+ | # | Test | What it verifies |
38
+ | --- | ------------------ | ------------------------------------------------------ |
39
+ | 1 | health endpoint | Server starts and responds |
40
+ | 2 | config endpoint | Agent config loads from repo |
41
+ | 3 | system prompt (G9) | Prompt includes connections, skills, knowledge, stores |
42
+ | 4 | chat streaming | Init, text_delta, done events with usage |
43
+ | 5 | session resume | Multi-turn context preserved across messages |
44
+ | 6 | store tool call | Model calls query_store |
45
+ | 7 | connection request | Request tool hits mock-api |
46
+ | 8 | tool error status | Failed tool calls report status: error |
47
+ | 9 | eval run | Eval suite executes and scores |
48
+ | 10 | admin chat | Admin agent reads repo files |
49
+ | 11 | write intent (G8) | POST with intent "read" rejected |
50
+ | 12 | store persistence | Write + query in separate sessions |
51
+ | 13 | session isolation | Concurrent sessions don't share context |
52
+ | 14 | automation API | Automation endpoint responds |
53
+ | 15 | multi-turn tools | Tool call → reasoning about result |
54
+ | 16 | evals list | Eval suites listed from repo |
55
+ | 17 | inspect endpoint | Connection status visible |
56
+ | 18 | MCP tool call | MCP tool executes via stdio transport |
57
+ | 19 | custom tool | echo_tool with ctx.request + ctx.store |
58
+ | 20 | stop_execution | Tool is available to model |
59
+ | 21 | done usage (G2) | Done event always has token counts |
60
+ | 22 | dispatch_task | Child agent runs with tool subset |
61
+ | 23 | dispatch available | dispatch_task tool in model's tool list |
62
+
63
+ ## Architecture
64
+
65
+ ```
66
+ smoke.test.ts — test suite (vitest)
67
+ smoke-agent/ — self-contained agent repo (.amodal/ config)
68
+ amodal.json — agent config (name, model)
69
+ connections/ — mock-api (REST) + mock-mcp (MCP stdio)
70
+ stores/ — test-items store schema
71
+ skills/ — test-skill
72
+ knowledge/ — reference doc with tool list
73
+ tools/ — echo-tool custom handler
74
+ evals/ — basic-eval suite
75
+ automations/ — test-auto definition
76
+ smoke-rest-server.mjs — Express mock returning test data on :9901
77
+ smoke-mcp-server.mjs — MCP stdio server with search/lookup/count tools
78
+ ```
79
+
80
+ The test `beforeAll` starts the mock REST server and `createLocalServer()` programmatically on port 9900. Tests call `POST /chat` and parse SSE events from the response.
81
+
82
+ ## Web tools (`web_search`, `fetch_url`)
83
+
84
+ When `GOOGLE_API_KEY` is set in `.env.test`, `beforeAll` adds a `webTools` block to `amodal.json` so the agent registers the web tools alongside the existing ones. One additional test fires a real `web_search` call through whichever main provider `SMOKE_TARGET` selects — this exercises the cross-provider case (e.g. Anthropic main + Google-backed search). The web-tool test skips automatically when `GOOGLE_API_KEY` is absent.
85
+
86
+ ## LLM non-determinism
87
+
88
+ Some tests depend on the model calling specific tools. When the model chooses not to (despite explicit instruction), the test skips gracefully with a console warning rather than failing. This prevents flaky CI from LLM variability while still catching real code bugs.
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * End-to-end tests for the agent loop against real LLM providers.
8
+ * Exercises:
9
+ *
10
+ * - Token budget enforcement — the loop terminates with
11
+ * DoneReason='budget_exceeded' when cumulative tokens hit maxSessionTokens.
12
+ * - Summarizer hook — context eviction invokes summarizeToolResult
13
+ * and the generated summary flows into subsequent prompts.
14
+ *
15
+ * Parameterized over multiple providers. Select which to run via the
16
+ * E2E_TARGETS env var (comma-separated); defaults to `google`
17
+ * (gemini-2.5-flash) as the cheapest base model. Targets missing an
18
+ * API key auto-skip.
19
+ *
20
+ * E2E_TARGETS=google # base (default)
21
+ * E2E_TARGETS=anthropic # single provider
22
+ * E2E_TARGETS=google,anthropic,openai,groq # all
23
+ */
24
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
25
+ import { z } from 'zod';
26
+ import { StandaloneSessionManager } from '../session/manager.js';
27
+ import { createPGLiteSessionStore } from '../session/pglite-session-store.js';
28
+ import { createProvider } from '../providers/create-provider.js';
29
+ import { createToolRegistry } from '../tools/registry.js';
30
+ import { createLogger } from '../logger.js';
31
+ import { SSEEventType } from '../types.js';
32
+ import { loadTestEnv, defaultTargetName } from './test-env.js';
33
+ // Pull API keys out of <repo-root>/.env.test (gitignored) so targets
34
+ // whose keys are set can run; others auto-skip.
35
+ loadTestEnv();
36
+ const logger = createLogger({ component: 'test:e2e' });
37
+ const TARGETS = {
38
+ google: { provider: 'google', model: 'gemini-2.5-flash', apiKeyEnv: 'GOOGLE_API_KEY' },
39
+ anthropic: { provider: 'anthropic', model: 'claude-haiku-4-5-20251001', apiKeyEnv: 'ANTHROPIC_API_KEY' },
40
+ openai: { provider: 'openai', model: 'gpt-4o-mini', apiKeyEnv: 'OPENAI_API_KEY' },
41
+ groq: { provider: 'groq', model: 'llama-3.3-70b-versatile', apiKeyEnv: 'GROQ_API_KEY' },
42
+ };
43
+ // If E2E_TARGETS is unset, fall through the shared preference chain
44
+ // (google → anthropic → openai → groq) and pick the first target whose
45
+ // API key is configured.
46
+ const selected = (process.env['E2E_TARGETS'] ?? defaultTargetName(TARGETS))
47
+ .split(',')
48
+ .map((s) => s.trim())
49
+ .filter((s) => s.length > 0);
50
+ const activeTargets = selected
51
+ .map((name) => [name, TARGETS[name]])
52
+ .filter((entry) => {
53
+ const [name, cfg] = entry;
54
+ if (!cfg) {
55
+ // eslint-disable-next-line no-console
56
+ console.warn(`[e2e] unknown target "${name}" — skipped. Known: ${Object.keys(TARGETS).join(', ')}`);
57
+ return false;
58
+ }
59
+ if (!process.env[cfg.apiKeyEnv]) {
60
+ // eslint-disable-next-line no-console
61
+ console.warn(`[e2e] ${name}: ${cfg.apiKeyEnv} not set — skipped`);
62
+ return false;
63
+ }
64
+ return true;
65
+ });
66
+ const allowAll = {
67
+ check: () => ({ allowed: true }),
68
+ };
69
+ /** Echo tool — returns a plain string so the model sees a clear result. */
70
+ function makeEchoTool() {
71
+ return {
72
+ description: 'Echoes back the input value. Use this whenever the user asks you to echo something.',
73
+ parameters: z.object({ value: z.string() }),
74
+ execute: (params) => Promise.resolve(`echoed: ${params.value}`),
75
+ readOnly: true,
76
+ metadata: { category: 'custom' },
77
+ };
78
+ }
79
+ function buildRegistry() {
80
+ const registry = createToolRegistry();
81
+ registry.register('echo_tool', makeEchoTool());
82
+ return registry;
83
+ }
84
+ describe.skipIf(activeTargets.length === 0)('e2e', () => {
85
+ let store;
86
+ let mgr;
87
+ beforeAll(async () => {
88
+ store = await createPGLiteSessionStore({ logger });
89
+ mgr = new StandaloneSessionManager({ logger, store });
90
+ mgr.start();
91
+ });
92
+ afterAll(async () => {
93
+ await mgr.shutdown();
94
+ await store.close();
95
+ });
96
+ describe.each(activeTargets)('[%s]', (_name, target) => {
97
+ it('terminates with budget_exceeded when maxSessionTokens cap is hit', async () => {
98
+ const provider = createProvider({
99
+ provider: target.provider,
100
+ model: target.model,
101
+ apiKey: process.env[target.apiKeyEnv],
102
+ });
103
+ // Tiny budget — any first-turn input+output will blow past this,
104
+ // causing budget_exceeded to fire on the next outer-loop check.
105
+ // Small enough that every provider trips regardless of how terse
106
+ // the model chooses to be.
107
+ const MAX_TOKENS = 200;
108
+ const session = mgr.create({
109
+ provider,
110
+ toolRegistry: buildRegistry(),
111
+ permissionChecker: allowAll,
112
+ systemPrompt: 'You are a terse assistant. Use the echo_tool when asked.',
113
+ maxTurns: 10,
114
+ maxSessionTokens: MAX_TOKENS,
115
+ });
116
+ const events = [];
117
+ for await (const event of mgr.runMessage(session.id, 'Echo these strings one at a time: alpha, bravo, charlie, delta, echo, foxtrot. Use echo_tool for each.', { signal: AbortSignal.timeout(60_000) })) {
118
+ events.push(event);
119
+ }
120
+ const done = events.find((e) => e.type === SSEEventType.Done);
121
+ expect(done).toBeDefined();
122
+ if (done && done.type === SSEEventType.Done) {
123
+ expect(done.reason).toBe('budget_exceeded');
124
+ expect(done.usage?.total_tokens ?? 0).toBeGreaterThanOrEqual(MAX_TOKENS);
125
+ }
126
+ }, 90_000);
127
+ it('invokes summarizeToolResult hook when context is evicted', async () => {
128
+ const provider = createProvider({
129
+ provider: target.provider,
130
+ model: target.model,
131
+ apiKey: process.env[target.apiKeyEnv],
132
+ });
133
+ // Seed 20 tool-result messages so the default clearThreshold=15 fires
134
+ // on the very first turn. Messages are in pairs: an assistant tool-call
135
+ // followed by the tool result, matching the real shape. An initial
136
+ // user message is required to satisfy Anthropic's message-sequence
137
+ // validation (conversations must begin with user).
138
+ const seeded = [
139
+ { role: 'user', content: 'Please echo some seed values for me.' },
140
+ ];
141
+ for (let i = 0; i < 20; i++) {
142
+ seeded.push({
143
+ role: 'assistant',
144
+ content: [{
145
+ type: 'tool-call',
146
+ toolCallId: `c${i}`,
147
+ toolName: 'echo_tool',
148
+ input: { value: `seed-${i}` },
149
+ }],
150
+ });
151
+ seeded.push({
152
+ role: 'tool',
153
+ content: [{
154
+ type: 'tool-result',
155
+ toolCallId: `c${i}`,
156
+ toolName: 'echo_tool',
157
+ output: { type: 'text', value: `echoed: seed-${i} with more text to make this a non-trivial result body` },
158
+ }],
159
+ });
160
+ }
161
+ const session = mgr.create({
162
+ provider,
163
+ toolRegistry: buildRegistry(),
164
+ permissionChecker: allowAll,
165
+ systemPrompt: 'You are a terse assistant. Answer in one short sentence.',
166
+ maxTurns: 2,
167
+ messages: seeded,
168
+ });
169
+ // Recording summarizer — captures calls to verify hook plumbing.
170
+ const summarizerCalls = [];
171
+ const summarizer = (opts) => {
172
+ summarizerCalls.push({
173
+ toolName: opts.toolName,
174
+ content: opts.content,
175
+ hasSignal: opts.signal instanceof AbortSignal,
176
+ });
177
+ return Promise.resolve('3 items echoed');
178
+ };
179
+ const events = [];
180
+ for await (const event of mgr.runMessage(session.id, 'Briefly say "done".', {
181
+ signal: AbortSignal.timeout(60_000),
182
+ summarizeToolResult: summarizer,
183
+ })) {
184
+ events.push(event);
185
+ }
186
+ // clearThreshold=15, keepRecent=5 → 15 messages should be cleared and
187
+ // the summarizer should be called for each (none are pre-cleared).
188
+ expect(summarizerCalls.length).toBe(15);
189
+ // Every call should have received a real AbortSignal
190
+ for (const call of summarizerCalls) {
191
+ expect(call.hasSignal).toBe(true);
192
+ expect(call.toolName).toBe('echo_tool');
193
+ expect(call.content).toContain('echoed:');
194
+ }
195
+ // The session should have terminated normally (model responded)
196
+ const done = events.find((e) => e.type === SSEEventType.Done);
197
+ expect(done).toBeDefined();
198
+ // Session messages should now contain the summary marker in the cleared positions
199
+ const clearedWithSummary = session.messages.filter((msg) => msg.role === 'tool' &&
200
+ Array.isArray(msg.content) &&
201
+ msg.content.some((part) => 'output' in part &&
202
+ part.output &&
203
+ typeof part.output === 'object' &&
204
+ 'value' in part.output &&
205
+ typeof part.output.value === 'string' &&
206
+ part.output.value.includes('3 items echoed')));
207
+ expect(clearedWithSummary.length).toBe(15);
208
+ }, 90_000);
209
+ });
210
+ });
211
+ //# sourceMappingURL=e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e.test.js","sourceRoot":"","sources":["../../../src/__fixtures__/e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "smoke-test-agent",
3
+ "version": "1.0.0",
4
+ "description": "Self-contained agent for smoke testing the runtime",
5
+ "models": {
6
+ "main": {
7
+ "provider": "anthropic",
8
+ "model": "claude-sonnet-4-20250514"
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "title": "Delivery Callback Test",
3
+ "trigger": "manual",
4
+ "prompt": "Reply with just this JSON object: {\"status\":\"done\",\"count\":7}",
5
+ "delivery": {
6
+ "targets": [{ "type": "callback" }],
7
+ "template": "Automation {{automation}} finished with count={{count}}"
8
+ }
9
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ name: test-automation
3
+ trigger: manual
4
+ prompt: "Say 'automation ran successfully' and nothing else."
5
+ ---
@@ -0,0 +1,11 @@
1
+ {
2
+ "endpoints": {
3
+ "GET /items": {
4
+ "returns": ["id", "name", "status"]
5
+ },
6
+ "POST /items": {
7
+ "returns": ["id"],
8
+ "confirm": true
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "protocol": "rest",
3
+ "baseUrl": "http://localhost:9901"
4
+ }
@@ -0,0 +1,9 @@
1
+ ## Included
2
+
3
+ ### GET /items
4
+
5
+ List all items. Returns `[{id, name, status}]`.
6
+
7
+ ### POST /items
8
+
9
+ Create a new item. Body: `{name, status}`. Returns `{id, name, status}`.
@@ -0,0 +1,8 @@
1
+ {
2
+ "protocol": "mcp",
3
+ "transport": "stdio",
4
+ "command": "node",
5
+ "args": [
6
+ "/Users/bobbaxley/code/amodal-parallel-tools/packages/runtime/src/__fixtures__/smoke-mcp-server.mjs"
7
+ ]
8
+ }
@@ -0,0 +1,12 @@
1
+ # Eval: Basic Smoke
2
+
3
+ Test that the agent can respond to a simple question.
4
+
5
+ ## Query
6
+
7
+ "What is 2 + 2?"
8
+
9
+ ## Assertions
10
+
11
+ - Should contain the number 4
12
+ - Should NOT contain the word "maybe"
@@ -0,0 +1,3 @@
1
+ # Smoke Test Reference
2
+
3
+ This is reference knowledge for the smoke test agent. It verifies that knowledge documents are included in the system prompt.
@@ -0,0 +1,11 @@
1
+ # Skill: test-skill
2
+
3
+ Trigger: When asked to run the smoke test
4
+
5
+ ## Test Skill
6
+
7
+ Query the mock-api connection for items and store the results.
8
+
9
+ 1. Use the request tool to GET /items from mock-api
10
+ 2. Store each item in the test-items store
11
+ 3. Report what you found
@@ -0,0 +1,11 @@
1
+ {
2
+ "entity": {
3
+ "name": "TestItem",
4
+ "key": "{item_id}",
5
+ "schema": {
6
+ "item_id": { "type": "string" },
7
+ "name": { "type": "string" },
8
+ "status": { "type": "enum", "values": ["active", "archived"] }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export default function (params: {
7
+ message: string;
8
+ }, ctx: {
9
+ request: (conn: string, endpoint: string, params?: unknown) => Promise<unknown>;
10
+ store: (name: string, payload: Record<string, unknown>) => Promise<{
11
+ key: string;
12
+ }>;
13
+ log: (msg: string) => void;
14
+ }): Promise<{
15
+ echoed: string;
16
+ itemCount: number;
17
+ storedKey: string;
18
+ }>;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export default async function (params, ctx) {
7
+ ctx.log(`echo_tool called with: ${params.message}`);
8
+ // Test ctx.request() — fetch from mock-api
9
+ const items = await ctx.request('mock-api', '/items');
10
+ // Test ctx.store() — write to test-items store
11
+ const storeResult = await ctx.store('test-items', {
12
+ item_id: 'echo-test',
13
+ name: params.message,
14
+ status: 'active',
15
+ });
16
+ return {
17
+ echoed: params.message,
18
+ itemCount: Array.isArray(items) ? items.length : 0,
19
+ storedKey: storeResult.key,
20
+ };
21
+ }
22
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../../../src/__fixtures__/smoke-agent/tools/echo_tool/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,WAClB,MAAyB,EACzB,GAIC;IAED,GAAG,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpD,2CAA2C;IAC3C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtD,+CAA+C;IAC/C,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE;QAChD,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClD,SAAS,EAAE,WAAW,CAAC,GAAG;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "echo_tool",
3
+ "description": "Echo a message, fetch from mock API, and write to store. Used for smoke testing custom tool wiring.",
4
+ "parameters": {
5
+ "type": "object",
6
+ "properties": {
7
+ "message": {
8
+ "type": "string",
9
+ "description": "Message to echo back"
10
+ }
11
+ },
12
+ "required": ["message"]
13
+ },
14
+ "confirm": true,
15
+ "timeout": 10000,
16
+ "env": []
17
+ }