experimental-a2 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +1 -1
  3. package/dist/{actor-C7b-1arn.d.ts → actor-CqibLgjQ.d.ts} +15 -7
  4. package/dist/actor-CqibLgjQ.d.ts.map +1 -0
  5. package/dist/actor-client.d.ts +1 -1
  6. package/dist/actor-client.js +2 -2
  7. package/dist/actor-react.d.ts +3 -3
  8. package/dist/actor-react.js +5 -5
  9. package/dist/{actor-shared-t7w8xIKP.js → actor-shared-DFET5q16.js} +3 -3
  10. package/dist/actor-shared-DFET5q16.js.map +1 -0
  11. package/dist/actor.d.ts +1 -1
  12. package/dist/actor.js +54 -43
  13. package/dist/actor.js.map +1 -1
  14. package/dist/{ai-Cz3hqVhk.d.ts → ai-DAu77CDr.d.ts} +8 -8
  15. package/dist/{ai-Cz3hqVhk.d.ts.map → ai-DAu77CDr.d.ts.map} +1 -1
  16. package/dist/{ai-mMiWul1T.js → ai-EEfKyc-z.js} +9 -9
  17. package/dist/ai-EEfKyc-z.js.map +1 -0
  18. package/dist/ai-client.d.ts +2 -2
  19. package/dist/ai-client.js +2 -2
  20. package/dist/ai-fx.d.ts +4 -2
  21. package/dist/ai-fx.d.ts.map +1 -1
  22. package/dist/ai-fx.js +214 -67
  23. package/dist/ai-fx.js.map +1 -1
  24. package/dist/{ai-harness-CV6rXbB3.d.ts → ai-harness-DTjkAr2T.d.ts} +2 -2
  25. package/dist/{ai-harness-CV6rXbB3.d.ts.map → ai-harness-DTjkAr2T.d.ts.map} +1 -1
  26. package/dist/{ai-harness-Clbg5ei7.js → ai-harness-dQeJaR1t.js} +7 -3
  27. package/dist/ai-harness-dQeJaR1t.js.map +1 -0
  28. package/dist/ai-pi.d.ts +1 -1
  29. package/dist/ai-pi.js +3 -3
  30. package/dist/ai-pi.js.map +1 -1
  31. package/dist/ai-react.d.ts +5 -5
  32. package/dist/ai-react.js +2 -2
  33. package/dist/ai-server.d.ts +14 -17
  34. package/dist/ai-server.d.ts.map +1 -1
  35. package/dist/ai-server.js +86 -73
  36. package/dist/ai-server.js.map +1 -1
  37. package/dist/ai.d.ts +2 -2
  38. package/dist/ai.js +2 -2
  39. package/dist/{client-BhHLoNKF.js → client-BQS4i_V9.js} +29 -6
  40. package/dist/client-BQS4i_V9.js.map +1 -0
  41. package/dist/{client-h_DKFAjj.d.ts → client-CUMbS_38.d.ts} +3 -3
  42. package/dist/{client-h_DKFAjj.d.ts.map → client-CUMbS_38.d.ts.map} +1 -1
  43. package/dist/client.d.ts +3 -3
  44. package/dist/client.js +1 -1
  45. package/dist/{contract-BYKASlCV.js → contract-CWukt01d.js} +2 -2
  46. package/dist/contract-CWukt01d.js.map +1 -0
  47. package/dist/index.d.ts +5 -5
  48. package/dist/index.js +3 -3
  49. package/dist/{initial-snapshot-Bx-c0pDP.d.ts → initial-snapshot-D3Lve43o.d.ts} +4 -4
  50. package/dist/initial-snapshot-D3Lve43o.d.ts.map +1 -0
  51. package/dist/{internal-CscSY7K_.js → internal-CvsrprnU.js} +40 -16
  52. package/dist/internal-CvsrprnU.js.map +1 -0
  53. package/dist/otel.d.ts +1 -1
  54. package/dist/otel.js +1 -1
  55. package/dist/otel.js.map +1 -1
  56. package/dist/{react-BBXgHWFc.d.ts → react-BoHvC3v9.d.ts} +4 -4
  57. package/dist/{react-BBXgHWFc.d.ts.map → react-BoHvC3v9.d.ts.map} +1 -1
  58. package/dist/react.d.ts +1 -1
  59. package/dist/react.js +1 -1
  60. package/dist/{reducer-CqA59Q6U.d.ts → reducer-CYPHsSmd.d.ts} +2 -2
  61. package/dist/{reducer-CqA59Q6U.d.ts.map → reducer-CYPHsSmd.d.ts.map} +1 -1
  62. package/dist/{reducer-BAXc8JyF.js → reducer-CjmvZSAb.js} +2 -2
  63. package/dist/{reducer-BAXc8JyF.js.map → reducer-CjmvZSAb.js.map} +1 -1
  64. package/dist/runtime-consumer-CIeL33wj.js +12 -0
  65. package/dist/runtime-consumer-CIeL33wj.js.map +1 -0
  66. package/dist/scheduler-qstash.d.ts +2 -2
  67. package/dist/scheduler-qstash.js +3 -3
  68. package/dist/scheduler-task-X1SToDjP.js.map +1 -1
  69. package/dist/scheduler-vercel.d.ts +2 -2
  70. package/dist/scheduler-vercel.js +3 -3
  71. package/dist/scheduler-vercel.js.map +1 -1
  72. package/dist/{server-qyb5aJJG.js → server-DtFrWxi3.js} +412 -116
  73. package/dist/server-DtFrWxi3.js.map +1 -0
  74. package/dist/{server-DYAATFuT.d.ts → server-qgez0Xny.d.ts} +108 -41
  75. package/dist/server-qgez0Xny.d.ts.map +1 -0
  76. package/dist/server.browser.js +1 -1
  77. package/dist/server.browser.js.map +1 -1
  78. package/dist/server.d.ts +4 -4
  79. package/dist/server.js +2 -2
  80. package/dist/{session-clear-C-QwTXV1.d.ts → session-clear-D1PFe7xl.d.ts} +2 -2
  81. package/dist/session-clear-D1PFe7xl.d.ts.map +1 -0
  82. package/dist/{session-clear-DGI4jTQ5.js → session-clear-wHd5GCpZ.js} +5 -4
  83. package/dist/session-clear-wHd5GCpZ.js.map +1 -0
  84. package/dist/store-D0MhBvg6.d.ts +532 -0
  85. package/dist/store-D0MhBvg6.d.ts.map +1 -0
  86. package/dist/store-N8PXxDAS.js.map +1 -1
  87. package/dist/store-codec-DwrWlgQx.js +65 -0
  88. package/dist/store-codec-DwrWlgQx.js.map +1 -0
  89. package/dist/store-memory.d.ts +1 -1
  90. package/dist/store-memory.d.ts.map +1 -1
  91. package/dist/store-memory.js +406 -225
  92. package/dist/store-memory.js.map +1 -1
  93. package/dist/{store-polling-7WJV0YWP.js → store-polling-BZt2Rf3D.js} +2 -2
  94. package/dist/{store-polling-7WJV0YWP.js.map → store-polling-BZt2Rf3D.js.map} +1 -1
  95. package/dist/store-postgres.d.ts +1 -1
  96. package/dist/store-postgres.d.ts.map +1 -1
  97. package/dist/store-postgres.js +1598 -587
  98. package/dist/store-postgres.js.map +1 -1
  99. package/dist/store-presence-polling-JuAy2Ck2.js +111 -0
  100. package/dist/store-presence-polling-JuAy2Ck2.js.map +1 -0
  101. package/dist/store-redis-http.d.ts +1 -1
  102. package/dist/store-redis-http.js +4 -4
  103. package/dist/store-redis-notify-CsJw_hfD.js +3060 -0
  104. package/dist/store-redis-notify-CsJw_hfD.js.map +1 -0
  105. package/dist/store-redis.d.ts +1 -1
  106. package/dist/store-redis.d.ts.map +1 -1
  107. package/dist/store-redis.js +4 -5
  108. package/dist/store-redis.js.map +1 -1
  109. package/dist/store-sqlite.d.ts +1 -1
  110. package/dist/store-sqlite.d.ts.map +1 -1
  111. package/dist/store-sqlite.js +527 -299
  112. package/dist/store-sqlite.js.map +1 -1
  113. package/dist/stream-buffer-DrTyiIuo.js +57 -0
  114. package/dist/stream-buffer-DrTyiIuo.js.map +1 -0
  115. package/dist/{telemetry-Cyfqo6Qt.d.ts → telemetry-CWwsh-Gx.d.ts} +3 -3
  116. package/dist/telemetry-CWwsh-Gx.d.ts.map +1 -0
  117. package/dist/{wire-BKxH1vbP.js → wire-CV-Z7wz-.js} +6 -5
  118. package/dist/wire-CV-Z7wz-.js.map +1 -0
  119. package/docs/01-quickstart.mdx +21 -15
  120. package/docs/02-examples.mdx +1 -1
  121. package/docs/actors/01-introduction.mdx +13 -2
  122. package/docs/actors/02-concurrency.mdx +1 -1
  123. package/docs/agents/01-introduction.mdx +1 -1
  124. package/docs/agents/02-tools.mdx +12 -11
  125. package/docs/agents/03-conversations.mdx +36 -25
  126. package/docs/agents/04-harnesses.mdx +14 -7
  127. package/docs/client/03-presence.mdx +18 -14
  128. package/docs/contract/01-events.mdx +2 -2
  129. package/docs/contract/02-state.mdx +18 -14
  130. package/docs/contract/03-sessions.mdx +32 -25
  131. package/docs/index.mdx +29 -24
  132. package/docs/reference/01-core.mdx +7 -6
  133. package/docs/reference/02-server.mdx +250 -191
  134. package/docs/reference/04-ai.mdx +33 -23
  135. package/docs/reference/05-telemetry.mdx +27 -13
  136. package/docs/reference/06-errors.mdx +25 -19
  137. package/docs/reference/meta.ts +1 -1
  138. package/docs/schedulers/01-overview.mdx +8 -8
  139. package/docs/schedulers/02-vercel-queues.mdx +2 -2
  140. package/docs/schedulers/03-qstash.mdx +4 -4
  141. package/docs/server/01-consumers.mdx +418 -0
  142. package/docs/server/02-timers.mdx +31 -21
  143. package/docs/server/03-cancellation.mdx +52 -44
  144. package/docs/server/04-routes.mdx +4 -1
  145. package/docs/server/05-sql-projections.mdx +391 -0
  146. package/docs/server/06-guarantees.mdx +61 -51
  147. package/docs/stores/01-overview.mdx +3 -3
  148. package/docs/stores/02-redis.mdx +24 -10
  149. package/docs/stores/03-redis-http.mdx +8 -6
  150. package/docs/stores/04-postgres.mdx +65 -14
  151. package/docs/stores/05-sqlite.mdx +5 -3
  152. package/docs/upgrades/01-overview.mdx +31 -0
  153. package/docs/upgrades/78-0-22.mdx +115 -0
  154. package/docs/upgrades/79-0-21.mdx +165 -0
  155. package/docs/upgrades/80-0-20.mdx +43 -0
  156. package/docs/upgrades/81-0-19.mdx +33 -0
  157. package/docs/upgrades/82-0-18.mdx +33 -0
  158. package/docs/upgrades/83-0-17.mdx +69 -0
  159. package/docs/upgrades/meta.ts +3 -0
  160. package/examples/playground/DEPLOY.md +39 -7
  161. package/examples/playground/app/a0/chat.test.tsx +2 -2
  162. package/examples/playground/app/a0/sandbox-log.ts +17 -15
  163. package/examples/playground/app/a0/sandbox.ts +58 -13
  164. package/examples/playground/app/a0/server.ts +4 -4
  165. package/examples/playground/app/a2slack/a2slack.css +1067 -0
  166. package/examples/playground/app/a2slack/c/[channel]/page.tsx +20 -0
  167. package/examples/playground/app/a2slack/consumers/agent.ts +63 -0
  168. package/examples/playground/app/a2slack/consumers/feed.ts +164 -0
  169. package/examples/playground/app/a2slack/consumers/notify.ts +116 -0
  170. package/examples/playground/app/a2slack/consumers/search.ts +37 -0
  171. package/examples/playground/app/a2slack/consumers/triage.ts +31 -0
  172. package/examples/playground/app/a2slack/consumers/welcome.ts +25 -0
  173. package/examples/playground/app/a2slack/db/a2.ts +209 -0
  174. package/examples/playground/app/a2slack/db/index.ts +73 -0
  175. package/examples/playground/app/a2slack/db/migrations/0000_extensions.sql +4 -0
  176. package/examples/playground/app/a2slack/db/migrations/0001_workspace.sql +74 -0
  177. package/examples/playground/app/a2slack/db/migrations/0002_a2.sql +215 -0
  178. package/examples/playground/app/a2slack/db/migrations/0003_a2_batch.sql +67 -0
  179. package/examples/playground/app/a2slack/db/migrations/0004_a2_session_event_ids.sql +2 -0
  180. package/examples/playground/app/a2slack/db/migrations/meta/0000_snapshot.json +18 -0
  181. package/examples/playground/app/a2slack/db/migrations/meta/0001_snapshot.json +500 -0
  182. package/examples/playground/app/a2slack/db/migrations/meta/0002_snapshot.json +1159 -0
  183. package/examples/playground/app/a2slack/db/migrations/meta/0003_snapshot.json +1159 -0
  184. package/examples/playground/app/a2slack/db/migrations/meta/0004_snapshot.json +1165 -0
  185. package/examples/playground/app/a2slack/db/migrations/meta/_journal.json +41 -0
  186. package/examples/playground/app/a2slack/db/queries.ts +263 -0
  187. package/examples/playground/app/a2slack/db/schema.ts +145 -0
  188. package/examples/playground/app/a2slack/drills/a2slack.drill.ts +708 -0
  189. package/examples/playground/app/a2slack/drills/harness.ts +244 -0
  190. package/examples/playground/app/a2slack/events/route.ts +36 -0
  191. package/examples/playground/app/a2slack/identity.ts +44 -0
  192. package/examples/playground/app/a2slack/inbox/route.ts +8 -0
  193. package/examples/playground/app/a2slack/lag/data/route.ts +8 -0
  194. package/examples/playground/app/a2slack/lag/page.tsx +101 -0
  195. package/examples/playground/app/a2slack/lag.ts +73 -0
  196. package/examples/playground/app/a2slack/layout.tsx +43 -0
  197. package/examples/playground/app/a2slack/messages/route.ts +17 -0
  198. package/examples/playground/app/a2slack/model.test.ts +208 -0
  199. package/examples/playground/app/a2slack/model.ts +369 -0
  200. package/examples/playground/app/a2slack/models.test.ts +72 -0
  201. package/examples/playground/app/a2slack/page.tsx +10 -0
  202. package/examples/playground/app/a2slack/scheduler/route.ts +5 -0
  203. package/examples/playground/app/a2slack/search/route.ts +40 -0
  204. package/examples/playground/app/a2slack/search-index.ts +108 -0
  205. package/examples/playground/app/a2slack/server.test.ts +315 -0
  206. package/examples/playground/app/a2slack/server.ts +55 -0
  207. package/examples/playground/app/a2slack/sessions.ts +50 -0
  208. package/examples/playground/app/a2slack/thread/route.ts +8 -0
  209. package/examples/playground/app/a2slack/ui/ChannelView.tsx +87 -0
  210. package/examples/playground/app/a2slack/ui/Composer.tsx +117 -0
  211. package/examples/playground/app/a2slack/ui/DotsShadow.tsx +42 -0
  212. package/examples/playground/app/a2slack/ui/Feed.tsx +157 -0
  213. package/examples/playground/app/a2slack/ui/InboxContext.tsx +63 -0
  214. package/examples/playground/app/a2slack/ui/InboxView.tsx +82 -0
  215. package/examples/playground/app/a2slack/ui/Menu.tsx +128 -0
  216. package/examples/playground/app/a2slack/ui/MessageRow.tsx +314 -0
  217. package/examples/playground/app/a2slack/ui/NameGate.tsx +35 -0
  218. package/examples/playground/app/a2slack/ui/SearchContext.tsx +146 -0
  219. package/examples/playground/app/a2slack/ui/SearchResults.tsx +97 -0
  220. package/examples/playground/app/a2slack/ui/Shell.tsx +34 -0
  221. package/examples/playground/app/a2slack/ui/Sidebar.tsx +199 -0
  222. package/examples/playground/app/a2slack/ui/ThreadPanel.tsx +134 -0
  223. package/examples/playground/app/a2slack/ui/useInbox.ts +71 -0
  224. package/examples/playground/app/agent/server.ts +3 -3
  225. package/examples/playground/app/chat/[chatId]/chat-client.tsx +1 -1
  226. package/examples/playground/app/chat/server.ts +45 -35
  227. package/examples/playground/app/components/demo-icons.tsx +7 -0
  228. package/examples/playground/app/components/demos.tsx +7 -0
  229. package/examples/playground/app/orders/[orderId]/order-client.tsx +2 -2
  230. package/examples/playground/app/orders/page.tsx +1 -1
  231. package/examples/playground/app/orders/server.ts +49 -30
  232. package/examples/playground/app/recovery/[recoveryId]/recovery-client.tsx +14 -15
  233. package/examples/playground/app/recovery/page.tsx +4 -4
  234. package/examples/playground/app/recovery/server.ts +23 -32
  235. package/examples/playground/drizzle.config.ts +14 -0
  236. package/examples/playground/lib/store.ts +1 -1
  237. package/examples/playground/next.config.ts +6 -1
  238. package/examples/playground/package.json +12 -1
  239. package/examples/playground/scripts/migrate.mjs +31 -0
  240. package/examples/playground/vercel.json +9 -0
  241. package/examples/playground/vitest.drills.config.ts +32 -0
  242. package/package.json +5 -2
  243. package/sql/postgres/drizzle-schema.ts +209 -0
  244. package/sql/postgres/schema.sql +227 -67
  245. package/src/actor-shared.ts +10 -2
  246. package/src/actor.ts +101 -71
  247. package/src/ai-agent.ts +162 -111
  248. package/src/ai-control-server.ts +8 -8
  249. package/src/ai-fx.ts +324 -82
  250. package/src/ai-harness.ts +17 -2
  251. package/src/ai-pi.ts +2 -2
  252. package/src/ai-server.ts +2 -2
  253. package/src/ai.ts +7 -7
  254. package/src/client.ts +19 -2
  255. package/src/contract.ts +1 -1
  256. package/src/deterministic-id.ts +27 -4
  257. package/src/errors.ts +8 -5
  258. package/src/idempotent-replay.ts +0 -1
  259. package/src/index.ts +1 -1
  260. package/src/internal.ts +57 -16
  261. package/src/otel.ts +1 -1
  262. package/src/postgres-schema.ts +98 -57
  263. package/src/presence-recovery.ts +18 -11
  264. package/src/presence-tombstones.ts +52 -0
  265. package/src/push-envelope.ts +20 -0
  266. package/src/runtime-consumer.ts +10 -0
  267. package/src/scheduler-task.ts +2 -2
  268. package/src/scheduler-vercel.ts +1 -1
  269. package/src/server.browser.ts +1 -1
  270. package/src/server.ts +819 -218
  271. package/src/session-socket.ts +1 -1
  272. package/src/store-codec.ts +66 -0
  273. package/src/store-memory.ts +604 -286
  274. package/src/store-postgres.ts +2006 -857
  275. package/src/store-presence-polling.ts +59 -34
  276. package/src/store-redis-core.ts +1961 -1333
  277. package/src/store-redis-notify.ts +76 -26
  278. package/src/store-redis.ts +2 -3
  279. package/src/store-sqlite.ts +915 -516
  280. package/src/store.ts +241 -102
  281. package/src/telemetry.ts +2 -1
  282. package/src/wire.ts +1 -0
  283. package/dist/actor-C7b-1arn.d.ts.map +0 -1
  284. package/dist/actor-shared-t7w8xIKP.js.map +0 -1
  285. package/dist/ai-harness-Clbg5ei7.js.map +0 -1
  286. package/dist/ai-mMiWul1T.js.map +0 -1
  287. package/dist/client-BhHLoNKF.js.map +0 -1
  288. package/dist/contract-BYKASlCV.js.map +0 -1
  289. package/dist/idempotent-replay-JdgMQRRm.js +0 -21
  290. package/dist/idempotent-replay-JdgMQRRm.js.map +0 -1
  291. package/dist/initial-snapshot-Bx-c0pDP.d.ts.map +0 -1
  292. package/dist/internal-CscSY7K_.js.map +0 -1
  293. package/dist/server-DYAATFuT.d.ts.map +0 -1
  294. package/dist/server-qyb5aJJG.js.map +0 -1
  295. package/dist/session-clear-C-QwTXV1.d.ts.map +0 -1
  296. package/dist/session-clear-DGI4jTQ5.js.map +0 -1
  297. package/dist/store-CyLUy86v.d.ts +0 -404
  298. package/dist/store-CyLUy86v.d.ts.map +0 -1
  299. package/dist/store-codec-DTG0Ftek.js +0 -10
  300. package/dist/store-codec-DTG0Ftek.js.map +0 -1
  301. package/dist/store-presence-polling-B1ixeqIS.js +0 -94
  302. package/dist/store-presence-polling-B1ixeqIS.js.map +0 -1
  303. package/dist/store-redis-notify-CM0AfLY0.js +0 -2544
  304. package/dist/store-redis-notify-CM0AfLY0.js.map +0 -1
  305. package/dist/stream-buffer-Cx7AAPGq.js +0 -23
  306. package/dist/stream-buffer-Cx7AAPGq.js.map +0 -1
  307. package/dist/telemetry-Cyfqo6Qt.d.ts.map +0 -1
  308. package/dist/wire-BKxH1vbP.js.map +0 -1
  309. package/docs/server/01-handlers.mdx +0 -227
