@langchain/langgraph-sdk 1.8.10 → 1.9.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 (435) hide show
  1. package/README.md +90 -43
  2. package/dist/client/assistants/index.cjs +180 -0
  3. package/dist/client/assistants/index.cjs.map +1 -0
  4. package/dist/client/assistants/index.d.cts +155 -0
  5. package/dist/client/assistants/index.d.cts.map +1 -0
  6. package/dist/client/assistants/index.d.ts +155 -0
  7. package/dist/client/assistants/index.d.ts.map +1 -0
  8. package/dist/client/assistants/index.js +180 -0
  9. package/dist/client/assistants/index.js.map +1 -0
  10. package/dist/client/base.cjs +190 -0
  11. package/dist/client/base.cjs.map +1 -0
  12. package/dist/client/base.d.cts +84 -0
  13. package/dist/client/base.d.cts.map +1 -0
  14. package/dist/client/base.d.ts +84 -0
  15. package/dist/client/base.d.ts.map +1 -0
  16. package/dist/client/base.js +188 -0
  17. package/dist/client/base.js.map +1 -0
  18. package/dist/client/crons/index.cjs +159 -0
  19. package/dist/client/crons/index.cjs.map +1 -0
  20. package/dist/client/crons/index.d.cts +71 -0
  21. package/dist/client/crons/index.d.cts.map +1 -0
  22. package/dist/client/crons/index.d.ts +71 -0
  23. package/dist/client/crons/index.d.ts.map +1 -0
  24. package/dist/client/crons/index.js +159 -0
  25. package/dist/client/crons/index.js.map +1 -0
  26. package/dist/client/index.cjs +84 -0
  27. package/dist/client/index.cjs.map +1 -0
  28. package/dist/client/index.d.cts +63 -0
  29. package/dist/client/index.d.cts.map +1 -0
  30. package/dist/client/index.d.ts +63 -0
  31. package/dist/client/index.d.ts.map +1 -0
  32. package/dist/client/index.js +83 -0
  33. package/dist/client/index.js.map +1 -0
  34. package/dist/client/runs/index.cjs +275 -0
  35. package/dist/client/runs/index.cjs.map +1 -0
  36. package/dist/client/runs/index.d.cts +123 -0
  37. package/dist/client/runs/index.d.cts.map +1 -0
  38. package/dist/client/runs/index.d.ts +123 -0
  39. package/dist/client/runs/index.d.ts.map +1 -0
  40. package/dist/client/runs/index.js +275 -0
  41. package/dist/client/runs/index.js.map +1 -0
  42. package/dist/client/store/index.cjs +128 -0
  43. package/dist/client/store/index.cjs.map +1 -0
  44. package/dist/client/store/index.d.cts +75 -0
  45. package/dist/client/store/index.d.cts.map +1 -0
  46. package/dist/client/store/index.d.ts +75 -0
  47. package/dist/client/store/index.d.ts.map +1 -0
  48. package/dist/client/store/index.js +128 -0
  49. package/dist/client/store/index.js.map +1 -0
  50. package/dist/client/stream/error.cjs +18 -0
  51. package/dist/client/stream/error.cjs.map +1 -0
  52. package/dist/client/stream/error.d.cts +14 -0
  53. package/dist/client/stream/error.d.cts.map +1 -0
  54. package/dist/client/stream/error.d.ts +14 -0
  55. package/dist/client/stream/error.d.ts.map +1 -0
  56. package/dist/client/stream/error.js +18 -0
  57. package/dist/client/stream/error.js.map +1 -0
  58. package/dist/client/stream/handles/index.cjs +3 -0
  59. package/dist/client/stream/handles/index.d.ts +3 -0
  60. package/dist/client/stream/handles/index.js +4 -0
  61. package/dist/client/stream/handles/subagents.cjs +263 -0
  62. package/dist/client/stream/handles/subagents.cjs.map +1 -0
  63. package/dist/client/stream/handles/subagents.d.cts +45 -0
  64. package/dist/client/stream/handles/subagents.d.cts.map +1 -0
  65. package/dist/client/stream/handles/subagents.d.ts +45 -0
  66. package/dist/client/stream/handles/subagents.d.ts.map +1 -0
  67. package/dist/client/stream/handles/subagents.js +262 -0
  68. package/dist/client/stream/handles/subagents.js.map +1 -0
  69. package/dist/client/stream/handles/subgraphs.cjs +352 -0
  70. package/dist/client/stream/handles/subgraphs.cjs.map +1 -0
  71. package/dist/client/stream/handles/subgraphs.d.cts +82 -0
  72. package/dist/client/stream/handles/subgraphs.d.cts.map +1 -0
  73. package/dist/client/stream/handles/subgraphs.d.ts +82 -0
  74. package/dist/client/stream/handles/subgraphs.d.ts.map +1 -0
  75. package/dist/client/stream/handles/subgraphs.js +351 -0
  76. package/dist/client/stream/handles/subgraphs.js.map +1 -0
  77. package/dist/client/stream/handles/tools.cjs +92 -0
  78. package/dist/client/stream/handles/tools.cjs.map +1 -0
  79. package/dist/client/stream/handles/tools.d.cts +26 -0
  80. package/dist/client/stream/handles/tools.d.cts.map +1 -0
  81. package/dist/client/stream/handles/tools.d.ts +26 -0
  82. package/dist/client/stream/handles/tools.d.ts.map +1 -0
  83. package/dist/client/stream/handles/tools.js +92 -0
  84. package/dist/client/stream/handles/tools.js.map +1 -0
  85. package/dist/client/stream/index.cjs +1368 -0
  86. package/dist/client/stream/index.cjs.map +1 -0
  87. package/dist/client/stream/index.d.cts +238 -0
  88. package/dist/client/stream/index.d.cts.map +1 -0
  89. package/dist/client/stream/index.d.ts +238 -0
  90. package/dist/client/stream/index.d.ts.map +1 -0
  91. package/dist/client/stream/index.js +1367 -0
  92. package/dist/client/stream/index.js.map +1 -0
  93. package/dist/client/stream/media.cjs +506 -0
  94. package/dist/client/stream/media.cjs.map +1 -0
  95. package/dist/client/stream/media.d.cts +164 -0
  96. package/dist/client/stream/media.d.cts.map +1 -0
  97. package/dist/client/stream/media.d.ts +164 -0
  98. package/dist/client/stream/media.d.ts.map +1 -0
  99. package/dist/client/stream/media.js +505 -0
  100. package/dist/client/stream/media.js.map +1 -0
  101. package/dist/client/stream/messages.cjs +635 -0
  102. package/dist/client/stream/messages.cjs.map +1 -0
  103. package/dist/client/stream/messages.d.cts +139 -0
  104. package/dist/client/stream/messages.d.cts.map +1 -0
  105. package/dist/client/stream/messages.d.ts +139 -0
  106. package/dist/client/stream/messages.d.ts.map +1 -0
  107. package/dist/client/stream/messages.js +631 -0
  108. package/dist/client/stream/messages.js.map +1 -0
  109. package/dist/client/stream/multi-cursor-buffer.cjs +55 -0
  110. package/dist/client/stream/multi-cursor-buffer.cjs.map +1 -0
  111. package/dist/client/stream/multi-cursor-buffer.js +55 -0
  112. package/dist/client/stream/multi-cursor-buffer.js.map +1 -0
  113. package/dist/client/stream/subscription.cjs +85 -0
  114. package/dist/client/stream/subscription.cjs.map +1 -0
  115. package/dist/client/stream/subscription.d.cts +22 -0
  116. package/dist/client/stream/subscription.d.cts.map +1 -0
  117. package/dist/client/stream/subscription.d.ts +22 -0
  118. package/dist/client/stream/subscription.d.ts.map +1 -0
  119. package/dist/client/stream/subscription.js +84 -0
  120. package/dist/client/stream/subscription.js.map +1 -0
  121. package/dist/client/stream/transport/agent-server.cjs +45 -0
  122. package/dist/client/stream/transport/agent-server.cjs.map +1 -0
  123. package/dist/client/stream/transport/agent-server.d.cts +39 -0
  124. package/dist/client/stream/transport/agent-server.d.cts.map +1 -0
  125. package/dist/client/stream/transport/agent-server.d.ts +39 -0
  126. package/dist/client/stream/transport/agent-server.d.ts.map +1 -0
  127. package/dist/client/stream/transport/agent-server.js +45 -0
  128. package/dist/client/stream/transport/agent-server.js.map +1 -0
  129. package/dist/client/stream/transport/constants.cjs +10 -0
  130. package/dist/client/stream/transport/constants.cjs.map +1 -0
  131. package/dist/client/stream/transport/constants.js +10 -0
  132. package/dist/client/stream/transport/constants.js.map +1 -0
  133. package/dist/client/stream/transport/decoder.cjs +115 -0
  134. package/dist/client/stream/transport/decoder.cjs.map +1 -0
  135. package/dist/client/stream/transport/decoder.js +114 -0
  136. package/dist/client/stream/transport/decoder.js.map +1 -0
  137. package/dist/client/stream/transport/http.cjs +183 -0
  138. package/dist/client/stream/transport/http.cjs.map +1 -0
  139. package/dist/client/stream/transport/http.d.cts +45 -0
  140. package/dist/client/stream/transport/http.d.cts.map +1 -0
  141. package/dist/client/stream/transport/http.d.ts +45 -0
  142. package/dist/client/stream/transport/http.d.ts.map +1 -0
  143. package/dist/client/stream/transport/http.js +183 -0
  144. package/dist/client/stream/transport/http.js.map +1 -0
  145. package/dist/client/stream/transport/index.cjs +3 -0
  146. package/dist/client/stream/transport/index.js +4 -0
  147. package/dist/client/stream/transport/queue.cjs +55 -0
  148. package/dist/client/stream/transport/queue.cjs.map +1 -0
  149. package/dist/client/stream/transport/queue.js +55 -0
  150. package/dist/client/stream/transport/queue.js.map +1 -0
  151. package/dist/client/stream/transport/stream.cjs +79 -0
  152. package/dist/client/stream/transport/stream.cjs.map +1 -0
  153. package/dist/client/stream/transport/stream.js +79 -0
  154. package/dist/client/stream/transport/stream.js.map +1 -0
  155. package/dist/client/stream/transport/types.d.cts +29 -0
  156. package/dist/client/stream/transport/types.d.cts.map +1 -0
  157. package/dist/client/stream/transport/types.d.ts +29 -0
  158. package/dist/client/stream/transport/types.d.ts.map +1 -0
  159. package/dist/client/stream/transport/utils.cjs +45 -0
  160. package/dist/client/stream/transport/utils.cjs.map +1 -0
  161. package/dist/client/stream/transport/utils.js +39 -0
  162. package/dist/client/stream/transport/utils.js.map +1 -0
  163. package/dist/client/stream/transport/websocket.cjs +155 -0
  164. package/dist/client/stream/transport/websocket.cjs.map +1 -0
  165. package/dist/client/stream/transport/websocket.d.cts +36 -0
  166. package/dist/client/stream/transport/websocket.d.cts.map +1 -0
  167. package/dist/client/stream/transport/websocket.d.ts +36 -0
  168. package/dist/client/stream/transport/websocket.d.ts.map +1 -0
  169. package/dist/client/stream/transport/websocket.js +155 -0
  170. package/dist/client/stream/transport/websocket.js.map +1 -0
  171. package/dist/client/stream/transport.d.cts +104 -0
  172. package/dist/client/stream/transport.d.cts.map +1 -0
  173. package/dist/client/stream/transport.d.ts +104 -0
  174. package/dist/client/stream/transport.d.ts.map +1 -0
  175. package/dist/client/stream/types.d.cts +208 -0
  176. package/dist/client/stream/types.d.cts.map +1 -0
  177. package/dist/client/stream/types.d.ts +208 -0
  178. package/dist/client/stream/types.d.ts.map +1 -0
  179. package/dist/client/threads/index.cjs +271 -0
  180. package/dist/client/threads/index.cjs.map +1 -0
  181. package/dist/client/threads/index.d.cts +235 -0
  182. package/dist/client/threads/index.d.cts.map +1 -0
  183. package/dist/client/threads/index.d.ts +235 -0
  184. package/dist/client/threads/index.d.ts.map +1 -0
  185. package/dist/client/threads/index.js +270 -0
  186. package/dist/client/threads/index.js.map +1 -0
  187. package/dist/client/ui-internal/index.cjs +29 -0
  188. package/dist/client/ui-internal/index.cjs.map +1 -0
  189. package/dist/client/ui-internal/index.d.cts +11 -0
  190. package/dist/client/ui-internal/index.d.cts.map +1 -0
  191. package/dist/client/ui-internal/index.d.ts +11 -0
  192. package/dist/client/ui-internal/index.d.ts.map +1 -0
  193. package/dist/client/ui-internal/index.js +29 -0
  194. package/dist/client/ui-internal/index.js.map +1 -0
  195. package/dist/client.cjs +35 -1308
  196. package/dist/client.d.cts +19 -857
  197. package/dist/client.d.ts +19 -857
  198. package/dist/client.js +16 -1301
  199. package/dist/index.cjs +25 -4
  200. package/dist/index.d.cts +15 -3
  201. package/dist/index.d.ts +15 -3
  202. package/dist/index.js +14 -3
  203. package/dist/react/stream.cjs.map +1 -1
  204. package/dist/react/stream.custom.cjs +1 -1
  205. package/dist/react/stream.custom.js +1 -1
  206. package/dist/react/stream.d.cts +2 -1
  207. package/dist/react/stream.d.cts.map +1 -1
  208. package/dist/react/stream.d.ts +2 -1
  209. package/dist/react/stream.d.ts.map +1 -1
  210. package/dist/react/stream.js.map +1 -1
  211. package/dist/react/stream.lgp.cjs +6 -5
  212. package/dist/react/stream.lgp.cjs.map +1 -1
  213. package/dist/react/stream.lgp.js +4 -3
  214. package/dist/react/stream.lgp.js.map +1 -1
  215. package/dist/react/types.d.cts +1 -1
  216. package/dist/react/types.d.ts +1 -1
  217. package/dist/react/types.d.ts.map +1 -1
  218. package/dist/react-ui/server/server.cjs +1 -1
  219. package/dist/react-ui/server/server.cjs.map +1 -1
  220. package/dist/react-ui/server/server.js +1 -1
  221. package/dist/react-ui/server/server.js.map +1 -1
  222. package/dist/react-ui/types.cjs.map +1 -1
  223. package/dist/react-ui/types.d.cts +1 -1
  224. package/dist/react-ui/types.d.cts.map +1 -1
  225. package/dist/react-ui/types.d.ts +1 -1
  226. package/dist/react-ui/types.d.ts.map +1 -1
  227. package/dist/react-ui/types.js.map +1 -1
  228. package/dist/stream/assembled-to-message.cjs +121 -0
  229. package/dist/stream/assembled-to-message.cjs.map +1 -0
  230. package/dist/stream/assembled-to-message.d.cts +35 -0
  231. package/dist/stream/assembled-to-message.d.cts.map +1 -0
  232. package/dist/stream/assembled-to-message.d.ts +35 -0
  233. package/dist/stream/assembled-to-message.d.ts.map +1 -0
  234. package/dist/stream/assembled-to-message.js +119 -0
  235. package/dist/stream/assembled-to-message.js.map +1 -0
  236. package/dist/stream/channel-registry.cjs +224 -0
  237. package/dist/stream/channel-registry.cjs.map +1 -0
  238. package/dist/stream/channel-registry.d.cts +102 -0
  239. package/dist/stream/channel-registry.d.cts.map +1 -0
  240. package/dist/stream/channel-registry.d.ts +102 -0
  241. package/dist/stream/channel-registry.d.ts.map +1 -0
  242. package/dist/stream/channel-registry.js +224 -0
  243. package/dist/stream/channel-registry.js.map +1 -0
  244. package/dist/stream/constants.cjs +11 -0
  245. package/dist/stream/constants.cjs.map +1 -0
  246. package/dist/stream/constants.d.cts +10 -0
  247. package/dist/stream/constants.d.cts.map +1 -0
  248. package/dist/stream/constants.d.ts +10 -0
  249. package/dist/stream/constants.d.ts.map +1 -0
  250. package/dist/stream/constants.js +11 -0
  251. package/dist/stream/constants.js.map +1 -0
  252. package/dist/stream/controller.cjs +933 -0
  253. package/dist/stream/controller.cjs.map +1 -0
  254. package/dist/stream/controller.d.cts +135 -0
  255. package/dist/stream/controller.d.cts.map +1 -0
  256. package/dist/stream/controller.d.ts +135 -0
  257. package/dist/stream/controller.d.ts.map +1 -0
  258. package/dist/stream/controller.js +910 -0
  259. package/dist/stream/controller.js.map +1 -0
  260. package/dist/stream/discovery/index.d.ts +2 -0
  261. package/dist/stream/discovery/subagents.cjs +235 -0
  262. package/dist/stream/discovery/subagents.cjs.map +1 -0
  263. package/dist/stream/discovery/subagents.d.cts +18 -0
  264. package/dist/stream/discovery/subagents.d.cts.map +1 -0
  265. package/dist/stream/discovery/subagents.d.ts +18 -0
  266. package/dist/stream/discovery/subagents.d.ts.map +1 -0
  267. package/dist/stream/discovery/subagents.js +235 -0
  268. package/dist/stream/discovery/subagents.js.map +1 -0
  269. package/dist/stream/discovery/subgraphs.cjs +153 -0
  270. package/dist/stream/discovery/subgraphs.cjs.map +1 -0
  271. package/dist/stream/discovery/subgraphs.d.cts +19 -0
  272. package/dist/stream/discovery/subgraphs.d.cts.map +1 -0
  273. package/dist/stream/discovery/subgraphs.d.ts +19 -0
  274. package/dist/stream/discovery/subgraphs.d.ts.map +1 -0
  275. package/dist/stream/discovery/subgraphs.js +153 -0
  276. package/dist/stream/discovery/subgraphs.js.map +1 -0
  277. package/dist/stream/index.cjs +36 -0
  278. package/dist/stream/index.d.cts +25 -0
  279. package/dist/stream/index.d.ts +25 -0
  280. package/dist/stream/index.js +16 -0
  281. package/dist/stream/lifecycle-loading-tracker.cjs +83 -0
  282. package/dist/stream/lifecycle-loading-tracker.cjs.map +1 -0
  283. package/dist/stream/lifecycle-loading-tracker.js +83 -0
  284. package/dist/stream/lifecycle-loading-tracker.js.map +1 -0
  285. package/dist/stream/message-metadata-tracker.cjs +165 -0
  286. package/dist/stream/message-metadata-tracker.cjs.map +1 -0
  287. package/dist/stream/message-metadata-tracker.d.cts +24 -0
  288. package/dist/stream/message-metadata-tracker.d.cts.map +1 -0
  289. package/dist/stream/message-metadata-tracker.d.ts +24 -0
  290. package/dist/stream/message-metadata-tracker.d.ts.map +1 -0
  291. package/dist/stream/message-metadata-tracker.js +165 -0
  292. package/dist/stream/message-metadata-tracker.js.map +1 -0
  293. package/dist/stream/message-reconciliation.cjs +118 -0
  294. package/dist/stream/message-reconciliation.cjs.map +1 -0
  295. package/dist/stream/message-reconciliation.js +115 -0
  296. package/dist/stream/message-reconciliation.js.map +1 -0
  297. package/dist/stream/namespace.cjs +54 -0
  298. package/dist/stream/namespace.cjs.map +1 -0
  299. package/dist/stream/namespace.js +49 -0
  300. package/dist/stream/namespace.js.map +1 -0
  301. package/dist/stream/projections/channel.cjs +53 -0
  302. package/dist/stream/projections/channel.cjs.map +1 -0
  303. package/dist/stream/projections/channel.d.cts +22 -0
  304. package/dist/stream/projections/channel.d.cts.map +1 -0
  305. package/dist/stream/projections/channel.d.ts +22 -0
  306. package/dist/stream/projections/channel.d.ts.map +1 -0
  307. package/dist/stream/projections/channel.js +53 -0
  308. package/dist/stream/projections/channel.js.map +1 -0
  309. package/dist/stream/projections/extension.cjs +29 -0
  310. package/dist/stream/projections/extension.cjs.map +1 -0
  311. package/dist/stream/projections/extension.d.cts +7 -0
  312. package/dist/stream/projections/extension.d.cts.map +1 -0
  313. package/dist/stream/projections/extension.d.ts +7 -0
  314. package/dist/stream/projections/extension.d.ts.map +1 -0
  315. package/dist/stream/projections/extension.js +29 -0
  316. package/dist/stream/projections/extension.js.map +1 -0
  317. package/dist/stream/projections/index.cjs +6 -0
  318. package/dist/stream/projections/index.d.ts +6 -0
  319. package/dist/stream/projections/index.js +7 -0
  320. package/dist/stream/projections/media.cjs +81 -0
  321. package/dist/stream/projections/media.cjs.map +1 -0
  322. package/dist/stream/projections/media.d.cts +18 -0
  323. package/dist/stream/projections/media.d.cts.map +1 -0
  324. package/dist/stream/projections/media.d.ts +18 -0
  325. package/dist/stream/projections/media.d.ts.map +1 -0
  326. package/dist/stream/projections/media.js +78 -0
  327. package/dist/stream/projections/media.js.map +1 -0
  328. package/dist/stream/projections/messages.cjs +121 -0
  329. package/dist/stream/projections/messages.cjs.map +1 -0
  330. package/dist/stream/projections/messages.d.cts +8 -0
  331. package/dist/stream/projections/messages.d.cts.map +1 -0
  332. package/dist/stream/projections/messages.d.ts +8 -0
  333. package/dist/stream/projections/messages.d.ts.map +1 -0
  334. package/dist/stream/projections/messages.js +121 -0
  335. package/dist/stream/projections/messages.js.map +1 -0
  336. package/dist/stream/projections/runtime.cjs +44 -0
  337. package/dist/stream/projections/runtime.cjs.map +1 -0
  338. package/dist/stream/projections/runtime.js +44 -0
  339. package/dist/stream/projections/runtime.js.map +1 -0
  340. package/dist/stream/projections/tool-calls.cjs +50 -0
  341. package/dist/stream/projections/tool-calls.cjs.map +1 -0
  342. package/dist/stream/projections/tool-calls.d.cts +8 -0
  343. package/dist/stream/projections/tool-calls.d.cts.map +1 -0
  344. package/dist/stream/projections/tool-calls.d.ts +8 -0
  345. package/dist/stream/projections/tool-calls.d.ts.map +1 -0
  346. package/dist/stream/projections/tool-calls.js +50 -0
  347. package/dist/stream/projections/tool-calls.js.map +1 -0
  348. package/dist/stream/projections/values.cjs +52 -0
  349. package/dist/stream/projections/values.cjs.map +1 -0
  350. package/dist/stream/projections/values.d.cts +7 -0
  351. package/dist/stream/projections/values.d.cts.map +1 -0
  352. package/dist/stream/projections/values.d.ts +6 -0
  353. package/dist/stream/projections/values.d.ts.map +1 -0
  354. package/dist/stream/projections/values.js +52 -0
  355. package/dist/stream/projections/values.js.map +1 -0
  356. package/dist/stream/root-message-projection.cjs +256 -0
  357. package/dist/stream/root-message-projection.cjs.map +1 -0
  358. package/dist/stream/root-message-projection.js +256 -0
  359. package/dist/stream/root-message-projection.js.map +1 -0
  360. package/dist/stream/store.cjs +32 -0
  361. package/dist/stream/store.cjs.map +1 -0
  362. package/dist/stream/store.d.cts +37 -0
  363. package/dist/stream/store.d.cts.map +1 -0
  364. package/dist/stream/store.d.ts +37 -0
  365. package/dist/stream/store.d.ts.map +1 -0
  366. package/dist/stream/store.js +32 -0
  367. package/dist/stream/store.js.map +1 -0
  368. package/dist/stream/submit-coordinator.cjs +399 -0
  369. package/dist/stream/submit-coordinator.cjs.map +1 -0
  370. package/dist/stream/submit-coordinator.d.cts +27 -0
  371. package/dist/stream/submit-coordinator.d.cts.map +1 -0
  372. package/dist/stream/submit-coordinator.d.ts +27 -0
  373. package/dist/stream/submit-coordinator.d.ts.map +1 -0
  374. package/dist/stream/submit-coordinator.js +397 -0
  375. package/dist/stream/submit-coordinator.js.map +1 -0
  376. package/dist/stream/tool-calls.cjs +15 -0
  377. package/dist/stream/tool-calls.cjs.map +1 -0
  378. package/dist/stream/tool-calls.js +15 -0
  379. package/dist/stream/tool-calls.js.map +1 -0
  380. package/dist/stream/types-inference.d.cts +43 -0
  381. package/dist/stream/types-inference.d.cts.map +1 -0
  382. package/dist/stream/types-inference.d.ts +43 -0
  383. package/dist/stream/types-inference.d.ts.map +1 -0
  384. package/dist/stream/types.d.cts +354 -0
  385. package/dist/stream/types.d.cts.map +1 -0
  386. package/dist/stream/types.d.ts +354 -0
  387. package/dist/stream/types.d.ts.map +1 -0
  388. package/dist/types.d.cts +2 -1
  389. package/dist/types.d.cts.map +1 -1
  390. package/dist/types.d.ts +2 -1
  391. package/dist/types.d.ts.map +1 -1
  392. package/dist/ui/index.cjs +1 -1
  393. package/dist/ui/index.d.cts +3 -3
  394. package/dist/ui/index.d.ts +3 -3
  395. package/dist/ui/index.js +1 -1
  396. package/dist/ui/manager.cjs +1 -1
  397. package/dist/ui/manager.js +1 -1
  398. package/dist/ui/messages.cjs +50 -7
  399. package/dist/ui/messages.cjs.map +1 -1
  400. package/dist/ui/messages.d.cts.map +1 -1
  401. package/dist/ui/messages.d.ts.map +1 -1
  402. package/dist/ui/messages.js +51 -9
  403. package/dist/ui/messages.js.map +1 -1
  404. package/dist/ui/orchestrator-custom.cjs +1 -1
  405. package/dist/ui/orchestrator-custom.js +1 -1
  406. package/dist/ui/orchestrator.cjs +2 -2
  407. package/dist/ui/orchestrator.d.cts +1 -1
  408. package/dist/ui/orchestrator.d.ts +1 -1
  409. package/dist/ui/orchestrator.d.ts.map +1 -1
  410. package/dist/ui/orchestrator.js +2 -2
  411. package/dist/ui/stream/agent.d.cts +1 -1
  412. package/dist/ui/stream/agent.d.cts.map +1 -1
  413. package/dist/ui/stream/agent.d.ts +1 -1
  414. package/dist/ui/stream/agent.d.ts.map +1 -1
  415. package/dist/ui/stream/base.d.cts +7 -6
  416. package/dist/ui/stream/base.d.cts.map +1 -1
  417. package/dist/ui/stream/base.d.ts +7 -6
  418. package/dist/ui/stream/base.d.ts.map +1 -1
  419. package/dist/ui/stream/deep-agent.d.cts +1 -1
  420. package/dist/ui/stream/deep-agent.d.cts.map +1 -1
  421. package/dist/ui/stream/deep-agent.d.ts +1 -1
  422. package/dist/ui/stream/deep-agent.d.ts.map +1 -1
  423. package/dist/ui/stream/index.d.cts +4 -4
  424. package/dist/ui/stream/index.d.cts.map +1 -1
  425. package/dist/ui/stream/index.d.ts +4 -4
  426. package/dist/ui/stream/index.d.ts.map +1 -1
  427. package/dist/ui/types.d.cts +3 -2
  428. package/dist/ui/types.d.cts.map +1 -1
  429. package/dist/ui/types.d.ts +2 -1
  430. package/dist/ui/types.d.ts.map +1 -1
  431. package/package.json +18 -8
  432. package/dist/client.cjs.map +0 -1
  433. package/dist/client.d.cts.map +0 -1
  434. package/dist/client.d.ts.map +0 -1
  435. package/dist/client.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.cjs","names":["namespaceKey","isRootNamespace","openProjectionSubscription"],"sources":["../../../src/stream/projections/channel.ts"],"sourcesContent":["/**\n * Raw channel escape hatch.\n *\n * Subscribes to an arbitrary list of channels at an arbitrary\n * namespace and retains a bounded buffer of events. Consumers that\n * need assembly semantics should use `messagesProjection`,\n * `toolCallsProjection`, etc. instead; this one is for inspection,\n * custom reducers, or niche use-cases.\n */\nimport type { Channel, Event } from \"@langchain/protocol\";\nimport type { ProjectionSpec, ProjectionRuntime } from \"../types.js\";\nimport { isRootNamespace, namespaceKey } from \"../namespace.js\";\nimport { openProjectionSubscription } from \"./runtime.js\";\n\n/** Max events retained per raw subscription. Older events are dropped. */\nconst DEFAULT_BUFFER = 4096;\n\nexport interface ChannelProjectionOptions {\n /**\n * Maximum number of events retained in the projection snapshot.\n * Defaults to 4096 so replay-backed discovery hooks can tolerate\n * bursty token/media streams without dropping early lifecycle events.\n */\n bufferSize?: number;\n /**\n * Whether to open a real subscription and receive replayed history.\n * Defaults to true. Set false for live-only root-bus inspection when\n * replay is unnecessary.\n */\n replay?: boolean;\n}\n\nexport function channelProjection(\n channels: readonly Channel[],\n namespace: readonly string[],\n options: ChannelProjectionOptions = {}\n): ProjectionSpec<Event[]> {\n const chs = [...channels].sort();\n const ns = [...namespace];\n const bufferSize = options.bufferSize ?? DEFAULT_BUFFER;\n const replay = options.replay ?? true;\n const key = `channel|${bufferSize}|${replay ? \"replay\" : \"live\"}|${chs.join(\",\")}|${namespaceKey(ns)}`;\n\n return {\n key,\n namespace: ns,\n initial: [],\n open({ thread, store, rootBus }): ProjectionRuntime {\n // If this projection is scoped to the root namespace AND every\n // requested channel is already covered by the controller's root\n // pump, attach to the shared fan-out instead of opening a\n // second server subscription. This is the common case for\n // lightweight event-trace / debug panels.\n const covered =\n !replay &&\n isRootNamespace(ns) &&\n chs.every((c) => rootBus.channels.includes(c));\n\n if (covered) {\n const requestedSet = new Set(chs as Channel[]);\n // Pre-compute `custom:<name>` sub-filters so incoming events\n // can be matched in O(1). The server delivers named custom\n // events as `{ method: \"custom\", params: { data: { name } } }`,\n // so matching purely on `event.method` would miss them — we\n // need to peek at `data.name` when the caller asked for a\n // specific `custom:<name>` channel.\n const namedCustom = new Set<string>();\n for (const channel of chs) {\n if (channel.startsWith(\"custom:\")) {\n namedCustom.add(channel.slice(\"custom:\".length));\n }\n }\n const matches = (event: Event): boolean => {\n if (requestedSet.has(event.method as Channel)) return true;\n if (event.method !== \"custom\" || namedCustom.size === 0) {\n return false;\n }\n const data = (event.params as Record<string, unknown>).data as\n | { name?: unknown }\n | undefined;\n return typeof data?.name === \"string\" && namedCustom.has(data.name);\n };\n const push = (event: Event): void => {\n if (!matches(event)) return;\n const current = store.getSnapshot();\n const next =\n current.length >= bufferSize\n ? [...current.slice(current.length - bufferSize + 1), event]\n : [...current, event];\n store.setValue(next);\n };\n const unsubscribe = rootBus.subscribe(push);\n return {\n dispose() {\n unsubscribe();\n },\n };\n }\n\n return openProjectionSubscription({\n thread,\n channels: chs as Channel[],\n namespace: ns,\n onEvent(event) {\n const current = store.getSnapshot();\n const next =\n current.length >= bufferSize\n ? [...current.slice(current.length - bufferSize + 1), event]\n : [...current, event];\n store.setValue(next);\n },\n });\n },\n };\n}\n"],"mappings":";;;;AAeA,MAAM,iBAAiB;AAiBvB,SAAgB,kBACd,UACA,WACA,UAAoC,EAAE,EACb;CACzB,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM;CAChC,MAAM,KAAK,CAAC,GAAG,UAAU;CACzB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,SAAS,QAAQ,UAAU;AAGjC,QAAO;EACL,KAHU,WAAW,WAAW,GAAG,SAAS,WAAW,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,GAAGA,kBAAAA,aAAa,GAAG;EAIlG,WAAW;EACX,SAAS,EAAE;EACX,KAAK,EAAE,QAAQ,OAAO,WAA8B;AAWlD,OAJE,CAAC,UACDC,kBAAAA,gBAAgB,GAAG,IACnB,IAAI,OAAO,MAAM,QAAQ,SAAS,SAAS,EAAE,CAAC,EAEnC;IACX,MAAM,eAAe,IAAI,IAAI,IAAiB;IAO9C,MAAM,8BAAc,IAAI,KAAa;AACrC,SAAK,MAAM,WAAW,IACpB,KAAI,QAAQ,WAAW,UAAU,CAC/B,aAAY,IAAI,QAAQ,MAAM,EAAiB,CAAC;IAGpD,MAAM,WAAW,UAA0B;AACzC,SAAI,aAAa,IAAI,MAAM,OAAkB,CAAE,QAAO;AACtD,SAAI,MAAM,WAAW,YAAY,YAAY,SAAS,EACpD,QAAO;KAET,MAAM,OAAQ,MAAM,OAAmC;AAGvD,YAAO,OAAO,MAAM,SAAS,YAAY,YAAY,IAAI,KAAK,KAAK;;IAErE,MAAM,QAAQ,UAAuB;AACnC,SAAI,CAAC,QAAQ,MAAM,CAAE;KACrB,MAAM,UAAU,MAAM,aAAa;KACnC,MAAM,OACJ,QAAQ,UAAU,aACd,CAAC,GAAG,QAAQ,MAAM,QAAQ,SAAS,aAAa,EAAE,EAAE,MAAM,GAC1D,CAAC,GAAG,SAAS,MAAM;AACzB,WAAM,SAAS,KAAK;;IAEtB,MAAM,cAAc,QAAQ,UAAU,KAAK;AAC3C,WAAO,EACL,UAAU;AACR,kBAAa;OAEhB;;AAGH,UAAOC,gBAAAA,2BAA2B;IAChC;IACA,UAAU;IACV,WAAW;IACX,QAAQ,OAAO;KACb,MAAM,UAAU,MAAM,aAAa;KACnC,MAAM,OACJ,QAAQ,UAAU,aACd,CAAC,GAAG,QAAQ,MAAM,QAAQ,SAAS,aAAa,EAAE,EAAE,MAAM,GAC1D,CAAC,GAAG,SAAS,MAAM;AACzB,WAAM,SAAS,KAAK;;IAEvB,CAAC;;EAEL"}
