@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,169 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * STREAMING state handler.
8
+ *
9
+ * Consumes the provider's fullStream, emits text deltas to the client,
10
+ * collects tool calls, and tracks token usage. Pre-executes read-only
11
+ * tools while the LLM might still be generating.
12
+ *
13
+ * Transitions:
14
+ * - No tool calls → DONE (model_stop)
15
+ * - Tool calls collected → EXECUTING
16
+ * - Stream error → DONE (error)
17
+ */
18
+ import { SSEEventType } from '../../types.js';
19
+ import { executeTool } from './executing.js';
20
+ /**
21
+ * Handle the STREAMING state.
22
+ */
23
+ export async function handleStreaming(state, ctx) {
24
+ const effects = [];
25
+ const toolCalls = [...state.pendingToolCalls];
26
+ // Attach passive error handlers to the derived promises BEFORE iterating
27
+ // fullStream. The AI SDK's StreamTextResult exposes fullStream + text +
28
+ // usage as separate promises that share an underlying provider fetch.
29
+ // When ctx.signal aborts, the fetch rejects, fullStream's .next() throws,
30
+ // and this for-await propagates that throw — which means we may exit
31
+ // before `await state.stream.text` (line ~137) ever runs. Without these
32
+ // handlers, the unawaited text/usage rejections escape as unhandled
33
+ // promise rejections and crash the process.
34
+ // These handlers are intentionally silent: the real error is surfaced
35
+ // either via a 'error' event on fullStream (caught below) or via the
36
+ // thrown stream error that propagates up the for-await to runAgent's
37
+ // caller's try/catch.
38
+ Promise.resolve(state.stream.text).catch(() => { });
39
+ Promise.resolve(state.stream.usage).catch(() => { });
40
+ // Consume the full stream
41
+ for await (const event of state.stream.fullStream) {
42
+ if (ctx.signal.aborted)
43
+ break;
44
+ switch (event.type) {
45
+ case 'text-delta': {
46
+ effects.push({
47
+ type: SSEEventType.TextDelta,
48
+ content: event.textDelta,
49
+ timestamp: new Date().toISOString(),
50
+ });
51
+ break;
52
+ }
53
+ case 'tool-call': {
54
+ const call = {
55
+ toolCallId: event.toolCallId,
56
+ toolName: event.toolName,
57
+ args: event.args,
58
+ };
59
+ toolCalls.push(call);
60
+ // Pre-execute read-only tools while the model might still be generating
61
+ const toolDef = ctx.toolRegistry.get(event.toolName);
62
+ if (toolDef?.readOnly) {
63
+ const promise = executeTool(call, toolDef, ctx);
64
+ // Log but suppress rejection — errors are re-surfaced when awaited in EXECUTING.
65
+ // Without this, abort before reaching EXECUTING causes unhandled rejection.
66
+ promise.catch((err) => {
67
+ ctx.logger.debug('preexec_suppressed', {
68
+ tool: event.toolName,
69
+ callId: event.toolCallId,
70
+ error: err instanceof Error ? err.message : String(err),
71
+ });
72
+ });
73
+ ctx.preExecutionCache.set(event.toolCallId, promise);
74
+ }
75
+ break;
76
+ }
77
+ case 'finish': {
78
+ // Track token usage
79
+ const usage = event.usage;
80
+ ctx.usage.inputTokens += usage.inputTokens;
81
+ ctx.usage.outputTokens += usage.outputTokens;
82
+ ctx.usage.totalTokens += usage.inputTokens + usage.outputTokens;
83
+ if (usage.cachedInputTokens) {
84
+ ctx.usage.cachedInputTokens = (ctx.usage.cachedInputTokens ?? 0) + usage.cachedInputTokens;
85
+ }
86
+ if (usage.cacheCreationInputTokens) {
87
+ ctx.usage.cacheCreationInputTokens = (ctx.usage.cacheCreationInputTokens ?? 0) + usage.cacheCreationInputTokens;
88
+ }
89
+ // Fire onUsage hook (billing, metering)
90
+ if (ctx.onUsage) {
91
+ ctx.onUsage({
92
+ inputTokens: usage.inputTokens,
93
+ outputTokens: usage.outputTokens,
94
+ cachedInputTokens: usage.cachedInputTokens ?? 0,
95
+ cacheCreationInputTokens: usage.cacheCreationInputTokens ?? 0,
96
+ totalTokens: usage.inputTokens + usage.outputTokens,
97
+ turnNumber: ctx.turnCount,
98
+ });
99
+ }
100
+ break;
101
+ }
102
+ case 'tool-result':
103
+ // We don't pass execute functions to the AI SDK, so tool-result events
104
+ // should not arrive. If they do (provider auto-execution), ignore them —
105
+ // we handle tool execution ourselves in EXECUTING state.
106
+ break;
107
+ case 'error': {
108
+ ctx.logger.error('provider_stream_error', {
109
+ session: ctx.sessionId,
110
+ error: event.error instanceof Error ? event.error.message : String(event.error),
111
+ turn: ctx.turnCount,
112
+ });
113
+ effects.push({
114
+ type: SSEEventType.Error,
115
+ message: event.error instanceof Error ? event.error.message : String(event.error),
116
+ timestamp: new Date().toISOString(),
117
+ });
118
+ return {
119
+ next: { type: 'done', usage: { ...ctx.usage }, reason: 'error' },
120
+ effects,
121
+ };
122
+ }
123
+ default:
124
+ // Future stream event types — skip
125
+ break;
126
+ }
127
+ }
128
+ // Append assistant message to conversation (text + tool calls)
129
+ const text = await state.stream.text;
130
+ const assistantMessage = buildAssistantMessage(text, toolCalls);
131
+ ctx.messages = [...ctx.messages, assistantMessage];
132
+ // No tool calls → model is done
133
+ if (toolCalls.length === 0) {
134
+ return {
135
+ next: { type: 'done', usage: { ...ctx.usage }, reason: 'model_stop' },
136
+ effects,
137
+ };
138
+ }
139
+ // Tool calls → transition to EXECUTING
140
+ const [first, ...rest] = toolCalls;
141
+ return {
142
+ next: { type: 'executing', queue: rest, current: first, results: [] },
143
+ effects,
144
+ };
145
+ }
146
+ /**
147
+ * Build a ModelMessage for the assistant's response.
148
+ */
149
+ function buildAssistantMessage(text, toolCalls) {
150
+ // If text only, use string content shorthand
151
+ if (toolCalls.length === 0) {
152
+ return { role: 'assistant', content: text };
153
+ }
154
+ // Mix of text + tool calls — use content array
155
+ const content = [];
156
+ if (text) {
157
+ content.push({ type: 'text', text });
158
+ }
159
+ for (const call of toolCalls) {
160
+ content.push({
161
+ type: 'tool-call',
162
+ toolCallId: call.toolCallId,
163
+ toolName: call.toolName,
164
+ input: call.args,
165
+ });
166
+ }
167
+ return { role: 'assistant', content };
168
+ }
169
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../../src/agent/states/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { ThinkingState, AgentContext, TransitionResult } from '../loop-types.js';
7
+ /**
8
+ * Handle the THINKING state.
9
+ *
10
+ * Increments turnCount, checks for loops, clears old results,
11
+ * then initiates a streaming LLM call.
12
+ */
13
+ export declare function handleThinking(state: ThinkingState, ctx: AgentContext): Promise<TransitionResult>;
@@ -0,0 +1,450 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { SSEEventType } from '../../types.js';
7
+ /** Content markers for cleared tool results. Original toolCallId and
8
+ * toolName are preserved so assistant tool-calls still pair with their
9
+ * results (providers reject orphaned tool_use blocks). */
10
+ const CLEARED_TOOL_RESULT_TEXT = '[Tool result cleared to save context space]';
11
+ /** Prefix used on every cleared/summarized marker — lets us detect
12
+ * already-cleared messages idempotently. */
13
+ const CLEARED_TEXT_PREFIXES = ['[Tool result cleared', '[Summary of '];
14
+ /**
15
+ * Max length (chars) at which a summary-prefix match counts as
16
+ * "already cleared." A short marker is almost certainly one of ours;
17
+ * a long payload that happens to start with "[Summary of " is more
18
+ * likely legit tool output, so we re-summarize it rather than assume.
19
+ */
20
+ const CLEARED_MARKER_MAX_LEN = 500;
21
+ /**
22
+ * Handle the THINKING state.
23
+ *
24
+ * Increments turnCount, checks for loops, clears old results,
25
+ * then initiates a streaming LLM call.
26
+ */
27
+ export async function handleThinking(state, ctx) {
28
+ const effects = [];
29
+ // 1. Increment turn counter
30
+ ctx.turnCount++;
31
+ // 2. Loop detection — check before spending tokens on an LLM call
32
+ const loop = detectLoop(state.messages);
33
+ if (loop && loop.count >= ctx.config.maxLoopIterations) {
34
+ ctx.logger.warn('agent_loop_detected', {
35
+ session: ctx.sessionId,
36
+ tool: loop.toolName,
37
+ count: loop.count,
38
+ });
39
+ return {
40
+ next: { type: 'done', usage: { ...ctx.usage }, reason: 'loop_detected' },
41
+ effects: [{
42
+ type: SSEEventType.Error,
43
+ message: `Agent stuck in a loop: ${loop.toolName} called ${loop.count} times with similar parameters`,
44
+ timestamp: new Date().toISOString(),
45
+ }],
46
+ };
47
+ }
48
+ // Clear old tool result bodies and persist back to ctx. Without this
49
+ // writeback, every subsequent turn re-calls the summarizer hook for the
50
+ // same messages (expensive). Once a result is cleared, it stays cleared.
51
+ // Must happen before turn-specific warnings are appended, since warnings
52
+ // are local-to-this-turn and should not persist.
53
+ ctx.messages = await clearOldToolResults(state.messages, ctx);
54
+ let messages = ctx.messages;
55
+ // Purge any disabled-tool entries whose cooldown has expired, so a tool
56
+ // re-entering the tool set is available to the model again.
57
+ for (const [name, untilTurn] of ctx.disabledToolsUntilTurn) {
58
+ if (ctx.turnCount >= untilTurn)
59
+ ctx.disabledToolsUntilTurn.delete(name);
60
+ }
61
+ if (loop && loop.count >= ctx.config.loopEscalationThreshold) {
62
+ // Escalation tier: strongly nudge the model AND disable the looping
63
+ // tool for a cooldown window. Without the cooldown, the agent could
64
+ // immediately re-call the tool next turn, drop the loop count below
65
+ // threshold, and keep oscillating.
66
+ const cooldown = ctx.config.loopEscalationCooldownTurns;
67
+ const untilTurn = ctx.turnCount + cooldown;
68
+ ctx.disabledToolsUntilTurn.set(loop.toolName, untilTurn);
69
+ ctx.logger.warn('agent_loop_escalation', {
70
+ session: ctx.sessionId,
71
+ tool: loop.toolName,
72
+ count: loop.count,
73
+ cooldownTurns: cooldown,
74
+ disabledUntilTurn: untilTurn,
75
+ });
76
+ const escalationMessage = {
77
+ role: 'user',
78
+ content: `[System Notice — Escalation] You have called ${loop.toolName} ${loop.count} times with similar parameters and are not making progress. The ${loop.toolName} tool has been temporarily disabled for the next ${cooldown} turns — use a different tool or ask the user for help.`,
79
+ };
80
+ messages = [...messages, escalationMessage];
81
+ }
82
+ else if (loop && loop.count >= ctx.config.loopWarningThreshold) {
83
+ ctx.logger.info('agent_loop_warning', {
84
+ session: ctx.sessionId,
85
+ tool: loop.toolName,
86
+ count: loop.count,
87
+ });
88
+ const warningMessage = {
89
+ role: 'user',
90
+ content: `[System Notice — Warning] You have called ${loop.toolName} ${loop.count} times with similar parameters. Try a different approach.`,
91
+ };
92
+ messages = [...messages, warningMessage];
93
+ }
94
+ // 4. Build tool schemas for the AI SDK (strip execute functions — we handle
95
+ // execution ourselves in EXECUTING state with permission checks, SSE events, etc.)
96
+ // AI SDK v6 uses `inputSchema`, not `parameters`.
97
+ const allTools = ctx.toolRegistry.getTools();
98
+ const tools = {};
99
+ for (const [name, def] of Object.entries(allTools)) {
100
+ // Skip tools that escalation has disabled for a cooldown window.
101
+ const disabledUntil = ctx.disabledToolsUntilTurn.get(name);
102
+ if (disabledUntil !== undefined && ctx.turnCount < disabledUntil)
103
+ continue;
104
+ // ToolDefinition.parameters is either a Zod schema or FlexibleSchema —
105
+ // both are accepted by AI SDK as inputSchema.
106
+ tools[name] = {
107
+ description: def.description,
108
+ inputSchema: def.parameters,
109
+ };
110
+ }
111
+ ctx.logger.debug('agent_thinking_start', {
112
+ session: ctx.sessionId,
113
+ turn: ctx.turnCount,
114
+ messageCount: messages.length,
115
+ toolCount: Object.keys(tools).length,
116
+ });
117
+ // 5. Start streaming LLM call
118
+ const result = ctx.provider.streamText({
119
+ messages,
120
+ system: ctx.systemPrompt,
121
+ tools,
122
+ maxOutputTokens: ctx.config.maxOutputTokens,
123
+ abortSignal: ctx.signal,
124
+ });
125
+ return {
126
+ next: { type: 'streaming', stream: result, pendingToolCalls: [] },
127
+ effects,
128
+ };
129
+ }
130
+ /**
131
+ * Detect repeated tool calls in recent message history.
132
+ *
133
+ * Scans the last 16 messages for assistant tool-call content parts.
134
+ * Groups calls by tool name and checks for parameter similarity.
135
+ * A tool is considered looping when it has 3+ calls with similar
136
+ * parameters (same keys, same or similar values).
137
+ */
138
+ function detectLoop(messages) {
139
+ const recentMessages = messages.slice(-16);
140
+ // Collect tool calls with their serialized args for similarity checking
141
+ const callsByTool = new Map();
142
+ for (const msg of recentMessages) {
143
+ if (msg.role !== 'assistant' || typeof msg.content === 'string')
144
+ continue;
145
+ if (!Array.isArray(msg.content))
146
+ continue;
147
+ for (const part of msg.content) {
148
+ if ('type' in part && part.type === 'tool-call' && 'toolName' in part) {
149
+ const name = part.toolName;
150
+ const args = 'input' in part ? JSON.stringify(part.input) : '{}';
151
+ const existing = callsByTool.get(name) ?? [];
152
+ existing.push(args);
153
+ callsByTool.set(name, existing);
154
+ }
155
+ }
156
+ }
157
+ // Find the most repeated tool with similar parameters
158
+ let maxTool = null;
159
+ let maxCount = 0;
160
+ for (const [name, argsList] of callsByTool) {
161
+ // Count how many calls share similar parameters.
162
+ // Group by serialized args — exact duplicates are obvious loops.
163
+ // Also count near-duplicates where only values differ slightly.
164
+ const similarCount = countSimilarCalls(argsList);
165
+ if (similarCount > maxCount) {
166
+ maxTool = name;
167
+ maxCount = similarCount;
168
+ }
169
+ }
170
+ if (maxTool && maxCount >= 3) {
171
+ return { toolName: maxTool, count: maxCount };
172
+ }
173
+ return null;
174
+ }
175
+ /**
176
+ * Known pagination / iteration parameter names. Calls that differ ONLY
177
+ * in these keys are legitimate iteration (walking a file in chunks,
178
+ * paging through a result set) and must NOT count toward loop detection.
179
+ */
180
+ const PAGINATION_KEYS = new Set([
181
+ 'offset',
182
+ 'limit',
183
+ 'page',
184
+ 'start_line',
185
+ 'end_line',
186
+ 'cursor',
187
+ 'after',
188
+ 'before',
189
+ 'next_page_token',
190
+ 'page_token',
191
+ 'skip',
192
+ ]);
193
+ /**
194
+ * Count the size of the largest group of similar argument sets.
195
+ *
196
+ * Two arg sets are "similar" if they share the same keys and at least
197
+ * half their values are identical. This catches loops where the agent
198
+ * retries with slightly different parameters (e.g., changing a page number
199
+ * but keeping everything else the same).
200
+ *
201
+ * Exception: if two calls differ ONLY in pagination-ish keys (offset,
202
+ * limit, cursor, page, etc.), they represent legitimate iteration and
203
+ * are not counted as similar — otherwise read_repo_file pagination trips
204
+ * the detector after 3 offsets.
205
+ */
206
+ function countSimilarCalls(argsList) {
207
+ if (argsList.length <= 2)
208
+ return argsList.length;
209
+ // Fast path: if most are exact duplicates, just count those
210
+ const counts = new Map();
211
+ for (const args of argsList) {
212
+ counts.set(args, (counts.get(args) ?? 0) + 1);
213
+ }
214
+ const maxExact = Math.max(...counts.values());
215
+ if (maxExact >= 3)
216
+ return maxExact;
217
+ // Slow path: parse and compare keys/values for similarity
218
+ const parsed = [];
219
+ for (const args of argsList) {
220
+ try {
221
+ const obj = JSON.parse(args);
222
+ if (typeof obj === 'object' && obj !== null && !Array.isArray(obj)) {
223
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- JSON.parse returns unknown; narrowed to non-null non-array object above
224
+ parsed.push(obj);
225
+ }
226
+ }
227
+ catch {
228
+ // Unparseable — treat each as unique
229
+ }
230
+ }
231
+ if (parsed.length <= 2)
232
+ return argsList.length;
233
+ // Group by key set, then check value similarity within groups
234
+ const byKeys = new Map();
235
+ for (const obj of parsed) {
236
+ const keyStr = Object.keys(obj).sort().join(',');
237
+ const group = byKeys.get(keyStr) ?? [];
238
+ group.push(obj);
239
+ byKeys.set(keyStr, group);
240
+ }
241
+ let largestSimilarGroup = 0;
242
+ for (const group of byKeys.values()) {
243
+ if (group.length < 3)
244
+ continue;
245
+ // Within a key group, count pairs with >50% identical values
246
+ // Use first element as reference and count how many are similar to it.
247
+ // Pagination variants (differ only in offset/limit/cursor/etc.) don't
248
+ // count — they represent legitimate iteration.
249
+ const ref = group[0];
250
+ const keys = Object.keys(ref);
251
+ let similarToRef = 1;
252
+ for (let i = 1; i < group.length; i++) {
253
+ const differingKeys = keys.filter((k) => JSON.stringify(ref[k]) !== JSON.stringify(group[i][k]));
254
+ const onlyPaginationDiffers = differingKeys.length > 0 && differingKeys.every((k) => PAGINATION_KEYS.has(k));
255
+ if (onlyPaginationDiffers)
256
+ continue;
257
+ const matchingCount = keys.length - differingKeys.length;
258
+ if (matchingCount >= keys.length / 2) {
259
+ similarToRef++;
260
+ }
261
+ }
262
+ largestSimilarGroup = Math.max(largestSimilarGroup, similarToRef);
263
+ }
264
+ return Math.max(maxExact, largestSimilarGroup);
265
+ }
266
+ // ---------------------------------------------------------------------------
267
+ // Tool result clearing
268
+ // ---------------------------------------------------------------------------
269
+ /**
270
+ * Replace old tool result bodies with one-line summaries.
271
+ *
272
+ * If there are more than `ctx.config.clearThreshold` tool result messages,
273
+ * keep the last `ctx.config.keepRecentResults` full and replace older ones
274
+ * with a cleared marker.
275
+ *
276
+ * When `ctx.summarizeToolResult` is provided, each newly-cleared message
277
+ * gets an LLM-generated 1-2 sentence summary of its body (in parallel).
278
+ * Already-cleared messages are skipped (idempotent). Summarization
279
+ * failures degrade to the static marker so context clearing never
280
+ * blocks the main loop.
281
+ */
282
+ async function clearOldToolResults(messages, ctx) {
283
+ const threshold = ctx.config.clearThreshold;
284
+ const keepRecent = ctx.config.keepRecentResults;
285
+ // Count tool result messages
286
+ const toolResultIndices = [];
287
+ for (let i = 0; i < messages.length; i++) {
288
+ const msg = messages[i];
289
+ if (msg.role === 'tool') {
290
+ toolResultIndices.push(i);
291
+ }
292
+ }
293
+ if (toolResultIndices.length <= threshold) {
294
+ return messages;
295
+ }
296
+ // Keep the last `keepRecent` tool results full, clear the rest
297
+ const indicesToClear = toolResultIndices.slice(0, -keepRecent);
298
+ // Build one task per index — skip already-cleared (idempotent), summarize
299
+ // the rest. Tasks run through a bounded worker pool so we don't fan out
300
+ // 10+ concurrent summarizer calls into provider rate limits.
301
+ const clearOne = async (idx) => {
302
+ const existing = messages[idx];
303
+ // Already-cleared messages: keep the existing marker unchanged
304
+ if (isAlreadyCleared(existing))
305
+ return { idx, cleared: existing };
306
+ const toolCallId = extractToolCallId(existing);
307
+ const toolName = extractToolName(existing);
308
+ const body = extractToolResultText(existing);
309
+ const markerText = await summarizeOrFallback(toolName, body, ctx.summarizeToolResult, ctx.signal, ctx.config.summarizerTimeoutMs, ctx.logger, ctx.sessionId);
310
+ // CRITICAL: preserve the original toolCallId and toolName. Providers
311
+ // (Anthropic especially) require every assistant tool-call to have
312
+ // a matching tool-result with the same toolCallId; rewriting it
313
+ // breaks the conversation with "tool results are missing" errors.
314
+ return {
315
+ idx,
316
+ cleared: {
317
+ role: 'tool',
318
+ content: [{
319
+ type: 'tool-result',
320
+ toolCallId,
321
+ toolName,
322
+ output: { type: 'text', value: markerText },
323
+ }],
324
+ },
325
+ };
326
+ };
327
+ const resolved = await runWithConcurrency(indicesToClear, clearOne, ctx.config.summarizerConcurrency);
328
+ const result = [...messages];
329
+ for (const { idx, cleared } of resolved) {
330
+ result[idx] = cleared;
331
+ }
332
+ return result;
333
+ }
334
+ /**
335
+ * Execute `task(item)` for each item with a concurrency cap. Preserves
336
+ * input order in the returned results. Functionally equivalent to
337
+ * `Promise.all(items.map(task))` but bounded so we don't fan out into
338
+ * provider rate limits.
339
+ *
340
+ * `task` MUST NOT throw — a throwing task rejects Promise.all and leaves
341
+ * `undefined` holes in `results` for items after the failure point.
342
+ * Wrap fallible work in try/catch inside the task itself (as
343
+ * `summarizeOrFallback` does).
344
+ */
345
+ async function runWithConcurrency(items, task, concurrency) {
346
+ const max = Math.max(1, concurrency);
347
+ const results = new Array(items.length);
348
+ let nextIndex = 0;
349
+ const worker = async () => {
350
+ while (true) {
351
+ const i = nextIndex++;
352
+ if (i >= items.length)
353
+ return;
354
+ results[i] = await task(items[i]);
355
+ }
356
+ };
357
+ const workers = [];
358
+ for (let w = 0; w < Math.min(max, items.length); w++) {
359
+ workers.push(worker());
360
+ }
361
+ await Promise.all(workers);
362
+ return results;
363
+ }
364
+ /** Extract the assistant-visible text from a tool-result message. */
365
+ function extractToolResultText(msg) {
366
+ if (msg.role !== 'tool')
367
+ return '';
368
+ if (typeof msg.content === 'string')
369
+ return msg.content;
370
+ if (!Array.isArray(msg.content))
371
+ return '';
372
+ const parts = [];
373
+ for (const part of msg.content) {
374
+ if ('output' in part && part.output && typeof part.output === 'object' && 'value' in part.output) {
375
+ const value = part.output.value;
376
+ if (typeof value === 'string')
377
+ parts.push(value);
378
+ else
379
+ parts.push(JSON.stringify(value));
380
+ }
381
+ }
382
+ return parts.join('\n');
383
+ }
384
+ /** Extract the original tool name from a tool-result message, if available. */
385
+ function extractToolName(msg) {
386
+ if (msg.role !== 'tool' || !Array.isArray(msg.content))
387
+ return 'unknown';
388
+ for (const part of msg.content) {
389
+ if ('toolName' in part && typeof part.toolName === 'string')
390
+ return part.toolName;
391
+ }
392
+ return 'unknown';
393
+ }
394
+ /** Extract the original toolCallId from a tool-result message. */
395
+ function extractToolCallId(msg) {
396
+ if (msg.role !== 'tool' || !Array.isArray(msg.content))
397
+ return 'unknown';
398
+ for (const part of msg.content) {
399
+ if ('toolCallId' in part && typeof part.toolCallId === 'string')
400
+ return part.toolCallId;
401
+ }
402
+ return 'unknown';
403
+ }
404
+ /**
405
+ * True if this message has already been replaced with a cleared marker.
406
+ * Detected by content prefix (we no longer overwrite toolCallId) with a
407
+ * length cap so a legit tool result that happens to start with "[Summary
408
+ * of " doesn't get silently skipped from summarization.
409
+ */
410
+ function isAlreadyCleared(msg) {
411
+ if (msg.role !== 'tool' || !Array.isArray(msg.content))
412
+ return false;
413
+ for (const part of msg.content) {
414
+ if ('output' in part && part.output && typeof part.output === 'object' && 'value' in part.output) {
415
+ const value = part.output.value;
416
+ if (typeof value === 'string' && value.length <= CLEARED_MARKER_MAX_LEN) {
417
+ if (CLEARED_TEXT_PREFIXES.some((p) => value.startsWith(p)))
418
+ return true;
419
+ }
420
+ }
421
+ }
422
+ return false;
423
+ }
424
+ /**
425
+ * Produce replacement text for a cleared tool result. Uses the summarizer
426
+ * hook if provided; falls back to the static marker on any failure.
427
+ */
428
+ async function summarizeOrFallback(toolName, content, summarize, signal, timeoutMs, logger, sessionId) {
429
+ if (!summarize || content.length === 0)
430
+ return CLEARED_TOOL_RESULT_TEXT;
431
+ // Bound the callback so a hung summarizer can never block the main loop.
432
+ // The session signal is ANDed in so a parent abort still tears this down.
433
+ const timeoutSignal = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
434
+ try {
435
+ const summary = await summarize({ toolName, content, signal: timeoutSignal });
436
+ const trimmed = summary.trim();
437
+ if (trimmed.length === 0)
438
+ return CLEARED_TOOL_RESULT_TEXT;
439
+ return `[Summary of ${toolName}: ${trimmed}]`;
440
+ }
441
+ catch (err) {
442
+ logger.warn('tool_result_summarization_failed', {
443
+ session: sessionId,
444
+ tool: toolName,
445
+ error: err instanceof Error ? err.message : String(err),
446
+ });
447
+ return CLEARED_TOOL_RESULT_TEXT;
448
+ }
449
+ }
450
+ //# sourceMappingURL=thinking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../../../src/agent/states/thinking.ts"],"names":[],"mappings":"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"}