package/dist/ai-server.js CHANGED
@@ -1,11 +1,12 @@
1
- import { i as A2Error } from "./session-clear-DGI4jTQ5.js";
2
- import { a as reducer, s as validateSync } from "./reducer-BAXc8JyF.js";
3
- import { h as installAmbientToolScopeStorage, m as failedPreviousAttempt, p as consumeSchedulerSendFailure } from "./internal-CscSY7K_.js";
1
+ import { i as A2Error } from "./session-clear-wHd5GCpZ.js";
2
+ import { a as reducer, s as validateSync } from "./reducer-CjmvZSAb.js";
3
+ import { _ as installAmbientToolScopeStorage, g as failedPreviousAttempt, h as drainSettledHooks, m as consumeSchedulerSendFailure } from "./internal-CvsrprnU.js";
4
4
  import { t as boundedCache } from "./bounded-cache-CPHWF-8h.js";
5
- import { a as CONSOLE_TELEMETRY, o as setServerFetchHooks, t as createServer } from "./server-qyb5aJJG.js";
5
+ import { a as CONSOLE_TELEMETRY, n as createServer, o as setServerFetchHooks } from "./server-DtFrWxi3.js";
6
6
  import { a as unexplainedAdmission, i as steersOn, n as initialControlState, r as steeringEnd, t as STEERED_REASON } from "./ai-control-CvLbW10B.js";