@@ -0,0 +1,22 @@
1
+ import { ProjectionSpec } from "../types.cjs";
2
+ import { Channel, Event } from "@langchain/protocol";
3
+
4
+ //#region src/stream/projections/channel.d.ts
5
+ interface ChannelProjectionOptions {
6
+ /**
7
+ * Maximum number of events retained in the projection snapshot.
8
+ * Defaults to 4096 so replay-backed discovery hooks can tolerate
9
+ * bursty token/media streams without dropping early lifecycle events.
10
+ */
11
+ bufferSize?: number;
12
+ /**
13
+ * Whether to open a real subscription and receive replayed history.
14
+ * Defaults to true. Set false for live-only root-bus inspection when
15
+ * replay is unnecessary.
16
+ */
17
+ replay?: boolean;
18
+ }
19
+ declare function channelProjection(channels: readonly Channel[], namespace: readonly string[], options?: ChannelProjectionOptions): ProjectionSpec<Event[]>;
20
+ //#endregion
21
+ export { ChannelProjectionOptions, channelProjection };
22
+ //# sourceMappingURL=channel.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.cts","names":[],"sources":["../../../src/stream/projections/channel.ts"],"mappings":";;;;UAiBiB,wBAAA;EAgBI;;;;;EAVnB,UAAA;EAUmB;;;;;EAJnB,MAAA;AAAA;AAAA,iBAGc,iBAAA,CACd,QAAA,WAAmB,OAAA,IACnB,SAAA,qBACA,OAAA,GAAS,wBAAA,GACR,cAAA,CAAe,KAAA"}
@@ -0,0 +1,22 @@
1
+ import { ProjectionSpec } from "../types.js";
2
+ import { Channel, Event } from "@langchain/protocol";
3
+
4
+ //#region src/stream/projections/channel.d.ts
5
+ interface ChannelProjectionOptions {
6
+ /**
7
+ * Maximum number of events retained in the projection snapshot.
8
+ * Defaults to 4096 so replay-backed discovery hooks can tolerate
9
+ * bursty token/media streams without dropping early lifecycle events.
10
+ */
11
+ bufferSize?: number;
12
+ /**
13
+ * Whether to open a real subscription and receive replayed history.
14
+ * Defaults to true. Set false for live-only root-bus inspection when
15
+ * replay is unnecessary.
16
+ */
17
+ replay?: boolean;
18
+ }
19
+ declare function channelProjection(channels: readonly Channel[], namespace: readonly string[], options?: ChannelProjectionOptions): ProjectionSpec<Event[]>;
20
+ //#endregion
21
+ export { ChannelProjectionOptions, channelProjection };
22
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","names":[],"sources":["../../../src/stream/projections/channel.ts"],"mappings":";;;;UAiBiB,wBAAA;EAgBI;;;;;EAVnB,UAAA;EAUmB;;;;;EAJnB,MAAA;AAAA;AAAA,iBAGc,iBAAA,CACd,QAAA,WAAmB,OAAA,IACnB,SAAA,qBACA,OAAA,GAAS,wBAAA,GACR,cAAA,CAAe,KAAA"}
@@ -0,0 +1,53 @@
1
+ import { isRootNamespace, namespaceKey } from "../namespace.js";
2
+ import { openProjectionSubscription } from "./runtime.js";
3
+ //#region src/stream/projections/channel.ts
4
+ /** Max events retained per raw subscription. Older events are dropped. */
5
+ const DEFAULT_BUFFER = 4096;
6
+ function channelProjection(channels, namespace, options = {}) {
7
+ const chs = [...channels].sort();
8
+ const ns = [...namespace];
9
+ const bufferSize = options.bufferSize ?? DEFAULT_BUFFER;
10
+ const replay = options.replay ?? true;
11
+ return {
12
+ key: `channel|${bufferSize}|${replay ? "replay" : "live"}|${chs.join(",")}|${namespaceKey(ns)}`,
13
+ namespace: ns,
14
+ initial: [],
15
+ open({ thread, store, rootBus }) {
16
+ if (!replay && isRootNamespace(ns) && chs.every((c) => rootBus.channels.includes(c))) {
17
+ const requestedSet = new Set(chs);
18
+ const namedCustom = /* @__PURE__ */ new Set();
19
+ for (const channel of chs) if (channel.startsWith("custom:")) namedCustom.add(channel.slice(7));
20
+ const matches = (event) => {
21
+ if (requestedSet.has(event.method)) return true;
22
+ if (event.method !== "custom" || namedCustom.size === 0) return false;
23
+ const data = event.params.data;
24
+ return typeof data?.name === "string" && namedCustom.has(data.name);
25
+ };
26
+ const push = (event) => {
27
+ if (!matches(event)) return;
28
+ const current = store.getSnapshot();
29
+ const next = current.length >= bufferSize ? [...current.slice(current.length - bufferSize + 1), event] : [...current, event];
30
+ store.setValue(next);
31
+ };
32
+ const unsubscribe = rootBus.subscribe(push);
33
+ return { dispose() {
34
+ unsubscribe();
35
+ } };
36
+ }
37
+ return openProjectionSubscription({
38
+ thread,
39
+ channels: chs,
40
+ namespace: ns,
41
+ onEvent(event) {
42
+ const current = store.getSnapshot();
43
+ const next = current.length >= bufferSize ? [...current.slice(current.length - bufferSize + 1), event] : [...current, event];
44
+ store.setValue(next);
45
+ }
46
+ });
47
+ }
48
+ };
49
+ }
50
+ //#endregion
51
+ export { channelProjection };
52
+
53
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","names":[],"sources":["../../../src/stream/projections/channel.ts"],"sourcesContent":["/**\n * Raw channel escape hatch.\n *\n * Subscribes to an arbitrary list of channels at an arbitrary\n * namespace and retains a bounded buffer of events. Consumers that\n * need assembly semantics should use `messagesProjection`,\n * `toolCallsProjection`, etc. instead; this one is for inspection,\n * custom reducers, or niche use-cases.\n */\nimport type { Channel, Event } from \"@langchain/protocol\";\nimport type { ProjectionSpec, ProjectionRuntime } from \"../types.js\";\nimport { isRootNamespace, namespaceKey } from \"../namespace.js\";\nimport { openProjectionSubscription } from \"./runtime.js\";\n\n/** Max events retained per raw subscription. Older events are dropped. */\nconst DEFAULT_BUFFER = 4096;\n\nexport interface ChannelProjectionOptions {\n /**\n * Maximum number of events retained in the projection snapshot.\n * Defaults to 4096 so replay-backed discovery hooks can tolerate\n * bursty token/media streams without dropping early lifecycle events.\n */\n bufferSize?: number;\n /**\n * Whether to open a real subscription and receive replayed history.\n * Defaults to true. Set false for live-only root-bus inspection when\n * replay is unnecessary.\n */\n replay?: boolean;\n}\n\nexport function channelProjection(\n channels: readonly Channel[],\n namespace: readonly string[],\n options: ChannelProjectionOptions = {}\n): ProjectionSpec<Event[]> {\n const chs = [...channels].sort();\n const ns = [...namespace];\n const bufferSize = options.bufferSize ?? DEFAULT_BUFFER;\n const replay = options.replay ?? true;\n const key = `channel|${bufferSize}|${replay ? \"replay\" : \"live\"}|${chs.join(\",\")}|${namespaceKey(ns)}`;\n\n return {\n key,\n namespace: ns,\n initial: [],\n open({ thread, store, rootBus }): ProjectionRuntime {\n // If this projection is scoped to the root namespace AND every\n // requested channel is already covered by the controller's root\n // pump, attach to the shared fan-out instead of opening a\n // second server subscription. This is the common case for\n // lightweight event-trace / debug panels.\n const covered =\n !replay &&\n isRootNamespace(ns) &&\n chs.every((c) => rootBus.channels.includes(c));\n\n if (covered) {\n const requestedSet = new Set(chs as Channel[]);\n // Pre-compute `custom:<name>` sub-filters so incoming events\n // can be matched in O(1). The server delivers named custom\n // events as `{ method: \"custom\", params: { data: { name } } }`,\n // so matching purely on `event.method` would miss them — we\n // need to peek at `data.name` when the caller asked for a\n // specific `custom:<name>` channel.\n const namedCustom = new Set<string>();\n for (const channel of chs) {\n if (channel.startsWith(\"custom:\")) {\n namedCustom.add(channel.slice(\"custom:\".length));\n }\n }\n const matches = (event: Event): boolean => {\n if (requestedSet.has(event.method as Channel)) return true;\n if (event.method !== \"custom\" || namedCustom.size === 0) {\n return false;\n }\n const data = (event.params as Record<string, unknown>).data as\n | { name?: unknown }\n | undefined;\n return typeof data?.name === \"string\" && namedCustom.has(data.name);\n };\n const push = (event: Event): void => {\n if (!matches(event)) return;\n const current = store.getSnapshot();\n const next =\n current.length >= bufferSize\n ? [...current.slice(current.length - bufferSize + 1), event]\n : [...current, event];\n store.setValue(next);\n };\n const unsubscribe = rootBus.subscribe(push);\n return {\n dispose() {\n unsubscribe();\n },\n };\n }\n\n return openProjectionSubscription({\n thread,\n channels: chs as Channel[],\n namespace: ns,\n onEvent(event) {\n const current = store.getSnapshot();\n const next =\n current.length >= bufferSize\n ? [...current.slice(current.length - bufferSize + 1), event]\n : [...current, event];\n store.setValue(next);\n },\n });\n },\n };\n}\n"],"mappings":";;;;AAeA,MAAM,iBAAiB;AAiBvB,SAAgB,kBACd,UACA,WACA,UAAoC,EAAE,EACb;CACzB,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM;CAChC,MAAM,KAAK,CAAC,GAAG,UAAU;CACzB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,SAAS,QAAQ,UAAU;AAGjC,QAAO;EACL,KAHU,WAAW,WAAW,GAAG,SAAS,WAAW,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,aAAa,GAAG;EAIlG,WAAW;EACX,SAAS,EAAE;EACX,KAAK,EAAE,QAAQ,OAAO,WAA8B;AAWlD,OAJE,CAAC,UACD,gBAAgB,GAAG,IACnB,IAAI,OAAO,MAAM,QAAQ,SAAS,SAAS,EAAE,CAAC,EAEnC;IACX,MAAM,eAAe,IAAI,IAAI,IAAiB;IAO9C,MAAM,8BAAc,IAAI,KAAa;AACrC,SAAK,MAAM,WAAW,IACpB,KAAI,QAAQ,WAAW,UAAU,CAC/B,aAAY,IAAI,QAAQ,MAAM,EAAiB,CAAC;IAGpD,MAAM,WAAW,UAA0B;AACzC,SAAI,aAAa,IAAI,MAAM,OAAkB,CAAE,QAAO;AACtD,SAAI,MAAM,WAAW,YAAY,YAAY,SAAS,EACpD,QAAO;KAET,MAAM,OAAQ,MAAM,OAAmC;AAGvD,YAAO,OAAO,MAAM,SAAS,YAAY,YAAY,IAAI,KAAK,KAAK;;IAErE,MAAM,QAAQ,UAAuB;AACnC,SAAI,CAAC,QAAQ,MAAM,CAAE;KACrB,MAAM,UAAU,MAAM,aAAa;KACnC,MAAM,OACJ,QAAQ,UAAU,aACd,CAAC,GAAG,QAAQ,MAAM,QAAQ,SAAS,aAAa,EAAE,EAAE,MAAM,GAC1D,CAAC,GAAG,SAAS,MAAM;AACzB,WAAM,SAAS,KAAK;;IAEtB,MAAM,cAAc,QAAQ,UAAU,KAAK;AAC3C,WAAO,EACL,UAAU;AACR,kBAAa;OAEhB;;AAGH,UAAO,2BAA2B;IAChC;IACA,UAAU;IACV,WAAW;IACX,QAAQ,OAAO;KACb,MAAM,UAAU,MAAM,aAAa;KACnC,MAAM,OACJ,QAAQ,UAAU,aACd,CAAC,GAAG,QAAQ,MAAM,QAAQ,SAAS,aAAa,EAAE,EAAE,MAAM,GAC1D,CAAC,GAAG,SAAS,MAAM;AACzB,WAAM,SAAS,KAAK;;IAEvB,CAAC;;EAEL"}
@@ -0,0 +1,29 @@
1
+ const require_namespace = require("../namespace.cjs");
2
+ const require_runtime = require("./runtime.cjs");
3
+ //#region src/stream/projections/extension.ts
4
+ function extensionProjection(name, namespace) {
5
+ const ns = [...namespace];
6
+ return {
7
+ key: `extension|${name}|${require_namespace.namespaceKey(ns)}`,
8
+ namespace: ns,
9
+ initial: void 0,
10
+ open({ thread, store }) {
11
+ return require_runtime.openProjectionSubscription({
12
+ thread,
13
+ channels: [`custom:${name}`],
14
+ namespace: ns,
15
+ resumeOnPause: true,
16
+ onEvent(event) {
17
+ const data = event.params.data;
18
+ const payload = data?.payload != null && typeof data.payload === "object" && "name" in data.payload ? data.payload : data;
19
+ if (payload?.name !== name) return;
20
+ store.setValue(payload.payload);
21
+ }
22
+ });
23
+ }
24
+ };
25
+ }
26
+ //#endregion
27
+ exports.extensionProjection = extensionProjection;
28
+
29
+ //# sourceMappingURL=extension.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.cjs","names":["namespaceKey","openProjectionSubscription"],"sources":["../../../src/stream/projections/extension.ts"],"sourcesContent":["/**\n * Namespace-scoped `custom:<name>` projection (stream extension).\n *\n * Opens a `custom` subscription and filters named events client-side.\n * The store retains the most-recent payload for the requested\n * transformer. Consumers that want the entire event history should use\n * the raw channel projection instead.\n */\nimport type { ProjectionSpec, ProjectionRuntime } from \"../types.js\";\nimport type { Event } from \"@langchain/protocol\";\nimport { namespaceKey } from \"../namespace.js\";\nimport { openProjectionSubscription } from \"./runtime.js\";\n\nexport function extensionProjection<T = unknown>(\n name: string,\n namespace: readonly string[]\n): ProjectionSpec<T | undefined> {\n const ns = [...namespace];\n const key = `extension|${name}|${namespaceKey(ns)}`;\n\n return {\n key,\n namespace: ns,\n initial: undefined,\n open({ thread, store }): ProjectionRuntime {\n return openProjectionSubscription({\n thread,\n channels: [`custom:${name}`],\n namespace: ns,\n resumeOnPause: true,\n onEvent(event: Event) {\n const data = event.params.data as\n | {\n name?: unknown;\n payload?: unknown;\n }\n | undefined;\n const payload =\n data?.payload != null &&\n typeof data.payload === \"object\" &&\n \"name\" in data.payload\n ? (data.payload as { name?: unknown; payload?: unknown })\n : data;\n if (payload?.name !== name) return;\n store.setValue(payload.payload as T);\n },\n });\n },\n };\n}\n"],"mappings":";;;AAaA,SAAgB,oBACd,MACA,WAC+B;CAC/B,MAAM,KAAK,CAAC,GAAG,UAAU;AAGzB,QAAO;EACL,KAHU,aAAa,KAAK,GAAGA,kBAAAA,aAAa,GAAG;EAI/C,WAAW;EACX,SAAS,KAAA;EACT,KAAK,EAAE,QAAQ,SAA4B;AACzC,UAAOC,gBAAAA,2BAA2B;IAChC;IACA,UAAU,CAAC,UAAU,OAAO;IAC5B,WAAW;IACX,eAAe;IACf,QAAQ,OAAc;KACpB,MAAM,OAAO,MAAM,OAAO;KAM1B,MAAM,UACJ,MAAM,WAAW,QACjB,OAAO,KAAK,YAAY,YACxB,UAAU,KAAK,UACV,KAAK,UACN;AACN,SAAI,SAAS,SAAS,KAAM;AAC5B,WAAM,SAAS,QAAQ,QAAa;;IAEvC,CAAC;;EAEL"}
@@ -0,0 +1,7 @@
1
+ import { ProjectionSpec } from "../types.cjs";
2
+
3
+ //#region src/stream/projections/extension.d.ts
4
+ declare function extensionProjection<T = unknown>(name: string, namespace: readonly string[]): ProjectionSpec<T | undefined>;
5
+ //#endregion
6
+ export { extensionProjection };
7
+ //# sourceMappingURL=extension.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/stream/projections/extension.ts"],"mappings":";;;iBAagB,mBAAA,aAAA,CACd,IAAA,UACA,SAAA,sBACC,cAAA,CAAe,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { ProjectionSpec } from "../types.js";
2
+
3
+ //#region src/stream/projections/extension.d.ts
4
+ declare function extensionProjection<T = unknown>(name: string, namespace: readonly string[]): ProjectionSpec<T | undefined>;
5
+ //#endregion
6
+ export { extensionProjection };
7
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","names":[],"sources":["../../../src/stream/projections/extension.ts"],"mappings":";;;iBAagB,mBAAA,aAAA,CACd,IAAA,UACA,SAAA,sBACC,cAAA,CAAe,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { namespaceKey } from "../namespace.js";
2
+ import { openProjectionSubscription } from "./runtime.js";
3
+ //#region src/stream/projections/extension.ts
4
+ function extensionProjection(name, namespace) {
5
+ const ns = [...namespace];
6
+ return {
7
+ key: `extension|${name}|${namespaceKey(ns)}`,
8
+ namespace: ns,
9
+ initial: void 0,
10
+ open({ thread, store }) {
11
+ return openProjectionSubscription({
12
+ thread,
13
+ channels: [`custom:${name}`],
14
+ namespace: ns,
15
+ resumeOnPause: true,
16
+ onEvent(event) {
17
+ const data = event.params.data;
18
+ const payload = data?.payload != null && typeof data.payload === "object" && "name" in data.payload ? data.payload : data;
19
+ if (payload?.name !== name) return;
20
+ store.setValue(payload.payload);
21
+ }
22
+ });
23
+ }
24
+ };
25
+ }
26
+ //#endregion
27
+ export { extensionProjection };
28
+
29
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","names":[],"sources":["../../../src/stream/projections/extension.ts"],"sourcesContent":["/**\n * Namespace-scoped `custom:<name>` projection (stream extension).\n *\n * Opens a `custom` subscription and filters named events client-side.\n * The store retains the most-recent payload for the requested\n * transformer. Consumers that want the entire event history should use\n * the raw channel projection instead.\n */\nimport type { ProjectionSpec, ProjectionRuntime } from \"../types.js\";\nimport type { Event } from \"@langchain/protocol\";\nimport { namespaceKey } from \"../namespace.js\";\nimport { openProjectionSubscription } from \"./runtime.js\";\n\nexport function extensionProjection<T = unknown>(\n name: string,\n namespace: readonly string[]\n): ProjectionSpec<T | undefined> {\n const ns = [...namespace];\n const key = `extension|${name}|${namespaceKey(ns)}`;\n\n return {\n key,\n namespace: ns,\n initial: undefined,\n open({ thread, store }): ProjectionRuntime {\n return openProjectionSubscription({\n thread,\n channels: [`custom:${name}`],\n namespace: ns,\n resumeOnPause: true,\n onEvent(event: Event) {\n const data = event.params.data as\n | {\n name?: unknown;\n payload?: unknown;\n }\n | undefined;\n const payload =\n data?.payload != null &&\n typeof data.payload === \"object\" &&\n \"name\" in data.payload\n ? (data.payload as { name?: unknown; payload?: unknown })\n : data;\n if (payload?.name !== name) return;\n store.setValue(payload.payload as T);\n },\n });\n },\n };\n}\n"],"mappings":";;;AAaA,SAAgB,oBACd,MACA,WAC+B;CAC/B,MAAM,KAAK,CAAC,GAAG,UAAU;AAGzB,QAAO;EACL,KAHU,aAAa,KAAK,GAAG,aAAa,GAAG;EAI/C,WAAW;EACX,SAAS,KAAA;EACT,KAAK,EAAE,QAAQ,SAA4B;AACzC,UAAO,2BAA2B;IAChC;IACA,UAAU,CAAC,UAAU,OAAO;IAC5B,WAAW;IACX,eAAe;IACf,QAAQ,OAAc;KACpB,MAAM,OAAO,MAAM,OAAO;KAM1B,MAAM,UACJ,MAAM,WAAW,QACjB,OAAO,KAAK,YAAY,YACxB,UAAU,KAAK,UACV,KAAK,UACN;AACN,SAAI,SAAS,SAAS,KAAM;AAC5B,WAAM,SAAS,QAAQ,QAAa;;IAEvC,CAAC;;EAEL"}
@@ -0,0 +1,6 @@
1
+ require("./messages.cjs");
2
+ require("./tool-calls.cjs");
3
+ require("./values.cjs");
4
+ require("./extension.cjs");
5
+ require("./channel.cjs");
6
+ require("./media.cjs");
@@ -0,0 +1,6 @@
1
+ import { messagesProjection } from "./messages.js";
2
+ import { toolCallsProjection } from "./tool-calls.js";
3
+ import { valuesProjection } from "./values.js";
4
+ import { extensionProjection } from "./extension.js";
5
+ import { ChannelProjectionOptions, channelProjection } from "./channel.js";
6
+ import { MediaProjectionOptions, audioProjection, filesProjection, imagesProjection, videoProjection } from "./media.js";
@@ -0,0 +1,7 @@
1
+ import "./messages.js";
2
+ import "./tool-calls.js";
3
+ import "./values.js";
4
+ import "./extension.js";
5
+ import "./channel.js";
6
+ import "./media.js";
7
+ export {};
@@ -0,0 +1,81 @@
1
+ const require_media = require("../../client/stream/media.cjs");
2
+ const require_namespace = require("../namespace.cjs");
3
+ const require_runtime = require("./runtime.cjs");
4
+ //#region src/stream/projections/media.ts
5
+ function createMediaProjection(kind, namespace, buildAssembler, options) {
6
+ const ns = [...namespace];
7
+ return {
8
+ key: `${kind}|${require_namespace.namespaceKey(ns)}`,
9
+ namespace: ns,
10
+ initial: [],
11
+ open({ thread, store, rootBus }) {
12
+ const assembler = buildAssembler((media) => {
13
+ store.setValue([...store.getSnapshot(), media]);
14
+ }, options);
15
+ if (require_namespace.isRootNamespace(ns) && rootBus.channels.includes("messages")) {
16
+ const unsubscribe = rootBus.subscribe((event) => {
17
+ if (event.method !== "messages") return;
18
+ if (!require_namespace.isRootNamespace(event.params.namespace)) return;
19
+ assembler.consume(event);
20
+ });
21
+ return { async dispose() {
22
+ unsubscribe();
23
+ for (const media of store.getSnapshot()) try {
24
+ media.revoke();
25
+ } catch {}
26
+ assembler.close();
27
+ } };
28
+ }
29
+ const runtime = require_runtime.openProjectionSubscription({
30
+ thread,
31
+ channels: ["messages"],
32
+ namespace: ns,
33
+ onEvent(event) {
34
+ if (event.method !== "messages") return;
35
+ assembler.consume(event);
36
+ },
37
+ onFinally() {
38
+ assembler.close();
39
+ }
40
+ });
41
+ return { async dispose() {
42
+ for (const media of store.getSnapshot()) try {
43
+ media.revoke();
44
+ } catch {}
45
+ assembler.close();
46
+ await runtime.dispose();
47
+ } };
48
+ }
49
+ };
50
+ }
51
+ function audioProjection(namespace, options) {
52
+ return createMediaProjection("audio", namespace, (push, opts) => new require_media.MediaAssembler({
53
+ fetch: opts?.fetch,
54
+ onAudio: (m) => push(m)
55
+ }), options);
56
+ }
57
+ function imagesProjection(namespace, options) {
58
+ return createMediaProjection("images", namespace, (push, opts) => new require_media.MediaAssembler({
59
+ fetch: opts?.fetch,
60
+ onImage: (m) => push(m)
61
+ }), options);
62
+ }
63
+ function videoProjection(namespace, options) {
64
+ return createMediaProjection("video", namespace, (push, opts) => new require_media.MediaAssembler({
65
+ fetch: opts?.fetch,
66
+ onVideo: (m) => push(m)
67
+ }), options);
68
+ }
69
+ function filesProjection(namespace, options) {
70
+ return createMediaProjection("files", namespace, (push, opts) => new require_media.MediaAssembler({
71
+ fetch: opts?.fetch,
72
+ onFile: (m) => push(m)
73
+ }), options);
74
+ }
75
+ //#endregion
76
+ exports.audioProjection = audioProjection;
77
+ exports.filesProjection = filesProjection;
78
+ exports.imagesProjection = imagesProjection;
79
+ exports.videoProjection = videoProjection;
80
+
81
+ //# sourceMappingURL=media.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.cjs","names":["namespaceKey","isRootNamespace","openProjectionSubscription","MediaAssembler"],"sources":["../../../src/stream/projections/media.ts"],"sourcesContent":["/**\n * Namespace-scoped media projections.\n *\n * Each factory opens `thread.subscribe({ channels: [\"messages\"],\n * namespaces: [ns] })`, runs the events through a {@link MediaAssembler},\n * filters to one media block type, and surfaces an array of handles\n * that grows as messages with that type are observed.\n *\n * Behaviour mirrors the iterables on `ThreadStream` / `SubgraphHandle` /\n * `SubagentHandle`:\n * - One handle per `(messageId, blockType)`.\n * - Yielded on the first matching `content-block-start` — messages\n * with no matching blocks never appear.\n * - Errors propagate through `handle.error` / rejected `blob` /\n * rejected `objectURL`, not through the projection itself.\n *\n * `objectURL`s minted from these handles are caller-owned. The\n * companion `useMediaURL` React hook revokes on unmount; non-React\n * consumers should call `media.revoke()` when done.\n */\nimport type { Event, MessagesEvent } from \"@langchain/protocol\";\nimport { MediaAssembler } from \"../../client/stream/media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../../client/stream/media.js\";\nimport type { ProjectionRuntime, ProjectionSpec } from \"../types.js\";\nimport { isRootNamespace, namespaceKey } from \"../namespace.js\";\nimport { openProjectionSubscription } from \"./runtime.js\";\n\ninterface MediaProjectionOptions {\n /**\n * Optional `fetch` for URL-sourced blocks. Forwarded into the\n * underlying {@link MediaAssembler}.\n */\n fetch?: typeof fetch;\n}\n\nfunction createMediaProjection<\n T extends AudioMedia | ImageMedia | VideoMedia | FileMedia,\n>(\n kind: \"audio\" | \"images\" | \"video\" | \"files\",\n namespace: readonly string[],\n buildAssembler: (\n push: (m: T) => void,\n options?: MediaProjectionOptions\n ) => MediaAssembler,\n options?: MediaProjectionOptions\n): ProjectionSpec<T[]> {\n const ns = [...namespace];\n const key = `${kind}|${namespaceKey(ns)}`;\n\n return {\n key,\n namespace: ns,\n initial: [],\n open({ thread, store, rootBus }): ProjectionRuntime {\n const assembler = buildAssembler((media) => {\n store.setValue([...store.getSnapshot(), media]);\n }, options);\n\n // The root pump is already subscribed to `messages` at root depth 1.\n // Root-scoped projections attach to it instead of opening a second\n // server subscription.\n const rootShortCircuit =\n isRootNamespace(ns) && rootBus.channels.includes(\"messages\");\n\n if (rootShortCircuit) {\n const unsubscribe = rootBus.subscribe((event) => {\n if (event.method !== \"messages\") return;\n const matches = isRootNamespace(event.params.namespace);\n if (!matches) return;\n assembler.consume(event as MessagesEvent);\n });\n return {\n async dispose() {\n unsubscribe();\n for (const media of store.getSnapshot()) {\n try {\n media.revoke();\n } catch {\n // best-effort\n }\n }\n assembler.close();\n },\n };\n }\n\n const runtime = openProjectionSubscription({\n thread,\n channels: [\"messages\"],\n namespace: ns,\n onEvent(event: Event) {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n onFinally() {\n assembler.close();\n },\n });\n\n return {\n async dispose() {\n // Revoke object URLs minted by handles owned by this\n // projection so unmount cleans up regardless of whether\n // individual hooks called `revoke()` themselves.\n for (const media of store.getSnapshot()) {\n try {\n media.revoke();\n } catch {\n // best-effort\n }\n }\n assembler.close();\n await runtime.dispose();\n },\n };\n },\n };\n}\n\nexport function audioProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<AudioMedia[]> {\n return createMediaProjection<AudioMedia>(\n \"audio\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onAudio: (m) => push(m) }),\n options\n );\n}\n\nexport function imagesProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<ImageMedia[]> {\n return createMediaProjection<ImageMedia>(\n \"images\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onImage: (m) => push(m) }),\n options\n );\n}\n\nexport function videoProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<VideoMedia[]> {\n return createMediaProjection<VideoMedia>(\n \"video\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onVideo: (m) => push(m) }),\n options\n );\n}\n\nexport function filesProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<FileMedia[]> {\n return createMediaProjection<FileMedia>(\n \"files\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onFile: (m) => push(m) }),\n options\n );\n}\n\nexport type { MediaProjectionOptions };\n"],"mappings":";;;;AAwCA,SAAS,sBAGP,MACA,WACA,gBAIA,SACqB;CACrB,MAAM,KAAK,CAAC,GAAG,UAAU;AAGzB,QAAO;EACL,KAHU,GAAG,KAAK,GAAGA,kBAAAA,aAAa,GAAG;EAIrC,WAAW;EACX,SAAS,EAAE;EACX,KAAK,EAAE,QAAQ,OAAO,WAA8B;GAClD,MAAM,YAAY,gBAAgB,UAAU;AAC1C,UAAM,SAAS,CAAC,GAAG,MAAM,aAAa,EAAE,MAAM,CAAC;MAC9C,QAAQ;AAQX,OAFEC,kBAAAA,gBAAgB,GAAG,IAAI,QAAQ,SAAS,SAAS,WAAW,EAExC;IACpB,MAAM,cAAc,QAAQ,WAAW,UAAU;AAC/C,SAAI,MAAM,WAAW,WAAY;AAEjC,SAAI,CADYA,kBAAAA,gBAAgB,MAAM,OAAO,UAAU,CACzC;AACd,eAAU,QAAQ,MAAuB;MACzC;AACF,WAAO,EACL,MAAM,UAAU;AACd,kBAAa;AACb,UAAK,MAAM,SAAS,MAAM,aAAa,CACrC,KAAI;AACF,YAAM,QAAQ;aACR;AAIV,eAAU,OAAO;OAEpB;;GAGH,MAAM,UAAUC,gBAAAA,2BAA2B;IACzC;IACA,UAAU,CAAC,WAAW;IACtB,WAAW;IACX,QAAQ,OAAc;AACpB,SAAI,MAAM,WAAW,WAAY;AACjC,eAAU,QAAQ,MAAuB;;IAE3C,YAAY;AACV,eAAU,OAAO;;IAEpB,CAAC;AAEF,UAAO,EACL,MAAM,UAAU;AAId,SAAK,MAAM,SAAS,MAAM,aAAa,CACrC,KAAI;AACF,WAAM,QAAQ;YACR;AAIV,cAAU,OAAO;AACjB,UAAM,QAAQ,SAAS;MAE1B;;EAEJ;;AAGH,SAAgB,gBACd,WACA,SAC8B;AAC9B,QAAO,sBACL,SACA,YACC,MAAM,SACL,IAAIC,cAAAA,eAAe;EAAE,OAAO,MAAM;EAAO,UAAU,MAAM,KAAK,EAAE;EAAE,CAAC,EACrE,QACD;;AAGH,SAAgB,iBACd,WACA,SAC8B;AAC9B,QAAO,sBACL,UACA,YACC,MAAM,SACL,IAAIA,cAAAA,eAAe;EAAE,OAAO,MAAM;EAAO,UAAU,MAAM,KAAK,EAAE;EAAE,CAAC,EACrE,QACD;;AAGH,SAAgB,gBACd,WACA,SAC8B;AAC9B,QAAO,sBACL,SACA,YACC,MAAM,SACL,IAAIA,cAAAA,eAAe;EAAE,OAAO,MAAM;EAAO,UAAU,MAAM,KAAK,EAAE;EAAE,CAAC,EACrE,QACD;;AAGH,SAAgB,gBACd,WACA,SAC6B;AAC7B,QAAO,sBACL,SACA,YACC,MAAM,SACL,IAAIA,cAAAA,eAAe;EAAE,OAAO,MAAM;EAAO,SAAS,MAAM,KAAK,EAAE;EAAE,CAAC,EACpE,QACD"}
@@ -0,0 +1,18 @@
1
+ import { AudioMedia, FileMedia, ImageMedia, VideoMedia } from "../../client/stream/media.cjs";
2
+ import { ProjectionSpec } from "../types.cjs";
3
+
4
+ //#region src/stream/projections/media.d.ts
5
+ interface MediaProjectionOptions {
6
+ /**
7
+ * Optional `fetch` for URL-sourced blocks. Forwarded into the
8
+ * underlying {@link MediaAssembler}.
9
+ */
10
+ fetch?: typeof fetch;
11
+ }
12
+ declare function audioProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<AudioMedia[]>;
13
+ declare function imagesProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<ImageMedia[]>;
14
+ declare function videoProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<VideoMedia[]>;
15
+ declare function filesProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<FileMedia[]>;
16
+ //#endregion
17
+ export { type MediaProjectionOptions, audioProjection, filesProjection, imagesProjection, videoProjection };
18
+ //# sourceMappingURL=media.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.cts","names":[],"sources":["../../../src/stream/projections/media.ts"],"mappings":";;;;UAgCU,sBAAA;;AAJ2D;;;EASnE,KAAA,UAAe,KAAA;AAAA;AAAA,iBAuFD,eAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,UAAA;AAAA,iBAUF,gBAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,UAAA;AAAA,iBAUF,eAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,UAAA;AAAA,iBAUF,eAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,SAAA"}
@@ -0,0 +1,18 @@
1
+ import { AudioMedia, FileMedia, ImageMedia, VideoMedia } from "../../client/stream/media.js";
2
+ import { ProjectionSpec } from "../types.js";
3
+
4
+ //#region src/stream/projections/media.d.ts
5
+ interface MediaProjectionOptions {
6
+ /**
7
+ * Optional `fetch` for URL-sourced blocks. Forwarded into the
8
+ * underlying {@link MediaAssembler}.
9
+ */
10
+ fetch?: typeof fetch;
11
+ }
12
+ declare function audioProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<AudioMedia[]>;
13
+ declare function imagesProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<ImageMedia[]>;
14
+ declare function videoProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<VideoMedia[]>;
15
+ declare function filesProjection(namespace: readonly string[], options?: MediaProjectionOptions): ProjectionSpec<FileMedia[]>;
16
+ //#endregion
17
+ export { type MediaProjectionOptions, audioProjection, filesProjection, imagesProjection, videoProjection };
18
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","names":[],"sources":["../../../src/stream/projections/media.ts"],"mappings":";;;;UAgCU,sBAAA;;AAJ2D;;;EASnE,KAAA,UAAe,KAAA;AAAA;AAAA,iBAuFD,eAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,UAAA;AAAA,iBAUF,gBAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,UAAA;AAAA,iBAUF,eAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,UAAA;AAAA,iBAUF,eAAA,CACd,SAAA,qBACA,OAAA,GAAU,sBAAA,GACT,cAAA,CAAe,SAAA"}
@@ -0,0 +1,78 @@
1
+ import { MediaAssembler } from "../../client/stream/media.js";
2
+ import { isRootNamespace, namespaceKey } from "../namespace.js";
3
+ import { openProjectionSubscription } from "./runtime.js";
4
+ //#region src/stream/projections/media.ts
5
+ function createMediaProjection(kind, namespace, buildAssembler, options) {
6
+ const ns = [...namespace];
7
+ return {
8
+ key: `${kind}|${namespaceKey(ns)}`,
9
+ namespace: ns,
10
+ initial: [],
11
+ open({ thread, store, rootBus }) {
12
+ const assembler = buildAssembler((media) => {
13
+ store.setValue([...store.getSnapshot(), media]);
14
+ }, options);
15
+ if (isRootNamespace(ns) && rootBus.channels.includes("messages")) {
16
+ const unsubscribe = rootBus.subscribe((event) => {
17
+ if (event.method !== "messages") return;
18
+ if (!isRootNamespace(event.params.namespace)) return;
19
+ assembler.consume(event);
20
+ });
21
+ return { async dispose() {
22
+ unsubscribe();
23
+ for (const media of store.getSnapshot()) try {
24
+ media.revoke();
25
+ } catch {}
26
+ assembler.close();
27
+ } };
28
+ }
29
+ const runtime = openProjectionSubscription({
30
+ thread,
31
+ channels: ["messages"],
32
+ namespace: ns,
33
+ onEvent(event) {
34
+ if (event.method !== "messages") return;
35
+ assembler.consume(event);
36
+ },
37
+ onFinally() {
38
+ assembler.close();
39
+ }
40
+ });
41
+ return { async dispose() {
42
+ for (const media of store.getSnapshot()) try {
43
+ media.revoke();
44
+ } catch {}
45
+ assembler.close();
46
+ await runtime.dispose();
47
+ } };
48
+ }
49
+ };
50
+ }
51
+ function audioProjection(namespace, options) {
52
+ return createMediaProjection("audio", namespace, (push, opts) => new MediaAssembler({
53
+ fetch: opts?.fetch,
54
+ onAudio: (m) => push(m)
55
+ }), options);
56
+ }
57
+ function imagesProjection(namespace, options) {
58
+ return createMediaProjection("images", namespace, (push, opts) => new MediaAssembler({
59
+ fetch: opts?.fetch,
60
+ onImage: (m) => push(m)
61
+ }), options);
62
+ }
63
+ function videoProjection(namespace, options) {
64
+ return createMediaProjection("video", namespace, (push, opts) => new MediaAssembler({
65
+ fetch: opts?.fetch,
66
+ onVideo: (m) => push(m)
67
+ }), options);
68
+ }
69
+ function filesProjection(namespace, options) {
70
+ return createMediaProjection("files", namespace, (push, opts) => new MediaAssembler({
71
+ fetch: opts?.fetch,
72
+ onFile: (m) => push(m)
73
+ }), options);
74
+ }
75
+ //#endregion
76
+ export { audioProjection, filesProjection, imagesProjection, videoProjection };
77
+
78
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","names":[],"sources":["../../../src/stream/projections/media.ts"],"sourcesContent":["/**\n * Namespace-scoped media projections.\n *\n * Each factory opens `thread.subscribe({ channels: [\"messages\"],\n * namespaces: [ns] })`, runs the events through a {@link MediaAssembler},\n * filters to one media block type, and surfaces an array of handles\n * that grows as messages with that type are observed.\n *\n * Behaviour mirrors the iterables on `ThreadStream` / `SubgraphHandle` /\n * `SubagentHandle`:\n * - One handle per `(messageId, blockType)`.\n * - Yielded on the first matching `content-block-start` — messages\n * with no matching blocks never appear.\n * - Errors propagate through `handle.error` / rejected `blob` /\n * rejected `objectURL`, not through the projection itself.\n *\n * `objectURL`s minted from these handles are caller-owned. The\n * companion `useMediaURL` React hook revokes on unmount; non-React\n * consumers should call `media.revoke()` when done.\n */\nimport type { Event, MessagesEvent } from \"@langchain/protocol\";\nimport { MediaAssembler } from \"../../client/stream/media.js\";\nimport type {\n AudioMedia,\n FileMedia,\n ImageMedia,\n VideoMedia,\n} from \"../../client/stream/media.js\";\nimport type { ProjectionRuntime, ProjectionSpec } from \"../types.js\";\nimport { isRootNamespace, namespaceKey } from \"../namespace.js\";\nimport { openProjectionSubscription } from \"./runtime.js\";\n\ninterface MediaProjectionOptions {\n /**\n * Optional `fetch` for URL-sourced blocks. Forwarded into the\n * underlying {@link MediaAssembler}.\n */\n fetch?: typeof fetch;\n}\n\nfunction createMediaProjection<\n T extends AudioMedia | ImageMedia | VideoMedia | FileMedia,\n>(\n kind: \"audio\" | \"images\" | \"video\" | \"files\",\n namespace: readonly string[],\n buildAssembler: (\n push: (m: T) => void,\n options?: MediaProjectionOptions\n ) => MediaAssembler,\n options?: MediaProjectionOptions\n): ProjectionSpec<T[]> {\n const ns = [...namespace];\n const key = `${kind}|${namespaceKey(ns)}`;\n\n return {\n key,\n namespace: ns,\n initial: [],\n open({ thread, store, rootBus }): ProjectionRuntime {\n const assembler = buildAssembler((media) => {\n store.setValue([...store.getSnapshot(), media]);\n }, options);\n\n // The root pump is already subscribed to `messages` at root depth 1.\n // Root-scoped projections attach to it instead of opening a second\n // server subscription.\n const rootShortCircuit =\n isRootNamespace(ns) && rootBus.channels.includes(\"messages\");\n\n if (rootShortCircuit) {\n const unsubscribe = rootBus.subscribe((event) => {\n if (event.method !== \"messages\") return;\n const matches = isRootNamespace(event.params.namespace);\n if (!matches) return;\n assembler.consume(event as MessagesEvent);\n });\n return {\n async dispose() {\n unsubscribe();\n for (const media of store.getSnapshot()) {\n try {\n media.revoke();\n } catch {\n // best-effort\n }\n }\n assembler.close();\n },\n };\n }\n\n const runtime = openProjectionSubscription({\n thread,\n channels: [\"messages\"],\n namespace: ns,\n onEvent(event: Event) {\n if (event.method !== \"messages\") return;\n assembler.consume(event as MessagesEvent);\n },\n onFinally() {\n assembler.close();\n },\n });\n\n return {\n async dispose() {\n // Revoke object URLs minted by handles owned by this\n // projection so unmount cleans up regardless of whether\n // individual hooks called `revoke()` themselves.\n for (const media of store.getSnapshot()) {\n try {\n media.revoke();\n } catch {\n // best-effort\n }\n }\n assembler.close();\n await runtime.dispose();\n },\n };\n },\n };\n}\n\nexport function audioProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<AudioMedia[]> {\n return createMediaProjection<AudioMedia>(\n \"audio\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onAudio: (m) => push(m) }),\n options\n );\n}\n\nexport function imagesProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<ImageMedia[]> {\n return createMediaProjection<ImageMedia>(\n \"images\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onImage: (m) => push(m) }),\n options\n );\n}\n\nexport function videoProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<VideoMedia[]> {\n return createMediaProjection<VideoMedia>(\n \"video\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onVideo: (m) => push(m) }),\n options\n );\n}\n\nexport function filesProjection(\n namespace: readonly string[],\n options?: MediaProjectionOptions\n): ProjectionSpec<FileMedia[]> {\n return createMediaProjection<FileMedia>(\n \"files\",\n namespace,\n (push, opts) =>\n new MediaAssembler({ fetch: opts?.fetch, onFile: (m) => push(m) }),\n options\n );\n}\n\nexport type { MediaProjectionOptions };\n"],"mappings":";;;;AAwCA,SAAS,sBAGP,MACA,WACA,gBAIA,SACqB;CACrB,MAAM,KAAK,CAAC,GAAG,UAAU;AAGzB,QAAO;EACL,KAHU,GAAG,KAAK,GAAG,aAAa,GAAG;EAIrC,WAAW;EACX,SAAS,EAAE;EACX,KAAK,EAAE,QAAQ,OAAO,WAA8B;GAClD,MAAM,YAAY,gBAAgB,UAAU;AAC1C,UAAM,SAAS,CAAC,GAAG,MAAM,aAAa,EAAE,MAAM,CAAC;MAC9C,QAAQ;AAQX,OAFE,gBAAgB,GAAG,IAAI,QAAQ,SAAS,SAAS,WAAW,EAExC;IACpB,MAAM,cAAc,QAAQ,WAAW,UAAU;AAC/C,SAAI,MAAM,WAAW,WAAY;AAEjC,SAAI,CADY,gBAAgB,MAAM,OAAO,UAAU,CACzC;AACd,eAAU,QAAQ,MAAuB;MACzC;AACF,WAAO,EACL,MAAM,UAAU;AACd,kBAAa;AACb,UAAK,MAAM,SAAS,MAAM,aAAa,CACrC,KAAI;AACF,YAAM,QAAQ;aACR;AAIV,eAAU,OAAO;OAEpB;;GAGH,MAAM,UAAU,2BAA2B;IACzC;IACA,UAAU,CAAC,WAAW;IACtB,WAAW;IACX,QAAQ,OAAc;AACpB,SAAI,MAAM,WAAW,WAAY;AACjC,eAAU,QAAQ,MAAuB;;IAE3C,YAAY;AACV,eAAU,OAAO;;IAEpB,CAAC;AAEF,UAAO,EACL,MAAM,UAAU;AAId,SAAK,MAAM,SAAS,MAAM,aAAa,CACrC,KAAI;AACF,WAAM,QAAQ;YACR;AAIV,cAAU,OAAO;AACjB,UAAM,QAAQ,SAAS;MAE1B;;EAEJ;;AAGH,SAAgB,gBACd,WACA,SAC8B;AAC9B,QAAO,sBACL,SACA,YACC,MAAM,SACL,IAAI,eAAe;EAAE,OAAO,MAAM;EAAO,UAAU,MAAM,KAAK,EAAE;EAAE,CAAC,EACrE,QACD;;AAGH,SAAgB,iBACd,WACA,SAC8B;AAC9B,QAAO,sBACL,UACA,YACC,MAAM,SACL,IAAI,eAAe;EAAE,OAAO,MAAM;EAAO,UAAU,MAAM,KAAK,EAAE;EAAE,CAAC,EACrE,QACD;;AAGH,SAAgB,gBACd,WACA,SAC8B;AAC9B,QAAO,sBACL,SACA,YACC,MAAM,SACL,IAAI,eAAe;EAAE,OAAO,MAAM;EAAO,UAAU,MAAM,KAAK,EAAE;EAAE,CAAC,EACrE,QACD;;AAGH,SAAgB,gBACd,WACA,SAC6B;AAC7B,QAAO,sBACL,SACA,YACC,MAAM,SACL,IAAI,eAAe;EAAE,OAAO,MAAM;EAAO,SAAS,MAAM,KAAK,EAAE;EAAE,CAAC,EACpE,QACD"}
@@ -0,0 +1,121 @@
1
+ const require_messages = require("../../ui/messages.cjs");
2
+ const require_messages$1 = require("../../client/stream/messages.cjs");
3
+ const require_namespace = require("../namespace.cjs");
4
+ const require_assembled_to_message = require("../assembled-to-message.cjs");
5
+ const require_message_reconciliation = require("../message-reconciliation.cjs");
6
+ const require_runtime = require("./runtime.cjs");
7
+ //#region src/stream/projections/messages.ts
8
+ function messagesProjection(namespace) {
9
+ const ns = [...namespace];
10
+ return {
11
+ key: `messages|${require_namespace.namespaceKey(ns)}`,
12
+ namespace: ns,
13
+ initial: [],
14
+ open({ thread, store, rootBus }) {
15
+ const assembler = new require_messages$1.MessageAssembler();
16
+ const roleByKey = /* @__PURE__ */ new Map();
17
+ const indexById = /* @__PURE__ */ new Map();
18
+ const streamMessageIds = /* @__PURE__ */ new Set();
19
+ let valuesMessageIds = /* @__PURE__ */ new Set();
20
+ if (require_namespace.isRootNamespace(ns) && rootBus.channels.includes("messages")) {
21
+ const unsubscribe = rootBus.subscribe((event) => {
22
+ if (event.method !== "messages") return;
23
+ if (!require_namespace.isRootNamespace(event.params.namespace)) return;
24
+ applyEvent(event);
25
+ });
26
+ return { dispose() {
27
+ unsubscribe();
28
+ } };
29
+ }
30
+ let disposed = false;
31
+ const pendingMessages = [];
32
+ let dirty = false;
33
+ let flushScheduled = false;
34
+ const flushChannel = typeof MessageChannel !== "undefined" ? new MessageChannel() : null;
35
+ const flush = () => {
36
+ flushScheduled = false;
37
+ if (!dirty || disposed) return;
38
+ dirty = false;
39
+ store.setValue(pendingMessages.slice());
40
+ };
41
+ if (flushChannel != null) flushChannel.port1.onmessage = flush;
42
+ const scheduleFlush = () => {
43
+ dirty = true;
44
+ if (flushScheduled) return;
45
+ flushScheduled = true;
46
+ if (flushChannel != null) flushChannel.port2.postMessage(null);
47
+ else setTimeout(flush, 0);
48
+ };
49
+ const applyValuesEvent = (event) => {
50
+ const data = event.params.data;
51
+ if (data == null || typeof data !== "object" || Array.isArray(data)) return;
52
+ const rawMessages = data.messages;
53
+ if (!Array.isArray(rawMessages) || rawMessages.length === 0) return;
54
+ const reconciliation = require_message_reconciliation.reconcileMessagesFromValues({
55
+ valueMessages: require_messages.ensureMessageInstances(rawMessages),
56
+ currentMessages: pendingMessages,
57
+ currentIndexById: indexById,
58
+ previousValueMessageIds: valuesMessageIds,
59
+ streamedMessageIds: streamMessageIds,
60
+ preferValuesMessage: require_message_reconciliation.shouldPreferValuesMessageForToolCalls
61
+ });
62
+ valuesMessageIds = reconciliation.valueMessageIds;
63
+ const reconciledMessages = [...reconciliation.messages];
64
+ pendingMessages.length = 0;
65
+ for (const message of reconciledMessages) pendingMessages.push(message);
66
+ indexById.clear();
67
+ for (const [id, idx] of require_message_reconciliation.buildMessageIndex(pendingMessages)) indexById.set(id, idx);
68
+ scheduleFlush();
69
+ };
70
+ const applyEvent = (event) => {
71
+ const data = event.params.data;
72
+ if (data.event === "message-start") {
73
+ const startData = data;
74
+ const role = startData.role ?? "ai";
75
+ const extendedRole = startData.role ?? role;
76
+ const maybeToolCallId = startData.tool_call_id;
77
+ if (startData.id != null) roleByKey.set(startData.id, {
78
+ role: extendedRole,
79
+ toolCallId: maybeToolCallId
80
+ });
81
+ }
82
+ const update = assembler.consume(event);
83
+ if (update == null) return;
84
+ const msg = update.message;
85
+ const id = msg.id;
86
+ if (id == null) return;
87
+ const captured = roleByKey.get(id) ?? { role: "ai" };
88
+ const base = require_assembled_to_message.assembledMessageToBaseMessage(msg, captured.role, { toolCallId: captured.toolCallId });
89
+ streamMessageIds.add(id);
90
+ const existingIdx = indexById.get(id);
91
+ if (existingIdx == null) {
92
+ indexById.set(id, pendingMessages.length);
93
+ pendingMessages.push(base);
94
+ } else pendingMessages[existingIdx] = base;
95
+ scheduleFlush();
96
+ };
97
+ const runtime = require_runtime.openProjectionSubscription({
98
+ thread,
99
+ channels: ["messages", "values"],
100
+ namespace: ns,
101
+ onEvent(event) {
102
+ if (event.method === "messages") applyEvent(event);
103
+ else if (event.method === "values") applyValuesEvent(event);
104
+ }
105
+ });
106
+ return { async dispose() {
107
+ disposed = true;
108
+ if (flushChannel != null) {
109
+ flushChannel.port1.onmessage = null;
110
+ flushChannel.port1.close();
111
+ flushChannel.port2.close();
112
+ }
113
+ await runtime.dispose();
114
+ } };
115
+ }
116
+ };
117
+ }
118
+ //#endregion
119
+ exports.messagesProjection = messagesProjection;
120
+
121
+ //# sourceMappingURL=messages.cjs.map