@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,71 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * Dispatch tool.
8
+ *
9
+ * Allows the model to delegate a sub-task to a child agent with a
10
+ * subset of tools. The EXECUTING state handler intercepts this tool
11
+ * by name and transitions to DISPATCHING — the execute() function
12
+ * here is a safety net that should never be reached.
13
+ *
14
+ * Circular dependency avoidance: this file does NOT import from
15
+ * the agent loop. The dispatch tool is just a schema definition.
16
+ * The actual child agent execution lives in states/dispatching.ts.
17
+ */
18
+ import { z } from 'zod';
19
+ import { ToolExecutionError } from '../errors.js';
20
+ // ---------------------------------------------------------------------------
21
+ // Constants
22
+ // ---------------------------------------------------------------------------
23
+ export const DISPATCH_TOOL_NAME = 'dispatch_task';
24
+ const DEFAULT_CHILD_MAX_TURNS = 10;
25
+ // ---------------------------------------------------------------------------
26
+ // Schema
27
+ // ---------------------------------------------------------------------------
28
+ const DispatchParamsSchema = z.object({
29
+ /** Name for the child agent (used in SSE events and logging) */
30
+ agent_name: z.string().describe('A short descriptive name for the sub-agent (e.g. "data-fetcher", "entity-profiler")'),
31
+ /** Which tools the child agent can use (must be a subset of available tools) */
32
+ tools: z.array(z.string()).describe('List of tool names the child agent can use'),
33
+ /** The task prompt for the child agent */
34
+ prompt: z.string().describe('The task description for the child agent to complete'),
35
+ /** Max turns for the child agent (default: 10) */
36
+ max_turns: z.number().int().positive().optional().describe('Maximum number of LLM turns the child agent can take'),
37
+ });
38
+ // ---------------------------------------------------------------------------
39
+ // Tool definition
40
+ // ---------------------------------------------------------------------------
41
+ /**
42
+ * Create the dispatch_task tool definition.
43
+ *
44
+ * The tool is intercepted by the EXECUTING state handler before execute()
45
+ * is called. The EXECUTING handler reads the args, strips dispatch_task
46
+ * from the child's tool list (preventing recursion), and transitions to
47
+ * DISPATCHING state.
48
+ */
49
+ export function createDispatchTool() {
50
+ return {
51
+ description: `Delegate a sub-task to a child agent that runs independently with its own tool set. Use this when a task can be broken into parallel or sequential sub-tasks, each requiring specific tools. The child agent completes its task and returns a text summary.
52
+
53
+ The child agent has access only to the tools you specify — choose the minimum set needed. The child cannot dispatch further sub-agents.
54
+
55
+ Use dispatch_task when:
56
+ - A task involves multiple independent data-gathering steps
57
+ - You need to query different connections in parallel
58
+ - A sub-task is self-contained and doesn't need conversation context`,
59
+ parameters: DispatchParamsSchema,
60
+ readOnly: false,
61
+ metadata: { category: 'system' },
62
+ async execute() {
63
+ // The EXECUTING state handler intercepts dispatch_task by name and
64
+ // transitions to DISPATCHING. If execute() is called directly, the
65
+ // interception was bypassed — this is a bug.
66
+ throw new ToolExecutionError('dispatch_task must be intercepted by the EXECUTING state handler — direct execution is not supported', { toolName: DISPATCH_TOOL_NAME, callId: 'unknown', context: {} });
67
+ },
68
+ };
69
+ }
70
+ export { DEFAULT_CHILD_MAX_TURNS };
71
+ //# sourceMappingURL=dispatch-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-tool.js","sourceRoot":"","sources":["../../../src/tools/dispatch-tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAEhD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAElD,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,gEAAgE;IAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qFAAqF,CAAC;IACtH,gFAAgF;IAChF,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACjF,0CAA0C;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IACnF,kDAAkD;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;CACnH,CAAC,CAAC;AAIH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,WAAW,EAAE;;;;;;;qEAOoD;QAEjE,UAAU,EAAE,oBAAoB;QAEhC,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAC;QAE9B,KAAK,CAAC,OAAO;YACX,mEAAmE;YACnE,mEAAmE;YACnE,6CAA6C;YAC7C,MAAM,IAAI,kBAAkB,CAC1B,sGAAsG,EACtG,EAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAC,CAC/D,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAC,uBAAuB,EAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { createDispatchTool, DISPATCH_TOOL_NAME, DEFAULT_CHILD_MAX_TURNS } from './dispatch-tool.js';
8
+ import { ToolExecutionError } from '../errors.js';
9
+ describe('dispatch-tool', () => {
10
+ it('has the correct tool name constant', () => {
11
+ expect(DISPATCH_TOOL_NAME).toBe('dispatch_task');
12
+ });
13
+ it('has a sensible default child max turns', () => {
14
+ expect(DEFAULT_CHILD_MAX_TURNS).toBe(10);
15
+ });
16
+ it('creates a tool definition with Zod schema', () => {
17
+ const tool = createDispatchTool();
18
+ expect(tool.description).toContain('child agent');
19
+ expect(tool.readOnly).toBe(false);
20
+ expect(tool.metadata?.category).toBe('system');
21
+ // Zod schema should have safeParse
22
+ expect('safeParse' in tool.parameters).toBe(true);
23
+ });
24
+ it('validates correct parameters', () => {
25
+ const tool = createDispatchTool();
26
+ const schema = tool.parameters;
27
+ if ('safeParse' in schema) {
28
+ const result = schema.safeParse({
29
+ agent_name: 'data-fetcher',
30
+ tools: ['request', 'query_store'],
31
+ prompt: 'Fetch the latest metrics',
32
+ });
33
+ expect(result.success).toBe(true);
34
+ }
35
+ });
36
+ it('validates parameters with optional max_turns', () => {
37
+ const tool = createDispatchTool();
38
+ const schema = tool.parameters;
39
+ if ('safeParse' in schema) {
40
+ const result = schema.safeParse({
41
+ agent_name: 'profiler',
42
+ tools: ['request'],
43
+ prompt: 'Profile the entity',
44
+ max_turns: 5,
45
+ });
46
+ expect(result.success).toBe(true);
47
+ }
48
+ });
49
+ it('rejects missing required fields', () => {
50
+ const tool = createDispatchTool();
51
+ const schema = tool.parameters;
52
+ if ('safeParse' in schema) {
53
+ const result = schema.safeParse({ agent_name: 'test' });
54
+ expect(result.success).toBe(false);
55
+ }
56
+ });
57
+ it('rejects invalid max_turns', () => {
58
+ const tool = createDispatchTool();
59
+ const schema = tool.parameters;
60
+ if ('safeParse' in schema) {
61
+ const result = schema.safeParse({
62
+ agent_name: 'test',
63
+ tools: [],
64
+ prompt: 'do thing',
65
+ max_turns: -1,
66
+ });
67
+ expect(result.success).toBe(false);
68
+ }
69
+ });
70
+ it('execute throws ToolExecutionError (should never be called directly)', async () => {
71
+ const tool = createDispatchTool();
72
+ await expect(tool.execute({}, {})).rejects.toThrow(ToolExecutionError);
73
+ });
74
+ });
75
+ //# sourceMappingURL=dispatch-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-tool.test.js","sourceRoot":"","sources":["../../../src/tools/dispatch-tool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { z } from 'zod';
7
+ import { FETCH_URL_TOOL_NAME } from '@amodalai/core';
8
+ import type { ToolDefinition } from './types.js';
9
+ export { FETCH_URL_TOOL_NAME };
10
+ declare const FetchUrlParamsSchema: z.ZodObject<{
11
+ url: z.ZodString;
12
+ prompt: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ url: string;
15
+ prompt?: string | undefined;
16
+ }, {
17
+ url: string;
18
+ prompt?: string | undefined;
19
+ }>;
20
+ type FetchUrlParams = z.infer<typeof FetchUrlParamsSchema>;
21
+ /** Reset rate-limit state (test helper). */
22
+ export declare function resetRateLimitForTesting(): void;
23
+ export declare function createFetchUrlTool(): ToolDefinition<FetchUrlParams>;
@@ -0,0 +1,333 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * fetch_url tool — grounded URL fetch via Gemini urlContext, with a local
8
+ * fetch + Readability fallback for internal URLs or Gemini failures.
9
+ *
10
+ * Flow:
11
+ * 1. If the URL targets a private network (localhost / RFC1918 / .local)
12
+ * OR `ctx.searchProvider` is unavailable, run the local fallback.
13
+ * 2. Otherwise try Gemini urlContext first. If that fails or returns
14
+ * empty content, fall through to the local fallback.
15
+ * 3. Local fallback uses linkedom + Mozilla Readability to extract the
16
+ * main content, then returns it as text/markdown.
17
+ *
18
+ * Per-hostname rate limiting: 10 requests / 60 seconds, in-memory.
19
+ */
20
+ import { Readability } from '@mozilla/readability';
21
+ import { parseHTML } from 'linkedom';
22
+ import { z } from 'zod';
23
+ import { FETCH_URL_TOOL_NAME } from '@amodalai/core';
24
+ import { log } from '../logger.js';
25
+ import { ToolExecutionError } from '../errors.js';
26
+ import { truncateToTokens, MAX_WEB_TOOL_RESULT_TOKENS } from './web-tools-shared.js';
27
+ export { FETCH_URL_TOOL_NAME };
28
+ // ---------------------------------------------------------------------------
29
+ // Constants
30
+ // ---------------------------------------------------------------------------
31
+ /** Timeout for the local fetch fallback (ms). */
32
+ const LOCAL_FETCH_TIMEOUT_MS = 10_000;
33
+ /** Max response body size for the local fetch fallback (bytes). */
34
+ const LOCAL_FETCH_MAX_BYTES = 1_000_000;
35
+ /** Rate-limit window size (ms). */
36
+ const RATE_LIMIT_WINDOW_MS = 60_000;
37
+ /** Max requests per hostname per window. */
38
+ const RATE_LIMIT_MAX_REQUESTS = 10;
39
+ // ---------------------------------------------------------------------------
40
+ // Internal error type for the local fetch path
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * Internal signaling error thrown by `fetchLocally()`. Always caught and
44
+ * re-wrapped in `ToolExecutionError` at the tool boundary — it never escapes
45
+ * the module. Carrying the hostname/status/size on the error lets the
46
+ * wrapping layer include that context in the structured error response.
47
+ */
48
+ class LocalFetchError extends Error {
49
+ context;
50
+ constructor(message, context) {
51
+ super(message);
52
+ this.name = 'LocalFetchError';
53
+ this.context = context;
54
+ }
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Params schema
58
+ // ---------------------------------------------------------------------------
59
+ const FetchUrlParamsSchema = z.object({
60
+ url: z
61
+ .string()
62
+ .url()
63
+ .describe('Absolute URL to fetch. Must be http:// or https://.'),
64
+ prompt: z
65
+ .string()
66
+ .optional()
67
+ .describe('Optional extraction prompt: what specifically to pull from the page. When omitted, the full page is rendered as markdown.'),
68
+ });
69
+ // ---------------------------------------------------------------------------
70
+ // Rate limiter (per-hostname sliding window)
71
+ // ---------------------------------------------------------------------------
72
+ const hostRequestTimestamps = new Map();
73
+ function checkRateLimit(hostname) {
74
+ const now = Date.now();
75
+ const cutoff = now - RATE_LIMIT_WINDOW_MS;
76
+ const timestamps = (hostRequestTimestamps.get(hostname) ?? []).filter((t) => t > cutoff);
77
+ if (timestamps.length >= RATE_LIMIT_MAX_REQUESTS) {
78
+ const oldest = timestamps[0] ?? now;
79
+ return { ok: false, retryAtMs: oldest + RATE_LIMIT_WINDOW_MS };
80
+ }
81
+ timestamps.push(now);
82
+ hostRequestTimestamps.set(hostname, timestamps);
83
+ return { ok: true };
84
+ }
85
+ /** Reset rate-limit state (test helper). */
86
+ export function resetRateLimitForTesting() {
87
+ hostRequestTimestamps.clear();
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Private network detection
91
+ // ---------------------------------------------------------------------------
92
+ const PRIVATE_IPV4_PREFIXES = ['10.', '192.168.'];
93
+ function isPrivateNetworkHost(hostname) {
94
+ const lower = hostname.toLowerCase();
95
+ if (lower === 'localhost' || lower.endsWith('.local') || lower.endsWith('.localhost')) {
96
+ return true;
97
+ }
98
+ if (lower === '127.0.0.1' || lower === '::1' || lower === '[::1]') {
99
+ return true;
100
+ }
101
+ if (lower.startsWith('127.'))
102
+ return true;
103
+ for (const prefix of PRIVATE_IPV4_PREFIXES) {
104
+ if (lower.startsWith(prefix))
105
+ return true;
106
+ }
107
+ // 172.16.0.0 – 172.31.255.255
108
+ if (lower.startsWith('172.')) {
109
+ const parts = lower.split('.');
110
+ const second = parts[1];
111
+ if (second !== undefined) {
112
+ const n = Number(second);
113
+ if (Number.isInteger(n) && n >= 16 && n <= 31)
114
+ return true;
115
+ }
116
+ }
117
+ return false;
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // Local fetch + Readability fallback
121
+ // ---------------------------------------------------------------------------
122
+ async function fetchLocally(url, signal) {
123
+ const combinedSignal = AbortSignal.any([signal, AbortSignal.timeout(LOCAL_FETCH_TIMEOUT_MS)]);
124
+ const response = await fetch(url, {
125
+ signal: combinedSignal,
126
+ headers: {
127
+ 'User-Agent': 'Amodal/fetch_url',
128
+ 'Accept': 'text/html,application/xhtml+xml,text/plain;q=0.9,*/*;q=0.5',
129
+ },
130
+ redirect: 'follow',
131
+ });
132
+ if (!response.ok) {
133
+ throw new LocalFetchError(`HTTP ${String(response.status)} ${response.statusText}`, {
134
+ url,
135
+ status: response.status,
136
+ statusText: response.statusText,
137
+ });
138
+ }
139
+ // Enforce size limit while reading. `content-length` can be absent
140
+ // (chunked responses), so we also stream-check via the returned bytes.
141
+ const contentLength = response.headers.get('content-length');
142
+ if (contentLength !== null) {
143
+ const declared = Number(contentLength);
144
+ if (Number.isFinite(declared) && declared > LOCAL_FETCH_MAX_BYTES) {
145
+ throw new LocalFetchError(`Response too large: ${String(declared)} bytes (limit ${String(LOCAL_FETCH_MAX_BYTES)})`, { url, declaredBytes: declared, limit: LOCAL_FETCH_MAX_BYTES });
146
+ }
147
+ }
148
+ const buffer = await response.arrayBuffer();
149
+ if (buffer.byteLength > LOCAL_FETCH_MAX_BYTES) {
150
+ throw new LocalFetchError(`Response too large: ${String(buffer.byteLength)} bytes (limit ${String(LOCAL_FETCH_MAX_BYTES)})`, { url, actualBytes: buffer.byteLength, limit: LOCAL_FETCH_MAX_BYTES });
151
+ }
152
+ const html = new TextDecoder('utf-8', { fatal: false }).decode(buffer);
153
+ return extractWithReadability(html, url);
154
+ }
155
+ function extractWithReadability(html, url) {
156
+ const { document } = parseHTML(html);
157
+ // linkedom returns a linkedom-typed `Document`; Readability declares the
158
+ // DOM-lib `Document` type. They are structurally compatible at runtime.
159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linkedom→DOM boundary for Readability
160
+ const article = new Readability(document).parse();
161
+ if (article?.textContent && article.textContent.trim().length > 0) {
162
+ const title = article.title ? `# ${article.title}\n\n` : '';
163
+ return `${title}${article.textContent.trim()}\n\n_Source: ${url}_`;
164
+ }
165
+ // Readability couldn't extract — fall back to walking the parsed DOM.
166
+ // We use the DOM's own structure (via linkedom) instead of regex-based
167
+ // tag stripping, which is both safer and simpler: scripts/styles are
168
+ // removed structurally, entities are already decoded by the parser, and
169
+ // there is no risk of partial-match reinjection. This path runs only
170
+ // when Readability returns nothing useful.
171
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- linkedom's Document types are loose
172
+ const doc = document;
173
+ // Remove non-content elements whose textContent would otherwise be
174
+ // concatenated into the output (scripts, styles, embedded templates).
175
+ const nonContent = doc.querySelectorAll('script, style, noscript, template');
176
+ for (const el of nonContent) {
177
+ el.remove();
178
+ }
179
+ const rawText = doc.body?.textContent ?? doc.textContent ?? '';
180
+ const text = rawText.replace(/\s+/g, ' ').trim();
181
+ return `${text}\n\n_Source: ${url}_`;
182
+ }
183
+ function parseAndClassify(rawUrl) {
184
+ // URL constructor throws on malformed input — validated upstream by Zod,
185
+ // but we re-parse here to extract hostname.
186
+ const parsed = new URL(rawUrl);
187
+ return {
188
+ hostname: parsed.hostname,
189
+ isPrivate: isPrivateNetworkHost(parsed.hostname),
190
+ };
191
+ }
192
+ // ---------------------------------------------------------------------------
193
+ // Primary path (Gemini urlContext)
194
+ // ---------------------------------------------------------------------------
195
+ async function fetchViaSearchProvider(provider, url, userPrompt, signal) {
196
+ const result = await provider.fetchUrl(url, {
197
+ ...(userPrompt ? { prompt: userPrompt } : {}),
198
+ signal,
199
+ });
200
+ return result.text;
201
+ }
202
+ // ---------------------------------------------------------------------------
203
+ // Factory
204
+ // ---------------------------------------------------------------------------
205
+ export function createFetchUrlTool() {
206
+ return {
207
+ description: `Fetch the content of a specific URL. Returns the page content as markdown. Use when you need the actual content of a web page, documentation, or API response you already know the URL for.
208
+
209
+ When to use:
210
+ - You have a specific URL the user referenced or web_search surfaced
211
+ - You need the full content of a documentation page or article
212
+ - Retrieving a raw text or JSON resource
213
+
214
+ When NOT to use:
215
+ - Searching — use web_search
216
+ - Hitting a configured API connection — use the request tool
217
+ - The URL is a user-protected resource (auth/cookies required)`,
218
+ parameters: FetchUrlParamsSchema,
219
+ readOnly: true,
220
+ metadata: { category: 'system' },
221
+ async execute(params, ctx) {
222
+ const started = Date.now();
223
+ const { url, prompt } = params;
224
+ let parsed;
225
+ try {
226
+ parsed = parseAndClassify(url);
227
+ }
228
+ catch (err) {
229
+ return {
230
+ status: 'error',
231
+ content: `Invalid URL: ${err instanceof Error ? err.message : 'parse failed'}`,
232
+ };
233
+ }
234
+ const protocol = new URL(url).protocol;
235
+ if (protocol !== 'http:' && protocol !== 'https:') {
236
+ return {
237
+ status: 'error',
238
+ content: `Only http:// and https:// URLs are supported (got ${protocol}).`,
239
+ };
240
+ }
241
+ // Rate limit check
242
+ const limitCheck = checkRateLimit(parsed.hostname);
243
+ if (!limitCheck.ok) {
244
+ const retryInSec = Math.max(1, Math.ceil(((limitCheck.retryAtMs ?? Date.now()) - Date.now()) / 1000));
245
+ log.warn('fetch_url_rate_limited', {
246
+ session: ctx.sessionId,
247
+ hostname: parsed.hostname,
248
+ retry_in_sec: retryInSec,
249
+ });
250
+ return {
251
+ status: 'error',
252
+ content: `Rate limited for ${parsed.hostname}. Try again in ${String(retryInSec)}s.`,
253
+ };
254
+ }
255
+ // Decide path. The condition narrows `ctx.searchProvider` inside the
256
+ // primary branch so we can use it without a non-null assertion.
257
+ let usedFallback = false;
258
+ let text;
259
+ if (!parsed.isPrivate && ctx.searchProvider) {
260
+ const provider = ctx.searchProvider;
261
+ try {
262
+ text = await fetchViaSearchProvider(provider, url, prompt, ctx.signal);
263
+ // Empty response from Gemini → try local
264
+ if (!text || text.trim().length === 0) {
265
+ text = await fetchLocally(url, ctx.signal);
266
+ usedFallback = true;
267
+ }
268
+ }
269
+ catch (primaryErr) {
270
+ log.warn('fetch_url_primary_failed', {
271
+ session: ctx.sessionId,
272
+ hostname: parsed.hostname,
273
+ error: primaryErr instanceof Error ? primaryErr.message : String(primaryErr),
274
+ });
275
+ try {
276
+ text = await fetchLocally(url, ctx.signal);
277
+ usedFallback = true;
278
+ }
279
+ catch (fallbackErr) {
280
+ log.error('fetch_url_failed', {
281
+ session: ctx.sessionId,
282
+ hostname: parsed.hostname,
283
+ duration_ms: Date.now() - started,
284
+ path: 'fallback',
285
+ error: fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr),
286
+ });
287
+ throw new ToolExecutionError('fetch_url failed (primary + fallback)', {
288
+ toolName: FETCH_URL_TOOL_NAME,
289
+ callId: ctx.sessionId,
290
+ cause: fallbackErr,
291
+ context: { primaryError: primaryErr instanceof Error ? primaryErr.message : String(primaryErr) },
292
+ });
293
+ }
294
+ }
295
+ }
296
+ else {
297
+ // Private network or no searchProvider configured — local only.
298
+ try {
299
+ text = await fetchLocally(url, ctx.signal);
300
+ usedFallback = true;
301
+ }
302
+ catch (err) {
303
+ log.error('fetch_url_failed', {
304
+ session: ctx.sessionId,
305
+ hostname: parsed.hostname,
306
+ duration_ms: Date.now() - started,
307
+ path: 'local',
308
+ error: err instanceof Error ? err.message : String(err),
309
+ });
310
+ throw new ToolExecutionError('fetch_url failed (local fetch)', {
311
+ toolName: FETCH_URL_TOOL_NAME,
312
+ callId: ctx.sessionId,
313
+ cause: err,
314
+ });
315
+ }
316
+ }
317
+ const content = truncateToTokens(text, MAX_WEB_TOOL_RESULT_TOKENS);
318
+ log.info('fetch_url', {
319
+ session: ctx.sessionId,
320
+ hostname: parsed.hostname,
321
+ duration_ms: Date.now() - started,
322
+ bytes: text.length,
323
+ used_fallback: usedFallback,
324
+ });
325
+ return {
326
+ status: 'ok',
327
+ content,
328
+ used_fallback: usedFallback,
329
+ };
330
+ },
331
+ };
332
+ }
333
+ //# sourceMappingURL=fetch-url-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-url-tool.js","sourceRoot":"","sources":["../../../src/tools/fetch-url-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 {};