7
- import { A as interruptUIMessage, C as reduceToolActivity, D as flattenProgressBatches, E as upsertResponse, M as assertMessageBase, N as restoreMessageBase, O as progressBatches, S as projectedMessage, T as upsertMessage, _ as applyControlChanges, a as events, b as findMessage, d as appSlice, f as isAgentContract, g as isUIMessage, h as aiEventId, j as pauseUIMessage, k as progressOwnedBy, m as AI_EVENT_ID_PREFIX, n as agentContract, p as withAIStorage, u as appReducerOf, v as controlCommit, w as retainMessageBase, y as advanceProjection } from "./ai-mMiWul1T.js";
8
- import { a as gatewaySessionAffinity, c as harnessLog, f as registerHarnessStates, l as harnessStates, o as harnessDriver } from "./ai-harness-Clbg5ei7.js";
7
+ import { A as interruptUIMessage, C as reduceToolActivity, D as flattenProgressBatches, E as upsertResponse, M as assertMessageBase, N as restoreMessageBase, O as progressBatches, S as projectedMessage, T as upsertMessage, _ as applyControlChanges, b as findMessage, d as appSlice, f as isAgentContract, g as isUIMessage, h as aiEventId, j as pauseUIMessage, k as progressOwnedBy, m as AI_EVENT_ID_PREFIX, n as agentContract, o as events, p as withAIStorage, u as appReducerOf, v as controlCommit, w as retainMessageBase, y as advanceProjection } from "./ai-EEfKyc-z.js";
8
+ import { a as gatewaySessionAffinity, c as harnessLog, f as registerHarnessStates, l as harnessStates, o as harnessDriver } from "./ai-harness-dQeJaR1t.js";
9
+ import { t as runtimeConsumer } from "./runtime-consumer-CIeL33wj.js";
9
10
  import { AsyncLocalStorage } from "node:async_hooks";
10
11
  import { asSchema, convertToModelMessages, isToolUIPart, stepCountIs, streamText, toUIMessageStream } from "ai";
11
12
  import { Buffer } from "node:buffer";
@@ -1606,8 +1607,8 @@ const measuredInputTokens = (options) => {
1606
1607
  //#endregion
1607
1608
  //#region src/ai-agent.ts
1608
1609
  /**
1609
- * The server-only implementation of the experimental-a2/ai protocol: the
1610
- * handler table and `agent()`, its assembly as an ordinary A2 server.
1610
+ * The server-only implementation of the experimental-a2/ai protocol: its
1611
+ * consumers and `agent()`, its assembly as an ordinary A2 server.
1611
1612
  */
1612
1613
  const isAgentIngressEvent = (event) => {
1613
1614
  if (event.type !== "ai.control.requested") return false;
@@ -1658,8 +1659,8 @@ const withModelSettings = (options) => {
1658
1659
  const instructionTexts = (instructions) => instructions === void 0 ? [] : typeof instructions === "string" ? [instructions] : (Array.isArray(instructions) ? instructions : [instructions]).map((message) => message.content);
1659
1660
  const errorMessage = (error) => error instanceof Error ? error.message : String(error);
1660
1661
  const toolScopeStorage = installAmbientToolScopeStorage(() => new AsyncLocalStorage());
1661
- /** Run `fn` with `ctx` as the ambient tool handler context, for direct tool tests. */
1662
- function runWithHandlerContext(ctx, fn) {
1662
+ /** Run `fn` with `ctx` as the ambient tool consumer context, for direct tool tests. */
1663
+ function runWithConsumerContext(ctx, fn) {
1663
1664
  return toolScopeStorage.run({ context: ctx }, fn);
1664
1665
  }
1665
1666
  /** Sessions whose latest step prompt one process keeps for that step's tools. */
@@ -2118,7 +2119,7 @@ const assertNoLoopOptions = (options) => {
2118
2119
  throw new TypeError(harness === "ai-sdk" ? `${key} belongs to the harness: agent({ harness: { type: 'ai-sdk', ${key} } })` : `${key} is an option of the AI SDK harness; ${harness}() runs its own loop`);
2119
2120
  }
2120
2121
  };
2121
- function createHandlers(options) {
2122
+ function createConsumers(options) {
2122
2123
  if (options.model === void 0) throw new TypeError("agent requires model");
2123
2124
  if (options.progress?.maxChunks !== void 0 && (!Number.isInteger(options.progress.maxChunks) || options.progress.maxChunks < 1)) throw new TypeError("progress.maxChunks must be a positive integer");
2124
2125
  if (options.progress?.maxDelayMs !== void 0 && (!Number.isFinite(options.progress.maxDelayMs) || options.progress.maxDelayMs < 0)) throw new TypeError("progress.maxDelayMs must be a non-negative number");
@@ -2626,6 +2627,7 @@ function createHandlers(options) {
2626
2627
  };
2627
2628
  const updates = consumeGeneration({
2628
2629
  source: harness !== void 0 ? await harness.step({
2630
+ scope: states,
2629
2631
  agentName: options.contract.name,
2630
2632
  sessionId: ctx.event.sessionId,
2631
2633
  requestIndex: ctx.event.index,
@@ -2742,8 +2744,14 @@ function createHandlers(options) {
2742
2744
  };
2743
2745
  }
2744
2746
  };
2745
- return {
2746
- "ai.model.metadata.requested": { handler: async (ctx) => {
2747
+ const contract = options.contract;
2748
+ const { toolLane } = options;
2749
+ return [
2750
+ runtimeConsumer({
2751
+ contract,
2752
+ name: "a2.ai.metadata",
2753
+ types: ["ai.model.metadata.requested"]
2754
+ }).run(async (ctx) => {
2747
2755
  const limits = await readModelLimits({
2748
2756
  modelId: ctx.event.payload.modelId,
2749
2757
  signal: ctx.signal
@@ -2757,27 +2765,29 @@ function createHandlers(options) {
2757
2765
  limits
2758
2766
  }
2759
2767
  };
2760
- } },
2761
- "ai.control.requested": {
2768
+ }),
2769
+ runtimeConsumer({
2770
+ contract,
2771
+ name: "a2.ai.control",
2772
+ types: [
2773
+ "ai.control.requested",
2774
+ "ai.work.reported",
2775
+ "ai.session.closed"
2776
+ ],
2762
2777
  lane: ({ event }) => {
2778
+ if (event.type !== "ai.control.requested") return "a2.ai.control";
2763
2779
  const command = event.payload;
2764
2780
  if (event.id === "") throw new A2Error("INVALID_PAYLOAD", "AI command IDs must be nonempty");
2765
2781
  if (event.id?.startsWith("a2.ai:")) throw new A2Error("INVALID_PAYLOAD", `AI command IDs cannot use the reserved '${AI_EVENT_ID_PREFIX}' prefix`);
2766
2782
  if ((command.action === "send" || command.action === "steer") && event.id !== command.message.id) throw new A2Error("INVALID_PAYLOAD", "AI input event ID must equal message.id");
2767
2783
  return "a2.ai.control";
2768
- },
2769
- handler: controlHandler
2770
- },
2771
- "ai.work.reported": {
2772
- lane: "a2.ai.control",
2773
- handler: controlHandler
2774
- },
2775
- "ai.session.closed": {
2776
- lane: "a2.ai.control",
2777
- handler: controlHandler
2778
- },
2779
- "ai.generation.requested": {
2780
- lane: "a2.ai.model",
2784
+ }
2785
+ }).run(controlHandler),
2786
+ runtimeConsumer({
2787
+ contract,
2788
+ name: "a2.ai.model",
2789
+ types: ["ai.generation.requested"],
2790
+ lane: () => "a2.ai.model",
2781
2791
  abortOn: {
2782
2792
  "ai.control.requested": (event, trigger) => event.payload.action === "stop" && event.payload.turnId === trigger.payload.control?.turnId,
2783
2793
  "ai.control.committed": (event, trigger) => {
@@ -2785,32 +2795,34 @@ function createHandlers(options) {
2785
2795
  return active?.turnId !== trigger.payload.control?.turnId || active?.version !== trigger.payload.control?.version;
2786
2796
  },
2787
2797
  "ai.session.closed": true
2788
- },
2789
- handler: (ctx) => telemetry.span("a2.ai.generate", {
2790
- "a2.contract": options.contract.name,
2791
- "a2.session_id": ctx.event.sessionId,
2792
- "a2.ai.generate.request_id": ctx.event.id,
2793
- "a2.ai.generate.attempt": ctx.attempt
2794
- }, async () => {
2795
- try {
2796
- return control.settled({
2797
- ctx,
2798
- events: await generationHandler(ctx)
2799
- });
2800
- } catch (error) {
2801
- if (control.cancelled({
2802
- error,
2803
- signal: ctx.signal
2804
- })) return control.settled({
2805
- ctx,
2806
- events: void 0
2807
- });
2808
- throw error;
2809
- }
2810
- })
2811
- },
2812
- "ai.tool.execution.requested": {
2813
- ...options.toolLane === void 0 ? {} : { lane: options.toolLane },
2798
+ }
2799
+ }).run((ctx) => telemetry.span("a2.ai.generate", {
2800
+ "a2.contract": options.contract.name,
2801
+ "a2.session_id": ctx.event.sessionId,
2802
+ "a2.ai.generate.request_id": ctx.event.id,
2803
+ "a2.ai.generate.attempt": ctx.attempt
2804
+ }, async () => {
2805
+ try {
2806
+ return control.settled({
2807
+ ctx,
2808
+ events: await generationHandler(ctx)
2809
+ });
2810
+ } catch (error) {
2811
+ if (control.cancelled({
2812
+ error,
2813
+ signal: ctx.signal
2814
+ })) return control.settled({
2815
+ ctx,
2816
+ events: void 0
2817
+ });
2818
+ throw error;
2819
+ }
2820
+ })),
2821
+ runtimeConsumer({
2822
+ contract,
2823
+ name: "a2.ai.tools",
2824
+ types: ["ai.tool.execution.requested"],
2825
+ ...toolLane === void 0 ? {} : { lane: () => toolLane },
2814
2826
  abortOn: {
2815
2827
  "ai.control.requested": (event, trigger) => event.payload.action === "stop" && event.payload.turnId === trigger.payload.turnId,
2816
2828
  "ai.generation.failed": (event, trigger) => event.payload.generationId === trigger.payload.call.generationId,
@@ -2819,21 +2831,21 @@ function createHandlers(options) {
2819
2831
  return active?.turnId !== trigger.payload.turnId || active?.version !== trigger.payload.version;
2820
2832
  },
2821
2833
  "ai.session.closed": true
2822
- },
2823
- handler: (ctx) => telemetry.span("a2.ai.tool", {
2824
- "a2.contract": options.contract.name,
2825
- "a2.session_id": ctx.event.sessionId,
2826
- "a2.ai.tool.request_id": ctx.event.payload.call.requestId,
2827
- "a2.ai.tool.call_id": ctx.event.payload.call.toolCallId,
2828
- "a2.ai.tool.name": ctx.event.payload.call.toolName,
2829
- "a2.ai.tool.attempt": ctx.attempt
2830
- }, () => handleToolExecution(ctx))
2831
- }
2832
- };
2834
+ }
2835
+ }).run((ctx) => telemetry.span("a2.ai.tool", {
2836
+ "a2.contract": options.contract.name,
2837
+ "a2.session_id": ctx.event.sessionId,
2838
+ "a2.ai.tool.request_id": ctx.event.payload.call.requestId,
2839
+ "a2.ai.tool.call_id": ctx.event.payload.call.toolCallId,
2840
+ "a2.ai.tool.name": ctx.event.payload.call.toolName,
2841
+ "a2.ai.tool.attempt": ctx.attempt
2842
+ }, () => handleToolExecution(ctx)))
2843
+ ];
2833
2844
  }
2834
2845
  function agent(options) {
2835
2846
  assertNoLoopOptions(options);
2836
- const { model, tools, instructions, maxSteps, harness, toolRecovery, progress, toolLane, handlers, ...rest } = options;
2847
+ if (options.toolLane !== void 0 && (typeof options.toolLane !== "string" || options.toolLane.length === 0)) throw new TypeError("toolLane must be a non-empty string");
2848
+ const { model, tools, instructions, maxSteps, harness, toolRecovery, progress, toolLane, ...rest } = options;
2837
2849
  let contract;
2838
2850
  let serverOptions;
2839
2851
  if ("contract" in rest) {
@@ -2852,7 +2864,7 @@ function agent(options) {
2852
2864
  serverOptions = remaining;
2853
2865
  }
2854
2866
  const states = harnessStates();
2855
- const builtIns = createHandlers({
2867
+ const builtIns = createConsumers({
2856
2868
  contract,
2857
2869
  model,
2858
2870
  harnessStates: states,
@@ -2865,16 +2877,17 @@ function agent(options) {
2865
2877
  ...progress === void 0 ? {} : { progress },
2866
2878
  ...toolLane === void 0 ? {} : { toolLane }
2867
2879
  });
2868
- for (const type of Object.keys(handlers ?? {})) if (Object.hasOwn(builtIns, type)) throw new TypeError(`agent handles '${type}' itself`);
2869
2880
  const server = createServer({
2870
2881
  ...serverOptions,
2871
2882
  contract,
2872
- handlers: {
2873
- ...builtIns,
2874
- ...handlers
2875
- }
2883
+ consumers: [...builtIns, ...serverOptions.consumers ?? []]
2876
2884
  });
2877
2885
  registerHarnessStates(server, states);
2886
+ const release = (harness === void 0 || harness.type === "ai-sdk" ? void 0 : harnessDriver(harness))?.release;
2887
+ if (release !== void 0) drainSettledHooks.set(server, (sessionId) => release({
2888
+ scope: states,
2889
+ sessionId
2890
+ }));
2878
2891
  const applicationEvents = "contract" in rest;
2879
2892
  setServerFetchHooks(server, { validateIngress: (context) => validateAgentIngress({
2880
2893
  context,
@@ -2883,6 +2896,6 @@ function agent(options) {
2883
2896
  return server;
2884
2897
  }
2885
2898
  //#endregion
2886
- export { agent, runWithHandlerContext };
2899
+ export { agent, runWithConsumerContext };
2887
2900
 
2888
2901
  //# sourceMappingURL=ai-server.js.map