@moureau/pipeflow 0.0.1 → 0.0.3

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 (336) hide show
  1. package/README.md +280 -130
  2. package/dist/cjs/agents/agent.js +1 -1
  3. package/dist/cjs/agents/agent.js.map +3 -3
  4. package/dist/cjs/agents/tools/tools.js +1 -1
  5. package/dist/cjs/agents/tools/tools.js.map +3 -3
  6. package/dist/cjs/client/client.js +2 -0
  7. package/dist/cjs/client/client.js.map +7 -0
  8. package/dist/cjs/client/index.js +2 -0
  9. package/dist/cjs/client/index.js.map +7 -0
  10. package/dist/cjs/client/json.js +2 -0
  11. package/dist/cjs/client/json.js.map +7 -0
  12. package/dist/cjs/client/protocol/websocket.js +2 -0
  13. package/dist/cjs/client/protocol/websocket.js.map +7 -0
  14. package/dist/cjs/client/protocol.js +2 -0
  15. package/dist/cjs/client/protocol.js.map +7 -0
  16. package/dist/cjs/conversations/conversation/conversation.js +1 -1
  17. package/dist/cjs/conversations/conversation/conversation.js.map +3 -3
  18. package/dist/cjs/conversations/conversations.js +1 -1
  19. package/dist/cjs/conversations/conversations.js.map +3 -3
  20. package/dist/cjs/conversations/index.js +1 -1
  21. package/dist/cjs/conversations/index.js.map +3 -3
  22. package/dist/cjs/conversations/orchestration/coordination/coordination.js +10 -0
  23. package/dist/cjs/conversations/orchestration/coordination/coordination.js.map +7 -0
  24. package/dist/cjs/conversations/orchestration/coordination/index.js +2 -0
  25. package/dist/cjs/conversations/orchestration/coordination/index.js.map +7 -0
  26. package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js +4 -0
  27. package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js.map +7 -0
  28. package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/index.js +2 -0
  29. package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/index.js.map +7 -0
  30. package/dist/cjs/conversations/orchestration/orchestrator/generation/generation.js +2 -0
  31. package/dist/cjs/conversations/orchestration/orchestrator/generation/generation.js.map +7 -0
  32. package/dist/cjs/conversations/orchestration/orchestrator/generation/index.js +2 -0
  33. package/dist/cjs/conversations/orchestration/orchestrator/generation/index.js.map +7 -0
  34. package/dist/cjs/conversations/orchestration/orchestrator/history/history.js +4 -0
  35. package/dist/cjs/conversations/orchestration/orchestrator/history/history.js.map +7 -0
  36. package/dist/cjs/conversations/orchestration/orchestrator/history/index.js +2 -0
  37. package/dist/cjs/conversations/orchestration/orchestrator/history/index.js.map +7 -0
  38. package/dist/cjs/conversations/orchestration/orchestrator/index.js +1 -1
  39. package/dist/cjs/conversations/orchestration/orchestrator/index.js.map +3 -3
  40. package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js +1 -2
  41. package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js.map +3 -3
  42. package/dist/cjs/conversations/orchestration/orchestrator/routing/index.js +2 -0
  43. package/dist/cjs/conversations/orchestration/orchestrator/routing/index.js.map +7 -0
  44. package/dist/cjs/conversations/orchestration/orchestrator/routing/routing.js +23 -0
  45. package/dist/cjs/conversations/orchestration/orchestrator/routing/routing.js.map +7 -0
  46. package/dist/cjs/conversations/orchestration/orchestrator/speech/index.js +2 -0
  47. package/dist/cjs/conversations/orchestration/orchestrator/speech/index.js.map +7 -0
  48. package/dist/cjs/conversations/orchestration/orchestrator/speech/speech.js +2 -0
  49. package/dist/cjs/conversations/orchestration/orchestrator/speech/speech.js.map +7 -0
  50. package/dist/cjs/conversations/orchestration/orchestrator/tools/index.js +2 -0
  51. package/dist/cjs/conversations/orchestration/orchestrator/tools/index.js.map +7 -0
  52. package/dist/cjs/conversations/orchestration/orchestrator/tools/tools.js +2 -0
  53. package/dist/cjs/conversations/orchestration/orchestrator/tools/tools.js.map +7 -0
  54. package/dist/cjs/conversations/orchestration/test-harness.js +2 -0
  55. package/dist/cjs/conversations/orchestration/test-harness.js.map +7 -0
  56. package/dist/cjs/conversations/orchestration/text-chunker/index.js +2 -0
  57. package/dist/cjs/conversations/orchestration/text-chunker/index.js.map +7 -0
  58. package/dist/cjs/conversations/orchestration/text-chunker/text-chunker.js +3 -0
  59. package/dist/cjs/conversations/orchestration/text-chunker/text-chunker.js.map +7 -0
  60. package/dist/cjs/conversations/stream/conversation-stream.js +2 -0
  61. package/dist/cjs/conversations/stream/conversation-stream.js.map +7 -0
  62. package/dist/cjs/conversations/stream/index.js +2 -0
  63. package/dist/cjs/conversations/stream/index.js.map +7 -0
  64. package/dist/cjs/conversations/types.js +1 -1
  65. package/dist/cjs/conversations/types.js.map +2 -2
  66. package/dist/cjs/index.js +1 -1
  67. package/dist/cjs/index.js.map +3 -3
  68. package/dist/cjs/persistence/adapters/sqlite/sqlite.js +18 -14
  69. package/dist/cjs/persistence/adapters/sqlite/sqlite.js.map +3 -3
  70. package/dist/cjs/pipeflow/index.js +2 -0
  71. package/dist/cjs/pipeflow/index.js.map +7 -0
  72. package/dist/cjs/pipeflow/pipeflow.js +2 -0
  73. package/dist/cjs/pipeflow/pipeflow.js.map +7 -0
  74. package/dist/cjs/providers/index.js +1 -1
  75. package/dist/cjs/providers/index.js.map +2 -2
  76. package/dist/cjs/providers/llm/adapters/claude/claude.js +5 -0
  77. package/dist/cjs/providers/llm/adapters/claude/claude.js.map +7 -0
  78. package/dist/cjs/providers/llm/adapters/claude/index.js +2 -0
  79. package/dist/cjs/providers/llm/adapters/claude/index.js.map +7 -0
  80. package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js +1 -1
  81. package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js.map +3 -3
  82. package/dist/cjs/providers/llm/adapters/index.js +1 -1
  83. package/dist/cjs/providers/llm/adapters/index.js.map +3 -3
  84. package/dist/cjs/providers/llm/adapters/openai/index.js +2 -0
  85. package/dist/cjs/providers/llm/adapters/openai/index.js.map +7 -0
  86. package/dist/cjs/providers/llm/adapters/openai/openai.js +2 -0
  87. package/dist/cjs/providers/llm/adapters/openai/openai.js.map +7 -0
  88. package/dist/cjs/providers/llm/adapters/openai-compatible.js +10 -0
  89. package/dist/cjs/providers/llm/adapters/openai-compatible.js.map +7 -0
  90. package/dist/cjs/providers/llm/adapters/openrouter/index.js +2 -0
  91. package/dist/cjs/providers/llm/adapters/openrouter/index.js.map +7 -0
  92. package/dist/cjs/providers/llm/adapters/openrouter/openrouter.js +2 -0
  93. package/dist/cjs/providers/llm/adapters/openrouter/openrouter.js.map +7 -0
  94. package/dist/cjs/providers/llm/index.js +1 -1
  95. package/dist/cjs/providers/llm/index.js.map +3 -3
  96. package/dist/cjs/providers/llm/toolmode/index.js +2 -0
  97. package/dist/cjs/providers/llm/toolmode/index.js.map +7 -0
  98. package/dist/cjs/providers/llm/toolmode/toolmode.js +2 -0
  99. package/dist/cjs/providers/llm/toolmode/toolmode.js.map +7 -0
  100. package/dist/cjs/providers/llm/types.js +1 -1
  101. package/dist/cjs/providers/llm/types.js.map +3 -3
  102. package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js +1 -1
  103. package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js.map +3 -3
  104. package/dist/cjs/providers/stt/adapters/index.js +1 -1
  105. package/dist/cjs/providers/stt/adapters/index.js.map +3 -3
  106. package/dist/cjs/providers/stt/adapters/openrouter/index.js +2 -0
  107. package/dist/cjs/providers/stt/adapters/openrouter/index.js.map +7 -0
  108. package/dist/cjs/providers/stt/adapters/openrouter/openrouter.js +2 -0
  109. package/dist/cjs/providers/stt/adapters/openrouter/openrouter.js.map +7 -0
  110. package/dist/cjs/providers/tts/adapters/index.js +1 -1
  111. package/dist/cjs/providers/tts/adapters/index.js.map +3 -3
  112. package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js +4 -1
  113. package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js.map +3 -3
  114. package/dist/cjs/providers/tts/adapters/openrouter/index.js +2 -0
  115. package/dist/cjs/providers/tts/adapters/openrouter/index.js.map +7 -0
  116. package/dist/cjs/providers/tts/adapters/openrouter/openrouter.js +2 -0
  117. package/dist/cjs/providers/tts/adapters/openrouter/openrouter.js.map +7 -0
  118. package/dist/cjs/transport/streamobject/field-stream/field-stream.js +2 -0
  119. package/dist/cjs/transport/streamobject/field-stream/field-stream.js.map +7 -0
  120. package/dist/cjs/transport/streamobject/field-stream/index.js +2 -0
  121. package/dist/cjs/transport/streamobject/field-stream/index.js.map +7 -0
  122. package/dist/cjs/transport/streamobject/index.js +2 -0
  123. package/dist/cjs/transport/streamobject/index.js.map +7 -0
  124. package/dist/cjs/transport/streamobject/json-adapter/index.js +2 -0
  125. package/dist/cjs/transport/streamobject/json-adapter/index.js.map +7 -0
  126. package/dist/cjs/transport/streamobject/json-adapter/json-adapter.js +4 -0
  127. package/dist/cjs/transport/streamobject/json-adapter/json-adapter.js.map +7 -0
  128. package/dist/cjs/transport/streamobject/reference/index.js +2 -0
  129. package/dist/cjs/transport/streamobject/reference/index.js.map +7 -0
  130. package/dist/cjs/transport/streamobject/reference/reference.js +2 -0
  131. package/dist/cjs/transport/streamobject/reference/reference.js.map +7 -0
  132. package/dist/cjs/transport/streamobject/stream-object/index.js +2 -0
  133. package/dist/cjs/transport/streamobject/stream-object/index.js.map +7 -0
  134. package/dist/cjs/transport/streamobject/stream-object/stream-object.js +2 -0
  135. package/dist/cjs/transport/streamobject/stream-object/stream-object.js.map +7 -0
  136. package/dist/esm/agents/agent.js +1 -1
  137. package/dist/esm/agents/agent.js.map +3 -3
  138. package/dist/esm/agents/tools/tools.js +1 -1
  139. package/dist/esm/agents/tools/tools.js.map +3 -3
  140. package/dist/esm/client/client.js +2 -0
  141. package/dist/esm/client/client.js.map +7 -0
  142. package/dist/esm/client/index.js +2 -0
  143. package/dist/esm/client/index.js.map +7 -0
  144. package/dist/esm/client/json.js +2 -0
  145. package/dist/esm/client/json.js.map +7 -0
  146. package/dist/esm/client/protocol/websocket.js +2 -0
  147. package/dist/esm/client/protocol/websocket.js.map +7 -0
  148. package/dist/esm/client/protocol.js +1 -0
  149. package/dist/esm/client/protocol.js.map +7 -0
  150. package/dist/esm/conversations/conversation/conversation.js +1 -1
  151. package/dist/esm/conversations/conversation/conversation.js.map +3 -3
  152. package/dist/esm/conversations/conversations.js +1 -1
  153. package/dist/esm/conversations/conversations.js.map +3 -3
  154. package/dist/esm/conversations/index.js +1 -1
  155. package/dist/esm/conversations/index.js.map +3 -3
  156. package/dist/esm/conversations/orchestration/coordination/coordination.js +10 -0
  157. package/dist/esm/conversations/orchestration/coordination/coordination.js.map +7 -0
  158. package/dist/esm/conversations/orchestration/coordination/index.js +2 -0
  159. package/dist/esm/conversations/orchestration/coordination/index.js.map +7 -0
  160. package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js +4 -0
  161. package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js.map +7 -0
  162. package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/index.js +2 -0
  163. package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/index.js.map +7 -0
  164. package/dist/esm/conversations/orchestration/orchestrator/generation/generation.js +2 -0
  165. package/dist/esm/conversations/orchestration/orchestrator/generation/generation.js.map +7 -0
  166. package/dist/esm/conversations/orchestration/orchestrator/generation/index.js +2 -0
  167. package/dist/esm/conversations/orchestration/orchestrator/generation/index.js.map +7 -0
  168. package/dist/esm/conversations/orchestration/orchestrator/history/history.js +4 -0
  169. package/dist/esm/conversations/orchestration/orchestrator/history/history.js.map +7 -0
  170. package/dist/esm/conversations/orchestration/orchestrator/history/index.js +2 -0
  171. package/dist/esm/conversations/orchestration/orchestrator/history/index.js.map +7 -0
  172. package/dist/esm/conversations/orchestration/orchestrator/index.js +1 -1
  173. package/dist/esm/conversations/orchestration/orchestrator/index.js.map +3 -3
  174. package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js +1 -2
  175. package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js.map +3 -3
  176. package/dist/esm/conversations/orchestration/orchestrator/routing/index.js +2 -0
  177. package/dist/esm/conversations/orchestration/orchestrator/routing/index.js.map +7 -0
  178. package/dist/esm/conversations/orchestration/orchestrator/routing/routing.js +23 -0
  179. package/dist/esm/conversations/orchestration/orchestrator/routing/routing.js.map +7 -0
  180. package/dist/esm/conversations/orchestration/orchestrator/speech/index.js +2 -0
  181. package/dist/esm/conversations/orchestration/orchestrator/speech/index.js.map +7 -0
  182. package/dist/esm/conversations/orchestration/orchestrator/speech/speech.js +2 -0
  183. package/dist/esm/conversations/orchestration/orchestrator/speech/speech.js.map +7 -0
  184. package/dist/esm/conversations/orchestration/orchestrator/tools/index.js +2 -0
  185. package/dist/esm/conversations/orchestration/orchestrator/tools/index.js.map +7 -0
  186. package/dist/esm/conversations/orchestration/orchestrator/tools/tools.js +2 -0
  187. package/dist/esm/conversations/orchestration/orchestrator/tools/tools.js.map +7 -0
  188. package/dist/esm/conversations/orchestration/test-harness.js +2 -0
  189. package/dist/esm/conversations/orchestration/test-harness.js.map +7 -0
  190. package/dist/esm/conversations/orchestration/text-chunker/index.js +2 -0
  191. package/dist/esm/conversations/orchestration/text-chunker/index.js.map +7 -0
  192. package/dist/esm/conversations/orchestration/text-chunker/text-chunker.js +3 -0
  193. package/dist/esm/conversations/orchestration/text-chunker/text-chunker.js.map +7 -0
  194. package/dist/esm/conversations/stream/conversation-stream.js +2 -0
  195. package/dist/esm/conversations/stream/conversation-stream.js.map +7 -0
  196. package/dist/esm/conversations/stream/index.js +2 -0
  197. package/dist/esm/conversations/stream/index.js.map +7 -0
  198. package/dist/esm/conversations/types.js +1 -1
  199. package/dist/esm/conversations/types.js.map +2 -2
  200. package/dist/esm/index.js +1 -1
  201. package/dist/esm/index.js.map +3 -3
  202. package/dist/esm/persistence/adapters/sqlite/sqlite.js +18 -14
  203. package/dist/esm/persistence/adapters/sqlite/sqlite.js.map +3 -3
  204. package/dist/esm/pipeflow/index.js +2 -0
  205. package/dist/esm/pipeflow/index.js.map +7 -0
  206. package/dist/esm/pipeflow/pipeflow.js +2 -0
  207. package/dist/esm/pipeflow/pipeflow.js.map +7 -0
  208. package/dist/esm/providers/index.js +1 -1
  209. package/dist/esm/providers/index.js.map +3 -3
  210. package/dist/esm/providers/llm/adapters/claude/claude.js +5 -0
  211. package/dist/esm/providers/llm/adapters/claude/claude.js.map +7 -0
  212. package/dist/esm/providers/llm/adapters/claude/index.js +2 -0
  213. package/dist/esm/providers/llm/adapters/claude/index.js.map +7 -0
  214. package/dist/esm/providers/llm/adapters/deepseek/deepseek.js +1 -1
  215. package/dist/esm/providers/llm/adapters/deepseek/deepseek.js.map +3 -3
  216. package/dist/esm/providers/llm/adapters/index.js +1 -1
  217. package/dist/esm/providers/llm/adapters/index.js.map +3 -3
  218. package/dist/esm/providers/llm/adapters/openai/index.js +2 -0
  219. package/dist/esm/providers/llm/adapters/openai/index.js.map +7 -0
  220. package/dist/esm/providers/llm/adapters/openai/openai.js +2 -0
  221. package/dist/esm/providers/llm/adapters/openai/openai.js.map +7 -0
  222. package/dist/esm/providers/llm/adapters/openai-compatible.js +10 -0
  223. package/dist/esm/providers/llm/adapters/openai-compatible.js.map +7 -0
  224. package/dist/esm/providers/llm/adapters/openrouter/index.js +2 -0
  225. package/dist/esm/providers/llm/adapters/openrouter/index.js.map +7 -0
  226. package/dist/esm/providers/llm/adapters/openrouter/openrouter.js +2 -0
  227. package/dist/esm/providers/llm/adapters/openrouter/openrouter.js.map +7 -0
  228. package/dist/esm/providers/llm/index.js +1 -1
  229. package/dist/esm/providers/llm/index.js.map +3 -3
  230. package/dist/esm/providers/llm/toolmode/index.js +2 -0
  231. package/dist/esm/providers/llm/toolmode/index.js.map +7 -0
  232. package/dist/esm/providers/llm/toolmode/toolmode.js +2 -0
  233. package/dist/esm/providers/llm/toolmode/toolmode.js.map +7 -0
  234. package/dist/esm/providers/llm/types.js +1 -0
  235. package/dist/esm/providers/llm/types.js.map +4 -4
  236. package/dist/esm/providers/stt/adapters/deepgram/deepgram.js +1 -1
  237. package/dist/esm/providers/stt/adapters/deepgram/deepgram.js.map +3 -3
  238. package/dist/esm/providers/stt/adapters/index.js +1 -1
  239. package/dist/esm/providers/stt/adapters/index.js.map +3 -3
  240. package/dist/esm/providers/stt/adapters/openrouter/index.js +2 -0
  241. package/dist/esm/providers/stt/adapters/openrouter/index.js.map +7 -0
  242. package/dist/esm/providers/stt/adapters/openrouter/openrouter.js +2 -0
  243. package/dist/esm/providers/stt/adapters/openrouter/openrouter.js.map +7 -0
  244. package/dist/esm/providers/tts/adapters/index.js +1 -1
  245. package/dist/esm/providers/tts/adapters/index.js.map +3 -3
  246. package/dist/esm/providers/tts/adapters/kokoro/kokoro.js +4 -1
  247. package/dist/esm/providers/tts/adapters/kokoro/kokoro.js.map +3 -3
  248. package/dist/esm/providers/tts/adapters/openrouter/index.js +2 -0
  249. package/dist/esm/providers/tts/adapters/openrouter/index.js.map +7 -0
  250. package/dist/esm/providers/tts/adapters/openrouter/openrouter.js +2 -0
  251. package/dist/esm/providers/tts/adapters/openrouter/openrouter.js.map +7 -0
  252. package/dist/esm/transport/streamobject/field-stream/field-stream.js +2 -0
  253. package/dist/esm/transport/streamobject/field-stream/field-stream.js.map +7 -0
  254. package/dist/esm/transport/streamobject/field-stream/index.js +2 -0
  255. package/dist/esm/transport/streamobject/field-stream/index.js.map +7 -0
  256. package/dist/esm/transport/streamobject/index.js +2 -0
  257. package/dist/esm/transport/streamobject/index.js.map +7 -0
  258. package/dist/esm/transport/streamobject/json-adapter/index.js +2 -0
  259. package/dist/esm/transport/streamobject/json-adapter/index.js.map +7 -0
  260. package/dist/esm/transport/streamobject/json-adapter/json-adapter.js +4 -0
  261. package/dist/esm/transport/streamobject/json-adapter/json-adapter.js.map +7 -0
  262. package/dist/esm/transport/streamobject/reference/index.js +2 -0
  263. package/dist/esm/transport/streamobject/reference/index.js.map +7 -0
  264. package/dist/esm/transport/streamobject/reference/reference.js +2 -0
  265. package/dist/esm/transport/streamobject/reference/reference.js.map +7 -0
  266. package/dist/esm/transport/streamobject/stream-object/index.js +2 -0
  267. package/dist/esm/transport/streamobject/stream-object/index.js.map +7 -0
  268. package/dist/esm/transport/streamobject/stream-object/stream-object.js +2 -0
  269. package/dist/esm/transport/streamobject/stream-object/stream-object.js.map +7 -0
  270. package/dist/types/agents/agent.d.ts +3 -0
  271. package/dist/types/agents/tools/tools.d.ts +28 -6
  272. package/dist/types/client/client.d.ts +186 -0
  273. package/dist/types/client/index.d.ts +31 -0
  274. package/dist/types/client/json.d.ts +13 -0
  275. package/dist/types/client/protocol/websocket.d.ts +56 -0
  276. package/dist/types/client/protocol.d.ts +46 -0
  277. package/dist/types/conversations/conversation/conversation.d.ts +130 -6
  278. package/dist/types/conversations/conversations.d.ts +35 -1
  279. package/dist/types/conversations/index.d.ts +2 -1
  280. package/dist/types/conversations/orchestration/coordination/coordination.d.ts +192 -0
  281. package/dist/types/conversations/orchestration/coordination/index.d.ts +2 -0
  282. package/dist/types/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.d.ts +108 -0
  283. package/dist/types/conversations/orchestration/orchestrator/coordination-runner/index.d.ts +2 -0
  284. package/dist/types/conversations/orchestration/orchestrator/generation/generation.d.ts +60 -0
  285. package/dist/types/conversations/orchestration/orchestrator/generation/index.d.ts +2 -0
  286. package/dist/types/conversations/orchestration/orchestrator/history/history.d.ts +62 -0
  287. package/dist/types/conversations/orchestration/orchestrator/history/index.d.ts +1 -0
  288. package/dist/types/conversations/orchestration/orchestrator/index.d.ts +10 -0
  289. package/dist/types/conversations/orchestration/orchestrator/orchestrator.d.ts +68 -31
  290. package/dist/types/conversations/orchestration/orchestrator/routing/index.d.ts +1 -0
  291. package/dist/types/conversations/orchestration/orchestrator/routing/routing.d.ts +19 -0
  292. package/dist/types/conversations/orchestration/orchestrator/speech/index.d.ts +2 -0
  293. package/dist/types/conversations/orchestration/orchestrator/speech/speech.d.ts +78 -0
  294. package/dist/types/conversations/orchestration/orchestrator/tools/index.d.ts +2 -0
  295. package/dist/types/conversations/orchestration/orchestrator/tools/tools.d.ts +65 -0
  296. package/dist/types/conversations/orchestration/test-harness.d.ts +100 -0
  297. package/dist/types/conversations/orchestration/text-chunker/index.d.ts +1 -0
  298. package/dist/types/conversations/orchestration/text-chunker/text-chunker.d.ts +39 -0
  299. package/dist/types/conversations/stream/conversation-stream.d.ts +42 -0
  300. package/dist/types/conversations/stream/index.d.ts +1 -0
  301. package/dist/types/conversations/types.d.ts +32 -0
  302. package/dist/types/index.d.ts +5 -38
  303. package/dist/types/pipeflow/index.d.ts +2 -0
  304. package/dist/types/pipeflow/pipeflow.d.ts +43 -0
  305. package/dist/types/providers/index.d.ts +1 -1
  306. package/dist/types/providers/llm/adapters/claude/claude.d.ts +45 -0
  307. package/dist/types/providers/llm/adapters/claude/index.d.ts +2 -0
  308. package/dist/types/providers/llm/adapters/deepseek/deepseek.d.ts +23 -2
  309. package/dist/types/providers/llm/adapters/index.d.ts +3 -0
  310. package/dist/types/providers/llm/adapters/openai/index.d.ts +2 -0
  311. package/dist/types/providers/llm/adapters/openai/openai.d.ts +45 -0
  312. package/dist/types/providers/llm/adapters/openai-compatible.d.ts +44 -0
  313. package/dist/types/providers/llm/adapters/openrouter/index.d.ts +2 -0
  314. package/dist/types/providers/llm/adapters/openrouter/openrouter.d.ts +60 -0
  315. package/dist/types/providers/llm/index.d.ts +5 -2
  316. package/dist/types/providers/llm/toolmode/index.d.ts +2 -0
  317. package/dist/types/providers/llm/toolmode/toolmode.d.ts +99 -0
  318. package/dist/types/providers/llm/types.d.ts +65 -0
  319. package/dist/types/providers/stt/adapters/deepgram/deepgram.d.ts +4 -1
  320. package/dist/types/providers/stt/adapters/index.d.ts +1 -0
  321. package/dist/types/providers/stt/adapters/openrouter/index.d.ts +2 -0
  322. package/dist/types/providers/stt/adapters/openrouter/openrouter.d.ts +196 -0
  323. package/dist/types/providers/tts/adapters/index.d.ts +1 -0
  324. package/dist/types/providers/tts/adapters/kokoro/kokoro.d.ts +18 -3
  325. package/dist/types/providers/tts/adapters/openrouter/index.d.ts +2 -0
  326. package/dist/types/providers/tts/adapters/openrouter/openrouter.d.ts +64 -0
  327. package/dist/types/transport/streamobject/field-stream/field-stream.d.ts +85 -0
  328. package/dist/types/transport/streamobject/field-stream/index.d.ts +2 -0
  329. package/dist/types/transport/streamobject/index.d.ts +8 -0
  330. package/dist/types/transport/streamobject/json-adapter/index.d.ts +2 -0
  331. package/dist/types/transport/streamobject/json-adapter/json-adapter.d.ts +65 -0
  332. package/dist/types/transport/streamobject/reference/index.d.ts +2 -0
  333. package/dist/types/transport/streamobject/reference/reference.d.ts +127 -0
  334. package/dist/types/transport/streamobject/stream-object/index.d.ts +2 -0
  335. package/dist/types/transport/streamobject/stream-object/stream-object.d.ts +31 -0
  336. package/package.json +29 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/field-stream/field-stream.ts"],
4
+ "sourcesContent": ["/**\n * FieldStream \u2014 the semantic completion core shared by every source adapter.\n *\n * A FieldStream registers completion handlers (`when`/`whenItem`/`whenObjectDone`)\n * and dispatches completion events to them. It knows nothing about JSON, wire\n * records, SSE, or any particular producer: subclasses turn their source into\n * completion events via the protected emit helpers.\n *\n * Implementations:\n * - StreamObject \u2014 consumes an AsyncIterable of text chunks (JSON source)\n * - ConversationStream \u2014 consumes conversation events (provider-native source)\n *\n * Lifecycle, per object:\n *\n * STREAMING \u2500\u2500emitObject\u2500\u2500\u25B6 DONE\n * \u2502\n * \u251C\u2500\u2500cancel()\u2500\u2500\u25B6 CANCELLED\n * \u2514\u2500\u2500fail()\u2500\u2500\u2500\u2500\u25B6 FAILED\n *\n * Exactly-once: within an object, completion handlers fire at most once per\n * boundary and never after a terminal state (events after DONE/CANCELLED/\n * FAILED are dropped). cancel() is idempotent. Multi-object sources call\n * beginObject() to start each object.\n *\n * `when` means completion, not mutation: handlers never see chunks or source\n * format. Handlers are invoked synchronously at the completion boundary and\n * never block the producer; async handlers run concurrently and their\n * rejections are routed to onError.\n *\n * Errors: delivered to onError handlers when registered; otherwise the\n * subclass decides (StreamObject rejects start(); callers of `fail()` get the\n * throw).\n */\n\nimport type { Event, FieldValue, ScalarValue, Schema } from \"../reference/reference\";\nimport { materializeObject } from \"../reference/reference\";\n\nexport type FieldHandler = (value: FieldValue) => void;\nexport type ItemHandler = (value: ScalarValue, index: number) => void;\nexport type ObjectDoneHandler = (object: Record<string, unknown>) => void;\nexport type ErrorHandler = (error: Error) => void;\n\nexport interface FieldStreamOptions {\n /** Invoked by cancel() \u2014 e.g. to abort the producer's request. */\n onCancel?: () => void;\n}\n\ntype ObjectState = \"streaming\" | \"done\" | \"cancelled\" | \"failed\";\n\nexport abstract class FieldStream {\n protected readonly schema: Schema;\n private readonly fieldHandlers: Array<Set<FieldHandler> | undefined>;\n private readonly itemHandlers: Array<Set<ItemHandler> | undefined>;\n private readonly objectHandlers = new Set<ObjectDoneHandler>();\n private readonly errorHandlers = new Set<ErrorHandler>();\n private readonly onCancel: (() => void) | undefined;\n /** Stream-level: set by cancel(); consumed by source-driven subclasses. */\n protected cancelled = false;\n private objectState: ObjectState = \"streaming\";\n\n constructor(schema: Schema, options: FieldStreamOptions = {}) {\n this.schema = schema;\n this.onCancel = options.onCancel;\n this.fieldHandlers = new Array(schema.length);\n this.itemHandlers = new Array(schema.length);\n }\n\n when(field: string | string[], handler: FieldHandler): this {\n const index = this.resolveIndex(field);\n (this.fieldHandlers[index] ??= new Set()).add(handler);\n return this;\n }\n\n whenItem(field: string | string[], handler: ItemHandler): this {\n const index = this.resolveIndex(field);\n const def = this.schema[index]!;\n if (def.mode !== \"array\") {\n throw new TypeError(`whenItem: field \"${def.path.join(\".\")}\" is not an array`);\n }\n (this.itemHandlers[index] ??= new Set()).add(handler);\n return this;\n }\n\n whenObjectDone(handler: ObjectDoneHandler): this {\n this.objectHandlers.add(handler);\n return this;\n }\n\n onError(handler: ErrorHandler): this {\n this.errorHandlers.add(handler);\n return this;\n }\n\n /**\n * Abort the current object and stop the producer (idempotent). The object\n * will not complete; already-delivered items remain valid partial state.\n */\n cancel(): void {\n if (this.cancelled) return; // idempotent\n this.cancelled = true;\n this.cancelObject();\n this.onCancel?.();\n }\n\n /** Start a new object's lifecycle (multi-object sources call this per object). */\n protected beginObject(): void {\n this.objectState = \"streaming\";\n }\n\n /** Emit a completed field value (subclasses call this at the completion boundary). */\n protected emitField(field: number, value: FieldValue): void {\n if (this.objectState !== \"streaming\") return;\n const handlers = this.fieldHandlers[field];\n if (handlers === undefined) return;\n for (const handler of handlers) this.fire(handler, [value]);\n }\n\n /** Emit a completed array item. */\n protected emitItem(field: number, index: number, value: ScalarValue): void {\n if (this.objectState !== \"streaming\") return;\n const handlers = this.itemHandlers[field];\n if (handlers === undefined) return;\n for (const handler of handlers) this.fire(handler, [value, index]);\n }\n\n /**\n * Complete the current object: materializes and fires whenObjectDone exactly\n * once (a second call, or a call after cancel/fail, is ignored).\n */\n protected emitObject(events: Event[]): void {\n if (this.objectState !== \"streaming\") return;\n this.objectState = \"done\";\n const object = materializeObject(this.schema, events);\n for (const handler of this.objectHandlers) this.fire(handler, [object]);\n }\n\n /** Abort the current object without completing it (idempotent). */\n protected cancelObject(): void {\n if (this.objectState === \"streaming\") this.objectState = \"cancelled\";\n }\n\n /**\n * Route a source/adapter failure to onError (or rethrow when unhandled) and\n * mark the current object failed.\n */\n protected fail(error: unknown): void {\n if (this.objectState === \"streaming\") this.objectState = \"failed\";\n this.dispatchError(toError(error));\n }\n\n protected get objectCompleted(): boolean {\n return this.objectState === \"done\";\n }\n\n protected resolveIndex(field: string | string[]): number {\n const key = Array.isArray(field) ? field.join(\".\") : field;\n const index = this.schema.findIndex((def) => def.path.join(\".\") === key);\n if (index === -1) {\n throw new TypeError(`unknown field path: \"${key}\"`);\n }\n return index;\n }\n\n private fire<T extends unknown[]>(handler: (...args: T) => unknown, args: T): void {\n try {\n const result = handler(...args);\n if (result instanceof Promise) {\n void result.catch((error) => this.dispatchError(toError(error)));\n }\n } catch (error) {\n this.dispatchError(toError(error));\n }\n }\n\n private dispatchError(error: Error): void {\n if (this.errorHandlers.size === 0) throw error;\n for (const handler of this.errorHandlers) {\n try {\n handler(error);\n } catch {\n // a failing error handler is not re-dispatched\n }\n }\n }\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["field_stream_exports", "__export", "FieldStream", "__toCommonJS", "import_reference", "FieldStream", "__name", "schema", "options", "field", "handler", "index", "def", "value", "handlers", "events", "object", "error", "toError", "key", "args", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var p=(r,e)=>{for(var d in e)l(r,d,{get:e[d],enumerable:!0})},H=(r,e,d,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of n(e))!i.call(r,t)&&t!==d&&l(r,t,{get:()=>e[t],enumerable:!(a=m(e,t))||a.enumerable});return r};var f=r=>H(l({},"__esModule",{value:!0}),r);var F={};p(F,{FieldStream:()=>o.FieldStream});module.exports=f(F);var o=require("./field-stream.js");
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/field-stream/index.ts"],
4
+ "sourcesContent": ["export { FieldStream } from \"./field-stream\";\nexport type {\n ErrorHandler,\n FieldHandler,\n FieldStreamOptions,\n ItemHandler,\n ObjectDoneHandler,\n} from \"./field-stream\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gDAAAE,EAAAF,GAAA,IAAAG,EAA4B",
6
+ "names": ["field_stream_exports", "__export", "__toCommonJS", "import_field_stream"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var x=(a,r)=>{for(var t in r)l(a,t,{get:r[t],enumerable:!0})},f=(a,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of i(r))!s.call(a,o)&&o!==t&&l(a,o,{get:()=>r[o],enumerable:!(n=c(r,o))||n.enumerable});return a};var y=a=>f(l({},"__esModule",{value:!0}),a);var b={};x(b,{FieldStream:()=>m.FieldStream,IncrementalJsonParser:()=>d.IncrementalJsonParser,JsonToStreamObjectAdapter:()=>d.JsonToStreamObjectAdapter,Receiver:()=>e.Receiver,ReferenceDecoder:()=>e.ReferenceDecoder,StreamObject:()=>p.StreamObject,decode:()=>e.decode,encodeText:()=>e.encodeText,executeRecords:()=>e.executeRecords,materializeObject:()=>e.materializeObject,parseBooleanPayload:()=>e.parseBooleanPayload,parseIntegerPayload:()=>e.parseIntegerPayload,parseNumberPayload:()=>e.parseNumberPayload});module.exports=y(b);var m=require("./field-stream/index.js"),p=require("./stream-object/index.js"),d=require("./json-adapter/index.js"),e=require("./reference/index.js");
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/transport/streamobject/index.ts"],
4
+ "sourcesContent": ["// StreamObject \u2014 a schema-bound streaming semantic protocol.\n//\n// Turns a text-chunk source (LLM deltas, SSE, wire records, conversation\n// events) into completion events: consumers act when the value they depend on\n// completes, without waiting for the enclosing object. See README.md.\nexport { FieldStream } from \"./field-stream/index\";\nexport type {\n ErrorHandler,\n FieldHandler,\n FieldStreamOptions,\n ItemHandler,\n ObjectDoneHandler,\n} from \"./field-stream/index\";\nexport { StreamObject } from \"./stream-object/index\";\nexport type { StreamObjectOptions } from \"./stream-object/index\";\nexport { IncrementalJsonParser, JsonToStreamObjectAdapter } from \"./json-adapter/index\";\nexport type { JsonAdapterCallbacks, JsonValue } from \"./json-adapter/index\";\nexport {\n ReferenceDecoder,\n Receiver,\n decode,\n encodeText,\n executeRecords,\n materializeObject,\n parseBooleanPayload,\n parseIntegerPayload,\n parseNumberPayload,\n} from \"./reference/index\";\nexport type {\n Decoder,\n Event,\n FieldDef,\n FieldType,\n FieldValue,\n Payload,\n ScalarValue,\n Schema,\n StreamRecord,\n} from \"./reference/index\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kgBAAAE,EAAAF,GAKA,IAAAG,EAA4B,gCAQ5BC,EAA6B,iCAE7BC,EAAiE,gCAEjEC,EAUO",
6
+ "names": ["streamobject_exports", "__export", "__toCommonJS", "import_field_stream", "import_stream_object", "import_json_adapter", "import_reference"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var J=(r,e)=>{for(var o in e)n(r,o,{get:e[o],enumerable:!0})},c=(r,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of l(e))!m.call(r,a)&&a!==o&&n(r,a,{get:()=>e[a],enumerable:!(s=p(e,a))||s.enumerable});return r};var d=r=>c(n({},"__esModule",{value:!0}),r);var b={};J(b,{IncrementalJsonParser:()=>t.IncrementalJsonParser,JsonToStreamObjectAdapter:()=>t.JsonToStreamObjectAdapter});module.exports=d(b);var t=require("./json-adapter.js");
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/json-adapter/index.ts"],
4
+ "sourcesContent": ["export { IncrementalJsonParser, JsonToStreamObjectAdapter } from \"./json-adapter\";\nexport type { JsonAdapterCallbacks, JsonValue } from \"./json-adapter\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8HAAAE,EAAAF,GAAA,IAAAG,EAAiE",
6
+ "names": ["json_adapter_exports", "__export", "__toCommonJS", "import_json_adapter"]
7
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";var f=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var s=(r,e)=>f(r,"name",{value:e,configurable:!0});var w=(r,e)=>{for(var t in e)f(r,t,{get:e[t],enumerable:!0})},J=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of k(e))!v.call(r,i)&&i!==t&&f(r,i,{get:()=>e[i],enumerable:!(n=b(e,i))||n.enumerable});return r};var V=r=>J(f({},"__esModule",{value:!0}),r);var D={};w(D,{IncrementalJsonParser:()=>g,JsonToStreamObjectAdapter:()=>N});module.exports=V(D);class g{constructor(e){this.onValueDone=e}onValueDone;static{s(this,"IncrementalJsonParser")}stack=[];value=null;started=!1;done=!1;push(e){for(let t=0;t<e.length;t++)this.pushChar(e[t])}pushChar(e){if(this.done)return;if(!this.started){e==="{"&&(this.started=!0,this.stack.push({kind:"object",path:[],map:{},key:null,phase:"key"}));return}let t=e;for(;;){if(this.value!==null){if(this.feedValue(t))return;continue}this.dispatch(t);return}}dispatch(e){if(p(e))return;const t=this.stack[this.stack.length-1];if(t.kind==="object"){if(t.phase==="key"){if(e==='"'){this.value={kind:"string",path:t.path,raw:"",escaped:!1};return}if(e==="}"){this.closeContainer(t);return}if(e===",")return;throw new Error(`JSON: expected key or '}' at path [${t.path.join(".")}], got ${JSON.stringify(e)}`)}if(t.phase==="colon"){if(e===":"){t.phase="value";return}throw new Error(`JSON: expected ':' after key ${JSON.stringify(t.key)}`)}this.startValue(e,t,t.path.concat(t.key??"?"));return}if(e==="]"){this.closeContainer(t);return}e!==","&&this.startValue(e,t,t.path.concat(String(t.items.length)))}startValue(e,t,n){if(e==='"'){this.value={kind:"string",path:n,raw:"",escaped:!1};return}if(e==="{"){this.stack.push({kind:"object",path:n,map:{},key:null,phase:"key"});return}if(e==="["){this.stack.push({kind:"array",path:n,items:[]});return}if(e==="-"||c(e)){this.value={kind:"number",path:n,raw:e};return}if(e==="t"||e==="f"||e==="n"){this.value={kind:"literal",path:n,raw:e};return}throw new Error(`JSON: unexpected value start ${JSON.stringify(e)} at path [${n.join(".")}]`)}feedValue(e){const t=this.value;switch(t.kind){case"string":return e==="\\"?(t.raw+=e,t.escaped=!t.escaped,!0):e==='"'&&!t.escaped?(this.value=null,this.completeValue(t.path,S(t.raw)),!0):(t.raw+=e,t.escaped=!1,!0);case"number":{if(c(e)||e==="-"||e==="+"||e==="."||e==="e"||e==="E")return t.raw+=e,!0;const n=Number(t.raw);if(Number.isNaN(n))throw new Error(`JSON: invalid number ${JSON.stringify(t.raw)}`);return this.value=null,this.completeValue(t.path,n),!1}case"literal":{if(j(e)&&x(t.raw)){const i=t.raw==="true"?!0:t.raw==="false"?!1:null;return this.value=null,this.completeValue(t.path,i),!1}const n=t.raw+e;if(O(n))return t.raw=n,!0;throw new Error(`JSON: invalid literal ${JSON.stringify(n)}`)}}}completeValue(e,t){const n=this.stack[this.stack.length-1];if(n.kind==="object"&&n.phase==="key"){if(typeof t!="string")throw new Error("JSON: object key must be a string");n.key=t,n.phase="colon";return}if(this.onValueDone(e,t),n.kind==="object"){if(n.phase!=="value"||n.key===null)throw new Error(`JSON: unexpected value position at path [${e.join(".")}]`);n.map[n.key]=t,n.key=null,n.phase="key"}else n.items.push(t)}closeContainer(e){const t=e.kind==="object"?e.map:e.items,n=e.path;if(this.stack.pop(),this.stack.length===0){this.done=!0,this.onValueDone(n,t);return}this.completeValue(n,t)}}function S(r){let e="";for(let t=0;t<r.length;t++){const n=r[t];if(n!=="\\"){e+=n;continue}t++;const i=r[t];if(i===void 0)throw new Error("JSON: unterminated escape");switch(i){case'"':e+='"';break;case"\\":e+="\\";break;case"/":e+="/";break;case"b":e+="\b";break;case"f":e+="\f";break;case"n":e+=`
2
+ `;break;case"r":e+="\r";break;case"t":e+=" ";break;case"u":{const a=r.slice(t+1,t+5);if(!/^[0-9a-fA-F]{4}$/.test(a))throw new Error("JSON: invalid \\u escape");const o=parseInt(a,16);if(o>=55296&&o<=56319){const u=/^\\u([0-9a-fA-F]{4})/.exec(r.slice(t+5)),l=u?parseInt(u[1],16):-1;if(l>=56320&&l<=57343){e+=String.fromCharCode(o,l),t+=10;break}}e+=String.fromCharCode(o),t+=4;break}default:throw new Error(`JSON: invalid escape \\${i}`)}}return e}s(S,"decodeJsonString");function p(r){return r===" "||r===" "||r===`
3
+ `||r==="\r"}s(p,"isWhitespace");function c(r){return r>="0"&&r<="9"}s(c,"isDigit");function j(r){return p(r)||r===","||r==="}"||r==="]"}s(j,"isTerminator");function x(r){return r==="true"||r==="false"||r==="null"}s(x,"isCompleteLiteral");function O(r){return"true".startsWith(r)||"false".startsWith(r)||"null".startsWith(r)}s(O,"isLiteralPrefix");class N{static{s(this,"JsonToStreamObjectAdapter")}fields;parser;events=[];onFieldDone;onItemDone;onObjectDone;constructor(e,t={}){this.fields=e.map((n,i)=>({def:n,pathKey:n.path.join(".")})),this.onFieldDone=t.onFieldDone,this.onItemDone=t.onItemDone,this.onObjectDone=t.onObjectDone,this.parser=new g((n,i)=>this.handleValue(n,i))}push(e){this.parser.push(e)}getEvents(){return this.events}handleValue(e,t){const n=e.join(".");if(n===""){this.events.push({kind:"object-complete"}),this.onObjectDone?.();return}const i=this.fields.findIndex(d=>d.pathKey===n);if(i!==-1){const d=E(this.fields[i].def,t),m={kind:"field",field:i,value:d};this.events.push(m),this.onFieldDone?.(i,d);return}if(Array.isArray(t)||typeof t=="object"&&t!==null)return;const a=this.matchArrayItem(e);if(a===-1)return;const o=this.fields[a].def,u=h(o.type,t,o.path.join(".")),l=Number(e[e.length-1]),y={kind:"item",field:a,index:l,value:u};this.events.push(y),this.onItemDone?.(a,l,u)}matchArrayItem(e){if(e.length<2)return-1;const t=e[e.length-1];if(!/^\d+$/.test(t))return-1;const n=e.slice(0,-1).join("."),i=this.fields.findIndex(a=>a.pathKey===n);return i===-1||this.fields[i].def.mode!=="array"?-1:i}}function E(r,e){if(r.mode==="array"){if(!Array.isArray(e))throw new Error(`field ${r.path.join(".")}: expected array, got ${JSON.stringify(e)}`);return e.map(t=>h(r.type,t,r.path.join(".")))}return h(r.type,e,r.path.join("."))}s(E,"coerceToField");function h(r,e,t){switch(r){case"string":if(typeof e!="string")throw new Error(`field ${t}: expected string, got ${JSON.stringify(e)}`);return e;case"integer":if(typeof e!="number"||!Number.isSafeInteger(e))throw new Error(`field ${t}: expected integer, got ${JSON.stringify(e)}`);return e;case"number":if(typeof e!="number"||!Number.isFinite(e))throw new Error(`field ${t}: expected number, got ${JSON.stringify(e)}`);return e;case"boolean":if(typeof e!="boolean")throw new Error(`field ${t}: expected boolean, got ${JSON.stringify(e)}`);return e}}s(h,"coerceScalar");
4
+ //# sourceMappingURL=json-adapter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/json-adapter/json-adapter.ts"],
4
+ "sourcesContent": ["/**\n * Incremental JSON \u2192 StreamObject adapter.\n *\n * Consumes a JSON token stream (e.g. LLM output deltas) and emits StreamObject\n * field-completion events as soon as each schema field's value is complete \u2014\n * without waiting for the rest of the object. This is the designed production\n * shape of the protocol: the model emits ordinary output, deterministic\n * software does the parsing, and consumers react at field boundaries.\n *\n * The wire encoding is irrelevant here; only the Event model matters.\n */\n\nimport type { Event, FieldDef, FieldType, FieldValue, ScalarValue, Schema } from \"../reference/reference\";\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\ninterface ObjectCtx {\n kind: \"object\";\n path: string[];\n map: Record<string, JsonValue>;\n key: string | null; // the key currently awaiting its value\n phase: \"key\" | \"colon\" | \"value\";\n}\n\ninterface ArrayCtx {\n kind: \"array\";\n path: string[];\n items: JsonValue[];\n}\n\ntype ValueState =\n | { kind: \"string\"; path: string[]; raw: string; escaped: boolean }\n | { kind: \"number\"; path: string[]; raw: string }\n | { kind: \"literal\"; path: string[]; raw: string };\n\n/** Minimal incremental JSON parser. Emits every completed value with its path. */\nexport class IncrementalJsonParser {\n private readonly stack: Array<ObjectCtx | ArrayCtx> = [];\n private value: ValueState | null = null;\n private started = false;\n private done = false;\n\n constructor(private readonly onValueDone: (path: string[], value: JsonValue) => void) {}\n\n push(chunk: string): void {\n for (let i = 0; i < chunk.length; i++) {\n this.pushChar(chunk[i]!);\n }\n }\n\n private pushChar(c: string): void {\n if (this.done) return;\n if (!this.started) {\n // Preamble (markdown fences, prose) is ignored until the object starts.\n if (c === \"{\") {\n this.started = true;\n this.stack.push({ kind: \"object\", path: [], map: {}, key: null, phase: \"key\" });\n }\n return;\n }\n let ch = c;\n for (;;) {\n if (this.value !== null) {\n if (this.feedValue(ch)) return;\n continue; // the value completed on ch as a terminator; reprocess it\n }\n this.dispatch(ch);\n return;\n }\n }\n\n private dispatch(c: string): void {\n if (isWhitespace(c)) return;\n const top = this.stack[this.stack.length - 1]!;\n if (top.kind === \"object\") {\n if (top.phase === \"key\") {\n if (c === '\"') {\n this.value = { kind: \"string\", path: top.path, raw: \"\", escaped: false };\n return;\n }\n if (c === \"}\") {\n this.closeContainer(top);\n return;\n }\n if (c === \",\") return; // tolerate trailing commas in model output\n throw new Error(\n `JSON: expected key or '}' at path [${top.path.join(\".\")}], got ${JSON.stringify(c)}`,\n );\n }\n if (top.phase === \"colon\") {\n if (c === \":\") {\n top.phase = \"value\";\n return;\n }\n throw new Error(`JSON: expected ':' after key ${JSON.stringify(top.key)}`);\n }\n this.startValue(c, top, top.path.concat(top.key ?? \"?\"));\n return;\n }\n if (c === \"]\") {\n this.closeContainer(top);\n return;\n }\n if (c === \",\") return; // tolerate trailing commas\n this.startValue(c, top, top.path.concat(String(top.items.length)));\n }\n\n private startValue(c: string, _top: ObjectCtx | ArrayCtx, path: string[]): void {\n if (c === '\"') {\n this.value = { kind: \"string\", path, raw: \"\", escaped: false };\n return;\n }\n if (c === \"{\") {\n this.stack.push({ kind: \"object\", path, map: {}, key: null, phase: \"key\" });\n return;\n }\n if (c === \"[\") {\n this.stack.push({ kind: \"array\", path, items: [] });\n return;\n }\n if (c === \"-\" || isDigit(c)) {\n this.value = { kind: \"number\", path, raw: c };\n return;\n }\n if (c === \"t\" || c === \"f\" || c === \"n\") {\n this.value = { kind: \"literal\", path, raw: c };\n return;\n }\n throw new Error(`JSON: unexpected value start ${JSON.stringify(c)} at path [${path.join(\".\")}]`);\n }\n\n private feedValue(c: string): boolean {\n const v = this.value!;\n switch (v.kind) {\n case \"string\": {\n if (c === \"\\\\\") {\n v.raw += c;\n v.escaped = !v.escaped;\n return true;\n }\n if (c === '\"' && !v.escaped) {\n this.value = null;\n this.completeValue(v.path, decodeJsonString(v.raw));\n return true;\n }\n v.raw += c;\n v.escaped = false;\n return true;\n }\n case \"number\": {\n if (isDigit(c) || c === \"-\" || c === \"+\" || c === \".\" || c === \"e\" || c === \"E\") {\n v.raw += c;\n return true;\n }\n const n = Number(v.raw);\n if (Number.isNaN(n)) throw new Error(`JSON: invalid number ${JSON.stringify(v.raw)}`);\n this.value = null;\n this.completeValue(v.path, n);\n return false; // reprocess the terminator\n }\n case \"literal\": {\n if (isTerminator(c) && isCompleteLiteral(v.raw)) {\n const value = v.raw === \"true\" ? true : v.raw === \"false\" ? false : null;\n this.value = null;\n this.completeValue(v.path, value);\n return false; // reprocess the terminator\n }\n const text = v.raw + c;\n if (isLiteralPrefix(text)) {\n v.raw = text;\n return true;\n }\n throw new Error(`JSON: invalid literal ${JSON.stringify(text)}`);\n }\n }\n }\n\n private completeValue(path: string[], value: JsonValue): void {\n const top = this.stack[this.stack.length - 1]!;\n if (top.kind === \"object\" && top.phase === \"key\") {\n // The completed string was an object key, not a value.\n if (typeof value !== \"string\") throw new Error(\"JSON: object key must be a string\");\n top.key = value;\n top.phase = \"colon\";\n return;\n }\n this.onValueDone(path, value);\n if (top.kind === \"object\") {\n if (top.phase !== \"value\" || top.key === null) {\n throw new Error(`JSON: unexpected value position at path [${path.join(\".\")}]`);\n }\n top.map[top.key] = value;\n top.key = null;\n top.phase = \"key\";\n } else {\n top.items.push(value);\n }\n }\n\n private closeContainer(ctx: ObjectCtx | ArrayCtx): void {\n const value: JsonValue = ctx.kind === \"object\" ? ctx.map : ctx.items;\n const path = ctx.path;\n this.stack.pop();\n if (this.stack.length === 0) {\n this.done = true;\n this.onValueDone(path, value);\n return;\n }\n this.completeValue(path, value);\n }\n}\n\n/** Decode the raw content of a JSON string literal (escapes and \\uXXXX). */\nfunction decodeJsonString(raw: string): string {\n let out = \"\";\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i]!;\n if (c !== \"\\\\\") {\n out += c;\n continue;\n }\n i++;\n const esc = raw[i];\n if (esc === undefined) throw new Error(\"JSON: unterminated escape\");\n switch (esc) {\n case '\"': out += '\"'; break;\n case \"\\\\\": out += \"\\\\\"; break;\n case \"/\": out += \"/\"; break;\n case \"b\": out += \"\\b\"; break;\n case \"f\": out += \"\\f\"; break;\n case \"n\": out += \"\\n\"; break;\n case \"r\": out += \"\\r\"; break;\n case \"t\": out += \"\\t\"; break;\n case \"u\": {\n const hex = raw.slice(i + 1, i + 5);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) throw new Error(\"JSON: invalid \\\\u escape\");\n const code = parseInt(hex, 16);\n // Combine surrogate pairs (\\uD83D\\uDE00 \u2192 \uD83D\uDE00).\n if (code >= 0xd800 && code <= 0xdbff) {\n const low = /^\\\\u([0-9a-fA-F]{4})/.exec(raw.slice(i + 5));\n const lowCode = low ? parseInt(low[1]!, 16) : -1;\n if (lowCode >= 0xdc00 && lowCode <= 0xdfff) {\n out += String.fromCharCode(code, lowCode);\n i += 10;\n break;\n }\n }\n out += String.fromCharCode(code);\n i += 4;\n break;\n }\n default:\n throw new Error(`JSON: invalid escape \\\\${esc}`);\n }\n }\n return out;\n}\n\nfunction isWhitespace(c: string): boolean {\n return c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\";\n}\n\nfunction isDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n}\n\nfunction isTerminator(c: string): boolean {\n return isWhitespace(c) || c === \",\" || c === \"}\" || c === \"]\";\n}\n\nfunction isCompleteLiteral(text: string): boolean {\n return text === \"true\" || text === \"false\" || text === \"null\";\n}\n\nfunction isLiteralPrefix(text: string): boolean {\n return (\n \"true\".startsWith(text) || \"false\".startsWith(text) || \"null\".startsWith(text)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Schema-aware adapter: JSON values \u2192 StreamObject field-completion events\n// ---------------------------------------------------------------------------\n\nexport interface JsonAdapterCallbacks {\n onFieldDone?: (field: number, value: FieldValue) => void;\n /** Fires for each completed array element, before the array field completes. */\n onItemDone?: (field: number, index: number, value: ScalarValue) => void;\n /** Fires when the root object closes. */\n onObjectDone?: () => void;\n}\n\n/**\n * Feeds a JSON token stream into the reference Event model and emits a\n * completion hierarchy as soon as each piece is known:\n *\n * VALUE_COMPLETE \u2192 every parsed value (parser level, per path)\n * ITEM_COMPLETE \u2192 each array element of an array-typed schema field\n * FIELD_COMPLETE \u2192 a schema field's whole value (incl. a closed array)\n * OBJECT_COMPLETE \u2192 the object closed\n *\n * The v0.1 wire decoder only exposes FIELD/OBJECT; item completion is a\n * semantic projection of array boundaries that every source already carries\n * (each JSON array element, each array append), not a wire record. Strictly\n * typed against the schema \u2014 a value that violates its field type throws.\n */\nexport class JsonToStreamObjectAdapter {\n private readonly fields: Array<{ def: FieldDef; pathKey: string }>;\n private readonly parser: IncrementalJsonParser;\n private readonly events: Event[] = [];\n private readonly onFieldDone: ((field: number, value: FieldValue) => void) | undefined;\n private readonly onItemDone: ((field: number, index: number, value: ScalarValue) => void) | undefined;\n private readonly onObjectDone: (() => void) | undefined;\n\n constructor(schema: Schema, callbacks: JsonAdapterCallbacks = {}) {\n this.fields = schema.map((def, field) => ({ def, pathKey: def.path.join(\".\") }));\n this.onFieldDone = callbacks.onFieldDone;\n this.onItemDone = callbacks.onItemDone;\n this.onObjectDone = callbacks.onObjectDone;\n this.parser = new IncrementalJsonParser((path, value) => this.handleValue(path, value));\n }\n\n push(chunk: string): void {\n this.parser.push(chunk);\n }\n\n getEvents(): Event[] {\n return this.events;\n }\n\n private handleValue(path: string[], value: JsonValue): void {\n const pathKey = path.join(\".\");\n if (pathKey === \"\") {\n // The root object closed.\n this.events.push({ kind: \"object-complete\" });\n this.onObjectDone?.();\n return;\n }\n const index = this.fields.findIndex((f) => f.pathKey === pathKey);\n if (index !== -1) {\n // Whole field value (a scalar, or the completed array).\n const fieldValue = coerceToField(this.fields[index]!.def, value);\n const event: Event = { kind: \"field\", field: index, value: fieldValue };\n this.events.push(event);\n this.onFieldDone?.(index, fieldValue);\n return;\n }\n // Array element: path = fieldPath + numeric segment, field is array mode.\n if (Array.isArray(value) || (typeof value === \"object\" && value !== null)) return;\n const itemField = this.matchArrayItem(path);\n if (itemField === -1) return;\n const def = this.fields[itemField]!.def;\n const item = coerceScalar(def.type, value, def.path.join(\".\"));\n const itemIndex = Number(path[path.length - 1]);\n const itemEvent: Event = { kind: \"item\", field: itemField, index: itemIndex, value: item };\n this.events.push(itemEvent);\n this.onItemDone?.(itemField, itemIndex, item);\n }\n\n private matchArrayItem(path: string[]): number {\n if (path.length < 2) return -1;\n const last = path[path.length - 1]!;\n if (!/^\\d+$/.test(last)) return -1;\n const parentKey = path.slice(0, -1).join(\".\");\n const index = this.fields.findIndex((f) => f.pathKey === parentKey);\n if (index === -1 || this.fields[index]!.def.mode !== \"array\") return -1;\n return index;\n }\n}\n\nfunction coerceToField(def: FieldDef, value: JsonValue): FieldValue {\n if (def.mode === \"array\") {\n if (!Array.isArray(value)) {\n throw new Error(`field ${def.path.join(\".\")}: expected array, got ${JSON.stringify(value)}`);\n }\n return value.map((item) => coerceScalar(def.type, item, def.path.join(\".\")));\n }\n return coerceScalar(def.type, value, def.path.join(\".\"));\n}\n\nfunction coerceScalar(type: FieldType, value: JsonValue, label: string): ScalarValue {\n switch (type) {\n case \"string\":\n if (typeof value !== \"string\") {\n throw new Error(`field ${label}: expected string, got ${JSON.stringify(value)}`);\n }\n return value;\n case \"integer\":\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw new Error(`field ${label}: expected integer, got ${JSON.stringify(value)}`);\n }\n return value;\n case \"number\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`field ${label}: expected number, got ${JSON.stringify(value)}`);\n }\n return value;\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n throw new Error(`field ${label}: expected boolean, got ${JSON.stringify(value)}`);\n }\n return value;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["json_adapter_exports", "__export", "IncrementalJsonParser", "JsonToStreamObjectAdapter", "__toCommonJS", "IncrementalJsonParser", "onValueDone", "__name", "chunk", "i", "c", "ch", "isWhitespace", "top", "_top", "path", "isDigit", "v", "decodeJsonString", "isTerminator", "isCompleteLiteral", "value", "text", "isLiteralPrefix", "ctx", "raw", "out", "esc", "hex", "code", "low", "lowCode", "JsonToStreamObjectAdapter", "schema", "callbacks", "def", "field", "pathKey", "index", "f", "fieldValue", "coerceToField", "event", "itemField", "item", "coerceScalar", "itemIndex", "itemEvent", "last", "parentKey", "type", "label"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var m=(r,a)=>{for(var d in a)c(r,d,{get:a[d],enumerable:!0})},n=(r,a,d,l)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of p(a))!i.call(r,o)&&o!==d&&c(r,o,{get:()=>a[o],enumerable:!(l=t(a,o))||l.enumerable});return r};var y=r=>n(c({},"__esModule",{value:!0}),r);var f={};m(f,{Receiver:()=>e.Receiver,ReferenceDecoder:()=>e.ReferenceDecoder,decode:()=>e.decode,encodeText:()=>e.encodeText,executeRecords:()=>e.executeRecords,materializeObject:()=>e.materializeObject,parseBooleanPayload:()=>e.parseBooleanPayload,parseIntegerPayload:()=>e.parseIntegerPayload,parseNumberPayload:()=>e.parseNumberPayload});module.exports=y(f);var e=require("./reference.js");
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/reference/index.ts"],
4
+ "sourcesContent": ["export {\n ReferenceDecoder,\n Receiver,\n decode,\n encodeText,\n executeRecords,\n materializeObject,\n parseBooleanPayload,\n parseIntegerPayload,\n parseNumberPayload,\n} from \"./reference\";\nexport type {\n Decoder,\n Event,\n FieldDef,\n FieldType,\n FieldValue,\n Payload,\n ScalarValue,\n Schema,\n StreamRecord,\n} from \"./reference\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wVAAAE,EAAAF,GAAA,IAAAG,EAUO",
6
+ "names": ["reference_exports", "__export", "__toCommonJS", "import_reference"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var s=(r,e)=>c(r,"name",{value:e,configurable:!0});var j=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},I=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of R(e))!$.call(r,i)&&i!==t&&c(r,i,{get:()=>e[i],enumerable:!(n=S(e,i))||n.enumerable});return r};var F=r=>I(c({},"__esModule",{value:!0}),r);var G={};j(G,{Receiver:()=>h,ReferenceDecoder:()=>w,allCompositions:()=>B,allSingleCuts:()=>J,decode:()=>V,encodeText:()=>C,executeRecords:()=>M,fieldRecords:()=>E,fragment:()=>D,generateValidRecords:()=>z,materializeObject:()=>P,mulberry32:()=>O,parseBooleanPayload:()=>y,parseIntegerPayload:()=>b,parseNumberPayload:()=>v,randomSchema:()=>H});module.exports=F(G);const A=/^-?(0|[1-9][0-9]*)$/,N=/^-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?$/;function b(r){if(!A.test(r)||r==="-0")return null;const e=Number(r);return Number.isSafeInteger(e)?e:null}s(b,"parseIntegerPayload");function v(r){if(!N.test(r))return null;const e=Number(r);return Number.isFinite(e)?e:null}s(v,"parseNumberPayload");function y(r){return r==="0"?!1:r==="1"?!0:null}s(y,"parseBooleanPayload");function p(r,e,t){switch(r){case"string":return e;case"integer":{const n=b(e);if(n===null)throw new Error(`field ${t}: invalid integer payload`);return n}case"number":{const n=v(e);if(n===null)throw new Error(`field ${t}: invalid number payload`);return n}case"boolean":{const n=y(e);if(n===null)throw new Error(`field ${t}: invalid boolean payload`);return n}}}s(p,"parseTyped");class h{static{s(this,"Receiver")}schema;state;acc;events=[];onEvent;ended=!1;constructor(e,t){this.schema=e,this.onEvent=t,this.state=new Uint8Array(e.length),this.acc=new Array(e.length)}append(e,t){if(this.assertActive(),this.assertField(e),this.state[e]===2)throw new Error(`field ${e}: append after completion`);const n=this.schema[e];if(n.mode==="array"){const i=this.acc[e]??=[],o=n.maxItems;if(i.length>=o)throw new Error(`field ${e}: exceeds maxItems=${o}`);if(n.maxLength!==void 0&&t.length>n.maxLength)throw new Error(`field ${e}: item exceeds maxLength=${n.maxLength}`);i.push(t)}else{const i=this.acc[e]??="";if(n.maxLength!==void 0&&i.length+t.length>n.maxLength)throw new Error(`field ${e}: exceeds maxLength=${n.maxLength}`);this.acc[e]=i+t}this.state[e]=1}complete(e){if(this.assertActive(),this.assertField(e),this.state[e]===2)throw new Error(`field ${e}: completed twice`);const t=this.schema[e];if(this.state[e]===0){if(t.type!=="string"&&t.mode!=="array")throw new Error(`field ${e}: cannot complete an empty ${t.type} field`);this.state[e]=2,this.emit({kind:"field",field:e,value:t.mode==="array"?[]:""});return}this.state[e]=2,this.emit({kind:"field",field:e,value:L(this.schema,e,this.acc[e])})}objectComplete(){this.assertActive(),this.ended=!0,this.emit({kind:"object-complete"})}objectAbort(){this.assertActive(),this.ended=!0,this.emit({kind:"object-abort"})}getEvents(){return this.events}get isEnded(){return this.ended}assertActive(){if(this.ended)throw new Error("object already ended")}assertField(e){if(e<0||e>=this.schema.length)throw new Error(`unknown field ${e}`)}emit(e){this.events.push(e),this.onEvent?.(e)}}function L(r,e,t){const n=r[e];return n.mode==="array"?t.map(i=>p(n.type,i,e)):p(n.type,t,e)}s(L,"materialize");function M(r,e){const t=new h(r);for(const n of e)switch(n.kind){case"append":t.append(n.field,n.payload);break;case"complete":t.complete(n.field);break;case"object-complete":t.objectComplete();break;case"object-abort":t.objectAbort();break}if(!t.isEnded)throw new Error("stream ended before object completion");return t.getEvents()}s(M,"executeRecords");function P(r,e){const t={};for(const n of e)n.kind==="field"&&T(t,r[n.field].path,n.value);return t}s(P,"materializeObject");function T(r,e,t){let n=r;for(let i=0;i<e.length-1;i++){const o=e[i];(typeof n[o]!="object"||n[o]===null)&&(n[o]={}),n=n[o]}n[e[e.length-1]]=t}s(T,"setPath");function C(r){let e="";for(const t of r)switch(t.kind){case"append":e+=`${t.field}:${t.payload.length}:${t.payload};`;break;case"complete":e+=`!${t.field};`;break;case"object-complete":e+="!;";break;case"object-abort":e+="~;";break}return e}s(C,"encodeText");class w{static{s(this,"ReferenceDecoder")}receiver;state="header";fieldId="";length="";payload="";remaining=0;constructor(e,t){this.receiver=new h(e,t)}push(e){for(let t=0;t<e.length;t++){const n=e[t];switch(this.state){case"header":this.onHeader(n);break;case"field-id":this.onFieldId(n);break;case"length":this.onLength(n);break;case"payload":this.onPayload(n);break;case"payload-end":this.onPayloadEnd(n);break;case"control":this.onControl(n);break;case"abort":this.onAbort(n);break}}}end(){if(!this.receiver.isEnded)throw new Error("stream ended before object completion");return this.receiver.getEvents()}onHeader(e){if(l(e)){this.reset(),this.fieldId=e,this.state="field-id";return}if(e==="!"){this.reset(),this.state="control";return}if(e==="~"){this.state="abort";return}throw new Error(`expected record start, got ${JSON.stringify(e)}`)}onFieldId(e){if(l(e)){this.fieldId+=e;return}if(e===":"){this.state="length";return}throw new Error(`expected ':' after field id, got ${JSON.stringify(e)}`)}onLength(e){if(l(e)){this.length+=e;return}if(e===":"){if(this.length==="")throw new Error("empty payload length");this.remaining=Number(this.length),this.payload="",this.state=this.remaining===0?"payload-end":"payload";return}throw new Error(`expected ':' after length, got ${JSON.stringify(e)}`)}onPayload(e){this.payload+=e,--this.remaining===0&&(this.state="payload-end")}onPayloadEnd(e){if(e!==";")throw new Error(`expected ';' after payload, got ${JSON.stringify(e)}`);this.receiver.append(Number(this.fieldId),this.payload),this.state="header"}onControl(e){if(l(e)){this.fieldId+=e;return}if(e===";"){this.fieldId===""?this.receiver.objectComplete():this.receiver.complete(Number(this.fieldId)),this.state="header";return}throw new Error(`expected field id or ';' after '!', got ${JSON.stringify(e)}`)}onAbort(e){if(e!==";")throw new Error(`expected ';' after '~', got ${JSON.stringify(e)}`);this.receiver.objectAbort(),this.state="header"}reset(){this.fieldId="",this.length="",this.payload="",this.remaining=0}}function l(r){return r>="0"&&r<="9"}s(l,"isDigit");function V(r,e){const t=new w(e);for(const n of r)t.push(n);return t.end()}s(V,"decode");function O(r){let e=r>>>0;return()=>{e=e+1831565813>>>0;let t=e;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967296}}s(O,"mulberry32");function D(r,e){const t=[];for(let o=1;o<r.length;o++)e()<.3&&t.push(o);const n=[];let i=0;for(const o of t)n.push(r.slice(i,o)),i=o;return n.push(r.slice(i)),n}s(D,"fragment");function J(r){const e=[];for(let t=1;t<r.length;t++)e.push([r.slice(0,t),r.slice(t)]);return e}s(J,"allSingleCuts");function B(r){const e=[];for(let t=0;t<1<<r.length-1;t++){const n=[];let i=0;for(let o=1;o<r.length;o++)t&1<<o-1&&(n.push(r.slice(i,o)),i=o);n.push(r.slice(i)),e.push(n)}return e}s(B,"allCompositions");const m=["string","integer","number","boolean"],f="abZ09;:!~ \xE9\u{1F600}";function H(r){const e=1+Math.floor(r()*4),t=[];for(let n=0;n<e;n++){const i=m[Math.floor(r()*m.length)],o=r()<.4;t.push({path:[`f${n}`],type:i,...o?{mode:"array",maxItems:1+Math.floor(r()*4)}:{},...r()<.8?{maxLength:1+Math.floor(r()*16)}:{}})}return t}s(H,"randomSchema");function U(r,e){let t="";for(;t.length<e&&r()<.85;)t+=f[Math.floor(r()*f.length)];return t}s(U,"randomString");function _(r,e,t){switch(e){case"string":return r()<.15?"":U(r,t);case"integer":return String(Math.floor(r()*2e3)-1e3);case"number":{const n=r();return n<.4?String(Math.floor(r()*2e3)-1e3):n<.7?String(Math.round((r()*2e3-1e3)*100)/100):String((r()*2-1)*1e10)}case"boolean":return r()<.5?"0":"1"}}s(_,"randomTyped");function g(r,e,t){const n=t??12;for(let i=0;i<100;i++){const o=_(r,e,n);if(o.length<=n)return o}return e==="string"?"":"0"}s(g,"payloadFor");function q(r,e){if(r.length===0)return[];const t=[];let n=0;for(let i=1;i<e;i++){const o=Math.floor(i*r.length/e);t.push(r.slice(n,o)),n=o}return t.push(r.slice(n)),t.filter(i=>i.length>0)}s(q,"splitFragments");function E(r,e,t){const n=e[t],i=[];if(n.mode==="array"){const d=n.maxItems,k=Math.floor(r()*(d+1));for(let u=0;u<k;u++)i.push({kind:"append",field:t,payload:g(r,n.type,n.maxLength)});return r()<.8&&i.push({kind:"complete",field:t}),i}const o=g(r,n.type,n.maxLength),a=q(o,1+Math.floor(r()*4));for(const d of a)i.push({kind:"append",field:t,payload:d});const x=n.type==="string";return(i.length>0?r()<.85:x&&r()<.5)&&i.push({kind:"complete",field:t}),i}s(E,"fieldRecords");function z(r,e){const t=e.map((o,a)=>({field:a,records:E(r,e,a),pos:0})),n=[];let i=t.reduce((o,a)=>o+a.records.length,0);for(;i>0;){let o=t[Math.floor(r()*t.length)];for(;o.pos>=o.records.length;)o=t[(o.field+1)%t.length];n.push(o.records[o.pos]),o.pos++,i--}return n.push(r()<.1?{kind:"object-abort"}:{kind:"object-complete"}),n}s(z,"generateValidRecords");
2
+ //# sourceMappingURL=reference.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/reference/reference.ts"],
4
+ "sourcesContent": ["/**\n * StreamObject Protocol v0.1 \u2014 reference implementation (the executable spec).\n *\n * Deliberately boring: no arena, no pooling, no typed-array chunk chains.\n * Its purpose is to pin down semantics so the optimized receiver can be\n * validated against it instead of inventing behavior.\n *\n * Layering:\n * records --(encodeText)--> text --(fragment)--> chunks\n * chunks --(ReferenceDecoder)--> events\n * records --(Receiver / executeRecords)--> events <- the oracle\n *\n * Contract (the property every decoder must satisfy):\n * decode(fragment(encodeText(records))) === executeRecords(records)\n *\n * See README.md (in this directory) for the normative spec this implements.\n */\n\nexport type Payload = string; // payload as a JS string (UTF-16 code units)\n\nexport type StreamRecord =\n | { kind: \"append\"; field: number; payload: Payload }\n | { kind: \"complete\"; field: number }\n | { kind: \"object-complete\" }\n | { kind: \"object-abort\" };\n\nexport type FieldType = \"string\" | \"integer\" | \"number\" | \"boolean\";\n\nexport interface FieldDef {\n path: string[];\n type: FieldType;\n mode?: \"array\";\n /** Required for array fields. */\n maxItems?: number;\n /** Scalar: cap on accumulated payload length. Array: cap per item. */\n maxLength?: number;\n}\n\nexport type Schema = FieldDef[];\n\nexport type ScalarValue = string | number | boolean;\nexport type FieldValue = ScalarValue | ScalarValue[];\n\nexport type Event =\n | { kind: \"field\"; field: number; value: FieldValue }\n /** Adapter-observable item completion (arrays); not emitted by the v0.1 wire decoder. */\n | { kind: \"item\"; field: number; index: number; value: ScalarValue }\n | { kind: \"object-complete\" }\n | { kind: \"object-abort\" };\n\n// ---- canonical typed payloads (spec \u00A72.1) -----------------------------------\n\nconst INTEGER_RE = /^-?(0|[1-9][0-9]*)$/;\nconst NUMBER_RE = /^-?(0|[1-9][0-9]*)(\\.[0-9]+)?([eE][+-]?[0-9]+)?$/;\n\nexport function parseIntegerPayload(s: string): number | null {\n if (!INTEGER_RE.test(s)) return null;\n if (s === \"-0\") return null;\n const n = Number(s);\n return Number.isSafeInteger(n) ? n : null;\n}\n\nexport function parseNumberPayload(s: string): number | null {\n if (!NUMBER_RE.test(s)) return null;\n const n = Number(s);\n return Number.isFinite(n) ? n : null;\n}\n\nexport function parseBooleanPayload(s: string): boolean | null {\n if (s === \"0\") return false;\n if (s === \"1\") return true;\n return null;\n}\n\nfunction parseTyped(type: FieldType, s: string, field: number): ScalarValue {\n switch (type) {\n case \"string\":\n return s;\n case \"integer\": {\n const v = parseIntegerPayload(s);\n if (v === null) throw new Error(`field ${field}: invalid integer payload`);\n return v;\n }\n case \"number\": {\n const v = parseNumberPayload(s);\n if (v === null) throw new Error(`field ${field}: invalid number payload`);\n return v;\n }\n case \"boolean\": {\n const v = parseBooleanPayload(s);\n if (v === null) throw new Error(`field ${field}: invalid boolean payload`);\n return v;\n }\n }\n}\n\n// ---- semantic engine (shared by oracle and decoder) --------------------------\n\nexport class Receiver {\n private readonly schema: Schema;\n private readonly state: Uint8Array; // 0 unseen, 1 streaming, 2 done\n private readonly acc: Array<string | string[]>;\n private readonly events: Event[] = [];\n private readonly onEvent: ((event: Event) => void) | undefined;\n private ended = false;\n\n constructor(schema: Schema, onEvent?: (event: Event) => void) {\n this.schema = schema;\n this.onEvent = onEvent;\n this.state = new Uint8Array(schema.length);\n this.acc = new Array(schema.length);\n }\n\n append(field: number, payload: string): void {\n this.assertActive();\n this.assertField(field);\n if (this.state[field] === 2) {\n throw new Error(`field ${field}: append after completion`);\n }\n const def = this.schema[field]!;\n if (def.mode === \"array\") {\n const items = (this.acc[field] ??= []) as string[];\n const maxItems = def.maxItems as number;\n if (items.length >= maxItems) {\n throw new Error(`field ${field}: exceeds maxItems=${maxItems}`);\n }\n if (def.maxLength !== undefined && payload.length > def.maxLength) {\n throw new Error(`field ${field}: item exceeds maxLength=${def.maxLength}`);\n }\n items.push(payload);\n } else {\n const current = (this.acc[field] ??= \"\") as string;\n if (def.maxLength !== undefined && current.length + payload.length > def.maxLength) {\n throw new Error(`field ${field}: exceeds maxLength=${def.maxLength}`);\n }\n this.acc[field] = current + payload;\n }\n this.state[field] = 1;\n }\n\n complete(field: number): void {\n this.assertActive();\n this.assertField(field);\n if (this.state[field] === 2) {\n throw new Error(`field ${field}: completed twice`);\n }\n const def = this.schema[field]!;\n if (this.state[field] === 0) {\n if (def.type !== \"string\" && def.mode !== \"array\") {\n throw new Error(`field ${field}: cannot complete an empty ${def.type} field`);\n }\n this.state[field] = 2;\n this.emit({ kind: \"field\", field, value: def.mode === \"array\" ? [] : \"\" });\n return;\n }\n this.state[field] = 2;\n this.emit({\n kind: \"field\",\n field,\n value: materialize(this.schema, field, this.acc[field] as string | string[]),\n });\n }\n\n objectComplete(): void {\n this.assertActive();\n this.ended = true;\n this.emit({ kind: \"object-complete\" });\n }\n\n objectAbort(): void {\n this.assertActive();\n this.ended = true;\n this.emit({ kind: \"object-abort\" });\n }\n\n getEvents(): Event[] {\n return this.events;\n }\n\n get isEnded(): boolean {\n return this.ended;\n }\n\n private assertActive(): void {\n if (this.ended) throw new Error(\"object already ended\");\n }\n\n private assertField(field: number): void {\n if (field < 0 || field >= this.schema.length) {\n throw new Error(`unknown field ${field}`);\n }\n }\n\n private emit(event: Event): void {\n this.events.push(event);\n this.onEvent?.(event);\n }\n}\n\nfunction materialize(schema: Schema, field: number, raw: string | string[]): FieldValue {\n const def = schema[field]!;\n if (def.mode === \"array\") {\n return (raw as string[]).map((item) => parseTyped(def.type, item, field));\n }\n return parseTyped(def.type, raw as string, field);\n}\n\n/** The oracle: execute logical records directly. */\nexport function executeRecords(schema: Schema, records: StreamRecord[]): Event[] {\n const receiver = new Receiver(schema);\n for (const record of records) {\n switch (record.kind) {\n case \"append\":\n receiver.append(record.field, record.payload);\n break;\n case \"complete\":\n receiver.complete(record.field);\n break;\n case \"object-complete\":\n receiver.objectComplete();\n break;\n case \"object-abort\":\n receiver.objectAbort();\n break;\n }\n }\n if (!receiver.isEnded) throw new Error(\"stream ended before object completion\");\n return receiver.getEvents();\n}\n\n// ---- materialization ----------------------------------------------------------\n\nexport function materializeObject(schema: Schema, events: Event[]): Record<string, unknown> {\n const object: Record<string, unknown> = {};\n for (const event of events) {\n if (event.kind !== \"field\") continue;\n setPath(object, schema[event.field]!.path, event.value);\n }\n return object;\n}\n\nfunction setPath(object: Record<string, unknown>, path: string[], value: unknown): void {\n let target = object;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]!;\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n target[path[path.length - 1]!] = value;\n}\n\n// ---- reference text encoding (spec \u00A78) ----------------------------------------\n\nexport function encodeText(records: StreamRecord[]): string {\n let out = \"\";\n for (const record of records) {\n switch (record.kind) {\n case \"append\":\n out += `${record.field}:${record.payload.length}:${record.payload};`;\n break;\n case \"complete\":\n out += `!${record.field};`;\n break;\n case \"object-complete\":\n out += \"!;\";\n break;\n case \"object-abort\":\n out += \"~;\";\n break;\n }\n }\n return out;\n}\n\n// ---- reference decoder ----------------------------------------------------------\n\n/**\n * The contract every implementation (including the future arena-backed\n * receiver) must satisfy:\n *\n * push(fragment(encodeText(records))) + end() === executeRecords(schema, records)\n */\nexport interface Decoder {\n push(chunk: string): void;\n end(): Event[];\n}\n\ntype ParserState = \"header\" | \"field-id\" | \"length\" | \"payload\" | \"payload-end\" | \"control\" | \"abort\";\n\nexport class ReferenceDecoder implements Decoder {\n private readonly receiver: Receiver;\n private state: ParserState = \"header\";\n private fieldId = \"\";\n private length = \"\";\n private payload = \"\";\n private remaining = 0;\n\n constructor(schema: Schema, onEvent?: (event: Event) => void) {\n this.receiver = new Receiver(schema, onEvent);\n }\n\n push(chunk: string): void {\n for (let i = 0; i < chunk.length; i++) {\n const c = chunk[i]!;\n switch (this.state) {\n case \"header\":\n this.onHeader(c);\n break;\n case \"field-id\":\n this.onFieldId(c);\n break;\n case \"length\":\n this.onLength(c);\n break;\n case \"payload\":\n this.onPayload(c);\n break;\n case \"payload-end\":\n this.onPayloadEnd(c);\n break;\n case \"control\":\n this.onControl(c);\n break;\n case \"abort\":\n this.onAbort(c);\n break;\n }\n }\n }\n\n end(): Event[] {\n if (!this.receiver.isEnded) throw new Error(\"stream ended before object completion\");\n return this.receiver.getEvents();\n }\n\n private onHeader(c: string): void {\n if (isDigit(c)) {\n this.reset();\n this.fieldId = c;\n this.state = \"field-id\";\n return;\n }\n if (c === \"!\") {\n this.reset();\n this.state = \"control\";\n return;\n }\n if (c === \"~\") {\n this.state = \"abort\";\n return;\n }\n throw new Error(`expected record start, got ${JSON.stringify(c)}`);\n }\n\n private onFieldId(c: string): void {\n if (isDigit(c)) {\n this.fieldId += c;\n return;\n }\n if (c === \":\") {\n this.state = \"length\";\n return;\n }\n throw new Error(`expected ':' after field id, got ${JSON.stringify(c)}`);\n }\n\n private onLength(c: string): void {\n if (isDigit(c)) {\n this.length += c;\n return;\n }\n if (c === \":\") {\n if (this.length === \"\") throw new Error(\"empty payload length\");\n this.remaining = Number(this.length);\n this.payload = \"\";\n this.state = this.remaining === 0 ? \"payload-end\" : \"payload\";\n return;\n }\n throw new Error(`expected ':' after length, got ${JSON.stringify(c)}`);\n }\n\n private onPayload(c: string): void {\n this.payload += c;\n if (--this.remaining === 0) this.state = \"payload-end\";\n }\n\n private onPayloadEnd(c: string): void {\n if (c !== \";\") throw new Error(`expected ';' after payload, got ${JSON.stringify(c)}`);\n this.receiver.append(Number(this.fieldId), this.payload);\n this.state = \"header\";\n }\n\n private onControl(c: string): void {\n if (isDigit(c)) {\n this.fieldId += c;\n return;\n }\n if (c === \";\") {\n if (this.fieldId === \"\") this.receiver.objectComplete();\n else this.receiver.complete(Number(this.fieldId));\n this.state = \"header\";\n return;\n }\n throw new Error(`expected field id or ';' after '!', got ${JSON.stringify(c)}`);\n }\n\n private onAbort(c: string): void {\n if (c !== \";\") throw new Error(`expected ';' after '~', got ${JSON.stringify(c)}`);\n this.receiver.objectAbort();\n this.state = \"header\";\n }\n\n private reset(): void {\n this.fieldId = \"\";\n this.length = \"\";\n this.payload = \"\";\n this.remaining = 0;\n }\n}\n\nfunction isDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n}\n\n/** Decode a sequence of transport chunks into events. */\nexport function decode(chunks: string[], schema: Schema): Event[] {\n const decoder = new ReferenceDecoder(schema);\n for (const chunk of chunks) decoder.push(chunk);\n return decoder.end();\n}\n\n// ---- test utilities: rng, fragmentation, generators ----------------------------\n\nexport type Rng = () => number;\n\nexport function mulberry32(seed: number): Rng {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function fragment(text: string, rng: Rng): string[] {\n const cuts: number[] = [];\n for (let i = 1; i < text.length; i++) {\n if (rng() < 0.3) cuts.push(i);\n }\n const chunks: string[] = [];\n let prev = 0;\n for (const cut of cuts) {\n chunks.push(text.slice(prev, cut));\n prev = cut;\n }\n chunks.push(text.slice(prev));\n return chunks;\n}\n\n/** Every single-cut fragmentation of a message. */\nexport function allSingleCuts(text: string): string[][] {\n const out: string[][] = [];\n for (let i = 1; i < text.length; i++) {\n out.push([text.slice(0, i), text.slice(i)]);\n }\n return out;\n}\n\n/** Every composition into 1..n chunks \u2014 2^(n-1) cases. Only for small messages. */\nexport function allCompositions(text: string): string[][] {\n const out: string[][] = [];\n for (let mask = 0; mask < 1 << (text.length - 1); mask++) {\n const chunks: string[] = [];\n let prev = 0;\n for (let i = 1; i < text.length; i++) {\n if (mask & (1 << (i - 1))) {\n chunks.push(text.slice(prev, i));\n prev = i;\n }\n }\n chunks.push(text.slice(prev));\n out.push(chunks);\n }\n return out;\n}\n\n// ---- random valid stream generators ----------------------------------------------\n\nconst TYPES: FieldType[] = [\"string\", \"integer\", \"number\", \"boolean\"];\nconst ALPHABET = \"abZ09;:!~ \u00E9\uD83D\uDE00\"; // protocol punctuation inside payloads + astral chars\n\nexport function randomSchema(rng: Rng): Schema {\n const count = 1 + Math.floor(rng() * 4);\n const schema: Schema = [];\n for (let i = 0; i < count; i++) {\n const type = TYPES[Math.floor(rng() * TYPES.length)]!;\n const isArray = rng() < 0.4;\n schema.push({\n path: [`f${i}`],\n type,\n ...(isArray ? { mode: \"array\" as const, maxItems: 1 + Math.floor(rng() * 4) } : {}),\n ...(rng() < 0.8 ? { maxLength: 1 + Math.floor(rng() * 16) } : {}),\n });\n }\n return schema;\n}\n\nfunction randomString(rng: Rng, cap: number): string {\n let s = \"\";\n while (s.length < cap && rng() < 0.85) {\n s += ALPHABET[Math.floor(rng() * ALPHABET.length)]!;\n }\n return s;\n}\n\nfunction randomTyped(rng: Rng, type: FieldType, cap: number): string {\n switch (type) {\n case \"string\":\n return rng() < 0.15 ? \"\" : randomString(rng, cap);\n case \"integer\":\n return String(Math.floor(rng() * 2000) - 1000);\n case \"number\": {\n const r = rng();\n if (r < 0.4) return String(Math.floor(rng() * 2000) - 1000);\n if (r < 0.7) return String(Math.round((rng() * 2000 - 1000) * 100) / 100);\n return String((rng() * 2 - 1) * 1e10);\n }\n case \"boolean\":\n return rng() < 0.5 ? \"0\" : \"1\";\n }\n}\n\n/** A payload that satisfies the type and (when set) the length cap. */\nfunction payloadFor(rng: Rng, type: FieldType, cap: number | undefined): string {\n const limit = cap ?? 12;\n for (let i = 0; i < 100; i++) {\n const p = randomTyped(rng, type, limit);\n if (p.length <= limit) return p;\n }\n return type === \"string\" ? \"\" : \"0\";\n}\n\nfunction splitFragments(s: string, count: number): string[] {\n if (s.length === 0) return [];\n const chunks: string[] = [];\n let prev = 0;\n for (let i = 1; i < count; i++) {\n const cut = Math.floor((i * s.length) / count);\n chunks.push(s.slice(prev, cut));\n prev = cut;\n }\n chunks.push(s.slice(prev));\n return chunks.filter((c) => c.length > 0);\n}\n\n/** Records for one field: appends (one item each for arrays), maybe a completion. */\nexport function fieldRecords(rng: Rng, schema: Schema, field: number): StreamRecord[] {\n const def = schema[field]!;\n const records: StreamRecord[] = [];\n\n if (def.mode === \"array\") {\n const maxItems = def.maxItems as number;\n const count = Math.floor(rng() * (maxItems + 1));\n for (let i = 0; i < count; i++) {\n records.push({ kind: \"append\", field, payload: payloadFor(rng, def.type, def.maxLength) });\n }\n if (rng() < 0.8) records.push({ kind: \"complete\", field });\n return records;\n }\n\n // scalar: generate the final payload, then fragment it across appends\n const total = payloadFor(rng, def.type, def.maxLength);\n const fragments = splitFragments(total, 1 + Math.floor(rng() * 4));\n for (const fragment of fragments) {\n records.push({ kind: \"append\", field, payload: fragment });\n }\n\n const canCompleteEmpty = def.type === \"string\";\n const hasContent = records.length > 0;\n if (hasContent ? rng() < 0.85 : canCompleteEmpty && rng() < 0.5) {\n records.push({ kind: \"complete\", field });\n }\n return records;\n}\n\n/** A valid record sequence for the schema, randomly scheduled. */\nexport function generateValidRecords(rng: Rng, schema: Schema): StreamRecord[] {\n const queues = schema.map((_, field) => ({\n field,\n records: fieldRecords(rng, schema, field),\n pos: 0,\n }));\n const out: StreamRecord[] = [];\n let remaining = queues.reduce((n, q) => n + q.records.length, 0);\n\n while (remaining > 0) {\n let queue = queues[Math.floor(rng() * queues.length)]!;\n while (queue.pos >= queue.records.length) {\n queue = queues[(queue.field + 1) % queues.length]!;\n }\n out.push(queue.records[queue.pos]!);\n queue.pos++;\n remaining--;\n }\n\n out.push(rng() < 0.1 ? { kind: \"object-abort\" } : { kind: \"object-complete\" });\n return out;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["reference_exports", "__export", "Receiver", "ReferenceDecoder", "allCompositions", "allSingleCuts", "decode", "encodeText", "executeRecords", "fieldRecords", "fragment", "generateValidRecords", "materializeObject", "mulberry32", "parseBooleanPayload", "parseIntegerPayload", "parseNumberPayload", "randomSchema", "__toCommonJS", "INTEGER_RE", "NUMBER_RE", "parseIntegerPayload", "s", "n", "__name", "parseNumberPayload", "parseBooleanPayload", "parseTyped", "type", "field", "v", "Receiver", "schema", "onEvent", "payload", "def", "items", "maxItems", "current", "materialize", "event", "raw", "item", "executeRecords", "records", "receiver", "record", "materializeObject", "events", "object", "setPath", "path", "value", "target", "key", "encodeText", "out", "ReferenceDecoder", "chunk", "i", "c", "isDigit", "decode", "chunks", "decoder", "mulberry32", "seed", "a", "fragment", "text", "rng", "cuts", "prev", "cut", "allSingleCuts", "allCompositions", "mask", "TYPES", "ALPHABET", "randomSchema", "count", "isArray", "randomString", "cap", "randomTyped", "r", "payloadFor", "limit", "p", "splitFragments", "fieldRecords", "total", "fragments", "canCompleteEmpty", "generateValidRecords", "queues", "_", "remaining", "q", "queue"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var o in e)a(r,o,{get:e[o],enumerable:!0})},j=(r,e,o,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of l(e))!b.call(r,t)&&t!==o&&a(r,t,{get:()=>e[t],enumerable:!(m=d(e,t))||m.enumerable});return r};var p=r=>j(a({},"__esModule",{value:!0}),r);var H={};c(H,{StreamObject:()=>n.StreamObject});module.exports=p(H);var n=require("./stream-object.js");
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/stream-object/index.ts"],
4
+ "sourcesContent": ["export { StreamObject } from \"./stream-object\";\nexport type {\n ErrorHandler,\n FieldHandler,\n ItemHandler,\n ObjectDoneHandler,\n StreamObjectOptions,\n} from \"./stream-object\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kDAAAE,EAAAF,GAAA,IAAAG,EAA6B",
6
+ "names": ["stream_object_exports", "__export", "__toCommonJS", "import_stream_object"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var a=(o,r)=>s(o,"name",{value:r,configurable:!0});var h=(o,r)=>{for(var i in r)s(o,i,{get:r[i],enumerable:!0})},f=(o,r,i,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of d(r))!p.call(o,e)&&e!==i&&s(o,e,{get:()=>r[e],enumerable:!(t=m(r,e))||t.enumerable});return o};var b=o=>f(s({},"__esModule",{value:!0}),o);var S={};h(S,{StreamObject:()=>O});module.exports=b(S);var n=require("../field-stream/field-stream.js"),c=require("../json-adapter/json-adapter.js");class O extends n.FieldStream{constructor(i,t,e={}){super(t,e);this.source=i}source;static{a(this,"StreamObject")}started=!1;async start(){if(this.started)throw new Error("StreamObject already started");this.started=!0;const i=new c.JsonToStreamObjectAdapter(this.schema,{onFieldDone:a((t,e)=>this.emitField(t,e),"onFieldDone"),onItemDone:a((t,e,l)=>this.emitItem(t,e,l),"onItemDone"),onObjectDone:a(()=>this.emitObject(i.getEvents()),"onObjectDone")});try{for await(const t of this.source){if(this.cancelled)break;for(let e=0;e<t.length&&!this.cancelled;e++)i.push(t[e])}if(!this.cancelled&&!this.objectCompleted)throw new Error("stream ended before object completion")}catch(t){if(this.cancelled)return;this.fail(t)}}}
2
+ //# sourceMappingURL=stream-object.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/transport/streamobject/stream-object/stream-object.ts"],
4
+ "sourcesContent": ["/**\n * StreamObject \u2014 consumes an AsyncIterable of text chunks through the\n * incremental JSON adapter and exposes the FieldStream completion API.\n *\n * const stream = new StreamObject(source, schema);\n * stream.when(\"summary\", (summary) => { ... }); // field completion\n * stream.whenItem(\"searchQueries\", (query, i) => { ... }); // item completion\n * stream.whenObjectDone((object) => { ... }); // whole object\n * stream.onError((error) => { ... }); // failures\n * await stream.start();\n *\n * `when` means completion, not mutation: handlers never see chunks, JSON,\n * SSE, or the wire codec. Handlers are invoked synchronously at the\n * completion boundary and never block the source; async handlers run\n * concurrently and their rejections are routed to onError. `cancel()` stops\n * the source and invokes the optional onCancel hook (e.g. to abort the\n * producer's request).\n *\n * Errors: delivered to onError handlers when registered; otherwise start()\n * rejects with the error. Cancelling the stream is not an error.\n */\n\nimport { FieldStream, type FieldStreamOptions } from \"../field-stream/field-stream\";\nimport { JsonToStreamObjectAdapter } from \"../json-adapter/json-adapter\";\nimport type { Schema } from \"../reference/reference\";\n\nexport type {\n ErrorHandler,\n FieldHandler,\n FieldStreamOptions,\n ItemHandler,\n ObjectDoneHandler,\n} from \"../field-stream/field-stream\";\n\nexport type StreamObjectOptions = FieldStreamOptions;\n\nexport class StreamObject extends FieldStream {\n private started = false;\n\n constructor(\n private readonly source: AsyncIterable<string>,\n schema: Schema,\n options: StreamObjectOptions = {},\n ) {\n super(schema, options);\n }\n\n async start(): Promise<void> {\n if (this.started) throw new Error(\"StreamObject already started\");\n this.started = true;\n\n const adapter = new JsonToStreamObjectAdapter(this.schema, {\n onFieldDone: (field, value) => this.emitField(field, value),\n onItemDone: (field, index, value) => this.emitItem(field, index, value),\n onObjectDone: () => this.emitObject(adapter.getEvents()),\n });\n\n try {\n for await (const chunk of this.source) {\n if (this.cancelled) break;\n for (let i = 0; i < chunk.length; i++) {\n if (this.cancelled) break;\n adapter.push(chunk[i]!);\n }\n }\n if (!this.cancelled && !this.objectCompleted) {\n throw new Error(\"stream ended before object completion\");\n }\n } catch (error) {\n if (this.cancelled) return; // intended cancellation (e.g. producer aborted)\n this.fail(error);\n }\n }\n}\n"],
5
+ "mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAsBA,IAAAI,EAAqD,wCACrDC,EAA0C,wCAanC,MAAMC,UAAqB,aAAY,CAG5C,YACmBC,EACjBC,EACAC,EAA+B,CAAC,EAChC,CACA,MAAMD,EAAQC,CAAO,EAJJ,YAAAF,CAKnB,CALmB,OAxCrB,MAoC8C,CAAAG,EAAA,qBACpC,QAAU,GAUlB,MAAM,OAAuB,CAC3B,GAAI,KAAK,QAAS,MAAM,IAAI,MAAM,8BAA8B,EAChE,KAAK,QAAU,GAEf,MAAMC,EAAU,IAAI,4BAA0B,KAAK,OAAQ,CACzD,YAAaD,EAAA,CAACE,EAAOC,IAAU,KAAK,UAAUD,EAAOC,CAAK,EAA7C,eACb,WAAYH,EAAA,CAACE,EAAOE,EAAOD,IAAU,KAAK,SAASD,EAAOE,EAAOD,CAAK,EAA1D,cACZ,aAAcH,EAAA,IAAM,KAAK,WAAWC,EAAQ,UAAU,CAAC,EAAzC,eAChB,CAAC,EAED,GAAI,CACF,gBAAiBI,KAAS,KAAK,OAAQ,CACrC,GAAI,KAAK,UAAW,MACpB,QAASC,EAAI,EAAGA,EAAID,EAAM,QACpB,MAAK,UADuBC,IAEhCL,EAAQ,KAAKI,EAAMC,CAAC,CAAE,CAE1B,CACA,GAAI,CAAC,KAAK,WAAa,CAAC,KAAK,gBAC3B,MAAM,IAAI,MAAM,uCAAuC,CAE3D,OAASC,EAAO,CACd,GAAI,KAAK,UAAW,OACpB,KAAK,KAAKA,CAAK,CACjB,CACF,CACF",
6
+ "names": ["stream_object_exports", "__export", "StreamObject", "__toCommonJS", "import_field_stream", "import_json_adapter", "StreamObject", "source", "schema", "options", "__name", "adapter", "field", "value", "index", "chunk", "i", "error"]
7
+ }
@@ -1,2 +1,2 @@
1
- var c=Object.defineProperty;var g=(m,e)=>c(m,"name",{value:e,configurable:!0});import"./tools/tools.js";class L{static{g(this,"Agent")}name;context;toolRegistry=new Map;llm;constructor(e){const t=e.name.trim();if(!t)throw new Error("Agent requires a non-empty name");this.name=t,this.context=e.context?.trim()??"",this.llm=e.llm;for(const n of e.tools??[])this.addTool(n)}get tools(){return[...this.toolRegistry.values()]}addTool(e){if(this.toolRegistry.has(e.name))throw new Error(`Agent already has a tool named "${e.name}"`);this.toolRegistry.set(e.name,e)}hasTool(e){return this.toolRegistry.has(e)}getTool(e){return this.toolRegistry.get(e)}async run(e){if(!this.llm)throw new Error(`Agent "${this.name}" has no LLM provider configured. Pass an LLM when constructing the agent or the Pipeflow instance.`);const t=[];this.context&&t.push({role:"system",content:this.context}),e.history&&t.push(...e.history),t.push({role:"user",content:e.prompt});const n=this.tools.map(s=>({name:s.name,description:s.description,parameters:s.parameters??{type:"object",properties:{}}})),o=[],l=e.maxToolIterations??10;for(let s=0;s<l;s++){const{text:i,toolCalls:a}=await this.streamOnce({llm:this.llm,messages:t,definitions:n,temperature:e.temperature,maxTokens:e.maxTokens});if(a.length===0)return{text:i,messages:t,toolCalls:o};t.push({role:"assistant",content:i,toolCalls:a});for(const r of a){const u=await this.executeToolCall(r);o.push(u),t.push({role:"tool",toolCallId:r.id,name:r.name,content:JSON.stringify(u.result)})}}throw new Error(`Agent "${this.name}" exceeded ${l} tool iterations`)}async streamOnce(e){const{llm:t,messages:n,definitions:o,temperature:l,maxTokens:s}=e;let i="";const a=[];for await(const r of t.stream({messages:n,tools:o,temperature:l,maxTokens:s}))switch(r.type){case"delta":i+=r.content;break;case"tool_call":a.push({id:r.id,name:r.name,arguments:r.arguments});break;case"done":return{text:i,toolCalls:a};case"error":throw r.error}return{text:i,toolCalls:a}}async executeToolCall(e){const t=this.toolRegistry.get(e.name);let n;try{n=JSON.parse(e.arguments)}catch{n=e.arguments}if(!t)return{id:e.id,name:e.name,arguments:n,result:{error:`Unknown tool "${e.name}"`}};try{const o=await t.execute(n);return{id:e.id,name:e.name,arguments:n,result:o}}catch(o){return{id:e.id,name:e.name,arguments:n,result:{error:o instanceof Error?o.message:String(o)}}}}}export{L as Agent};
1
+ var c=Object.defineProperty;var g=(u,e)=>c(u,"name",{value:e,configurable:!0});import"./tools/tools.js";class L{static{g(this,"Agent")}name;aliases;context;toolRegistry=new Map;llm;constructor(e){const t=e.name.trim();if(!t)throw new Error("Agent requires a non-empty name");this.name=t,this.aliases=[...e.aliases??[]],this.context=e.context?.trim()??"",this.llm=e.llm;for(const n of e.tools??[])this.addTool(n)}get tools(){return[...this.toolRegistry.values()]}addTool(e){if(this.toolRegistry.has(e.name))throw new Error(`Agent already has a tool named "${e.name}"`);this.toolRegistry.set(e.name,e)}hasTool(e){return this.toolRegistry.has(e)}getTool(e){return this.toolRegistry.get(e)}async run(e){if(!this.llm)throw new Error(`Agent "${this.name}" has no LLM provider configured. Pass an LLM when constructing the agent or the Pipeflow instance.`);const t=[];this.context&&t.push({role:"system",content:this.context}),e.history&&t.push(...e.history),t.push({role:"user",content:e.prompt});const n=this.tools.map(r=>({name:r.name,description:r.description,parameters:r.parameters??{type:"object",properties:{}}})),o=[],m=e.maxToolIterations??10;for(let r=0;r<m;r++){const{text:i,toolCalls:a}=await this.streamOnce({llm:this.llm,messages:t,definitions:n,temperature:e.temperature,maxTokens:e.maxTokens});if(a.length===0)return{text:i,messages:t,toolCalls:o};t.push({role:"assistant",content:i,toolCalls:a});const s=await Promise.all(a.map(l=>this.executeToolCall(l)));for(const l of s)o.push(l),t.push({role:"tool",toolCallId:l.id,name:l.name,content:JSON.stringify(l.result)})}throw new Error(`Agent "${this.name}" exceeded ${m} tool iterations`)}async streamOnce(e){const{llm:t,messages:n,definitions:o,temperature:m,maxTokens:r}=e;let i="";const a=[];for await(const s of t.stream({messages:n,tools:o,temperature:m,maxTokens:r}))switch(s.type){case"delta":i+=s.content;break;case"tool_call":a.push({id:s.id,name:s.name,arguments:s.arguments});break;case"done":return{text:i,toolCalls:a};case"error":throw s.error}return{text:i,toolCalls:a}}async executeToolCall(e){const t=this.toolRegistry.get(e.name);let n;try{n=JSON.parse(e.arguments)}catch{n=e.arguments}if(!t)return{id:e.id,name:e.name,arguments:n,result:{error:`Unknown tool "${e.name}"`}};try{const o=await t.execute(n);return{id:e.id,name:e.name,arguments:n,result:o}}catch(o){return{id:e.id,name:e.name,arguments:n,result:{error:o instanceof Error?o.message:String(o)}}}}}export{L as Agent};
2
2
  //# sourceMappingURL=agent.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/agents/agent.ts"],
4
- "sourcesContent": ["import { Tool } from \"./tools/tools\";\nimport type {\n LLM,\n LLMMessage,\n LLMToolCall,\n LLMToolDefinition,\n} from \"../providers/llm/types\";\n\nexport interface AgentOptions {\n name: string;\n context?: string;\n tools?: Tool<never, unknown>[];\n /** LLM provider used by `run()`. Injected by `Pipeflow.agent()`. */\n llm?: LLM;\n}\n\nexport interface AgentRunRequest {\n prompt: string;\n /** Prior messages to continue from, e.g. a previous `run()` result. */\n history?: LLMMessage[];\n temperature?: number;\n maxTokens?: number;\n /** Safety bound on the number of tool-call round trips. */\n maxToolIterations?: number;\n}\n\nexport interface ExecutedToolCall {\n id: string;\n name: string;\n /** Parsed arguments, or the raw JSON string if parsing failed. */\n arguments: unknown;\n /** The tool result, or `{ error }` when the tool failed or is unknown. */\n result: unknown;\n}\n\nexport interface AgentRunResult {\n /** The assistant's final text response. */\n text: string;\n /** The full message history including the response and tool results. */\n messages: LLMMessage[];\n /** Every tool call executed during the run, in order. */\n toolCalls: ExecutedToolCall[];\n}\n\n/**\n * An AI persona: a name, a system context, and a set of tools.\n *\n * An agent can participate in conversations or be invoked independently\n * with `run()`.\n */\nexport class Agent {\n readonly name: string;\n readonly context: string;\n private readonly toolRegistry = new Map<string, Tool<never, unknown>>();\n /** LLM provider used by `run()` and the orchestrator. */\n readonly llm: LLM | undefined;\n\n constructor(options: AgentOptions) {\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Agent requires a non-empty name\");\n }\n this.name = name;\n this.context = options.context?.trim() ?? \"\";\n this.llm = options.llm;\n for (const tool of options.tools ?? []) {\n this.addTool(tool);\n }\n }\n\n get tools(): Tool<never, unknown>[] {\n return [...this.toolRegistry.values()];\n }\n\n addTool(tool: Tool<never, unknown>): void {\n if (this.toolRegistry.has(tool.name)) {\n throw new Error(`Agent already has a tool named \"${tool.name}\"`);\n }\n this.toolRegistry.set(tool.name, tool);\n }\n\n hasTool(name: string): boolean {\n return this.toolRegistry.has(name);\n }\n\n getTool(name: string): Tool<never, unknown> | undefined {\n return this.toolRegistry.get(name);\n }\n\n /**\n * Run the agent against the LLM, executing any requested tools and\n * feeding their results back until the model responds without a tool\n * call.\n */\n async run(request: AgentRunRequest): Promise<AgentRunResult> {\n if (!this.llm) {\n throw new Error(\n `Agent \"${this.name}\" has no LLM provider configured. ` +\n \"Pass an LLM when constructing the agent or the Pipeflow instance.\",\n );\n }\n\n const messages: LLMMessage[] = [];\n if (this.context) {\n messages.push({ role: \"system\", content: this.context });\n }\n if (request.history) {\n messages.push(...request.history);\n }\n messages.push({ role: \"user\", content: request.prompt });\n\n const definitions: LLMToolDefinition[] = this.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters ?? { type: \"object\", properties: {} },\n }));\n\n const executed: ExecutedToolCall[] = [];\n const maxIterations = request.maxToolIterations ?? 10;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n const { text, toolCalls } = await this.streamOnce({\n llm: this.llm,\n messages,\n definitions,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n });\n\n if (toolCalls.length === 0) {\n return { text, messages, toolCalls: executed };\n }\n\n messages.push({ role: \"assistant\", content: text, toolCalls });\n for (const call of toolCalls) {\n const executedCall = await this.executeToolCall(call);\n executed.push(executedCall);\n messages.push({\n role: \"tool\",\n toolCallId: call.id,\n name: call.name,\n content: JSON.stringify(executedCall.result),\n });\n }\n }\n\n throw new Error(\n `Agent \"${this.name}\" exceeded ${maxIterations} tool iterations`,\n );\n }\n\n private async streamOnce(options: {\n llm: LLM;\n messages: LLMMessage[];\n definitions: LLMToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; toolCalls: LLMToolCall[] }> {\n const { llm, messages, definitions, temperature, maxTokens } = options;\n let text = \"\";\n const toolCalls: LLMToolCall[] = [];\n\n for await (const event of llm.stream({\n messages,\n tools: definitions,\n temperature,\n maxTokens,\n })) {\n switch (event.type) {\n case \"delta\":\n text += event.content;\n break;\n case \"tool_call\":\n toolCalls.push({ id: event.id, name: event.name, arguments: event.arguments });\n break;\n case \"done\":\n return { text, toolCalls };\n case \"error\":\n throw event.error;\n }\n }\n\n return { text, toolCalls };\n }\n\n private async executeToolCall(call: LLMToolCall): Promise<ExecutedToolCall> {\n const tool = this.toolRegistry.get(call.name);\n\n let args: unknown;\n try {\n args = JSON.parse(call.arguments);\n } catch {\n args = call.arguments;\n }\n\n if (!tool) {\n return {\n id: call.id,\n name: call.name,\n arguments: args,\n result: { error: `Unknown tool \"${call.name}\"` },\n };\n }\n\n try {\n const result = await tool.execute(args as never);\n return { id: call.id, name: call.name, arguments: args, result };\n } catch (error) {\n return {\n id: call.id,\n name: call.name,\n arguments: args,\n result: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n}\n"],
5
- "mappings": "+EAAA,MAAqB,gBAkDd,MAAMA,CAAM,CAlDnB,MAkDmB,CAAAC,EAAA,cACR,KACA,QACQ,aAAe,IAAI,IAE3B,IAET,YAAYC,EAAuB,CACjC,MAAMC,EAAOD,EAAQ,KAAK,KAAK,EAC/B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iCAAiC,EAEnD,KAAK,KAAOA,EACZ,KAAK,QAAUD,EAAQ,SAAS,KAAK,GAAK,GAC1C,KAAK,IAAMA,EAAQ,IACnB,UAAWE,KAAQF,EAAQ,OAAS,CAAC,EACnC,KAAK,QAAQE,CAAI,CAErB,CAEA,IAAI,OAAgC,CAClC,MAAO,CAAC,GAAG,KAAK,aAAa,OAAO,CAAC,CACvC,CAEA,QAAQA,EAAkC,CACxC,GAAI,KAAK,aAAa,IAAIA,EAAK,IAAI,EACjC,MAAM,IAAI,MAAM,mCAAmCA,EAAK,IAAI,GAAG,EAEjE,KAAK,aAAa,IAAIA,EAAK,KAAMA,CAAI,CACvC,CAEA,QAAQD,EAAuB,CAC7B,OAAO,KAAK,aAAa,IAAIA,CAAI,CACnC,CAEA,QAAQA,EAAgD,CACtD,OAAO,KAAK,aAAa,IAAIA,CAAI,CACnC,CAOA,MAAM,IAAIE,EAAmD,CAC3D,GAAI,CAAC,KAAK,IACR,MAAM,IAAI,MACR,UAAU,KAAK,IAAI,qGAErB,EAGF,MAAMC,EAAyB,CAAC,EAC5B,KAAK,SACPA,EAAS,KAAK,CAAE,KAAM,SAAU,QAAS,KAAK,OAAQ,CAAC,EAErDD,EAAQ,SACVC,EAAS,KAAK,GAAGD,EAAQ,OAAO,EAElCC,EAAS,KAAK,CAAE,KAAM,OAAQ,QAASD,EAAQ,MAAO,CAAC,EAEvD,MAAME,EAAmC,KAAK,MAAM,IAAKH,IAAU,CACjE,KAAMA,EAAK,KACX,YAAaA,EAAK,YAClB,WAAYA,EAAK,YAAc,CAAE,KAAM,SAAU,WAAY,CAAC,CAAE,CAClE,EAAE,EAEII,EAA+B,CAAC,EAChCC,EAAgBJ,EAAQ,mBAAqB,GAEnD,QAASK,EAAY,EAAGA,EAAYD,EAAeC,IAAa,CAC9D,KAAM,CAAE,KAAAC,EAAM,UAAAC,CAAU,EAAI,MAAM,KAAK,WAAW,CAChD,IAAK,KAAK,IACV,SAAAN,EACA,YAAAC,EACA,YAAaF,EAAQ,YACrB,UAAWA,EAAQ,SACrB,CAAC,EAED,GAAIO,EAAU,SAAW,EACvB,MAAO,CAAE,KAAAD,EAAM,SAAAL,EAAU,UAAWE,CAAS,EAG/CF,EAAS,KAAK,CAAE,KAAM,YAAa,QAASK,EAAM,UAAAC,CAAU,CAAC,EAC7D,UAAWC,KAAQD,EAAW,CAC5B,MAAME,EAAe,MAAM,KAAK,gBAAgBD,CAAI,EACpDL,EAAS,KAAKM,CAAY,EAC1BR,EAAS,KAAK,CACZ,KAAM,OACN,WAAYO,EAAK,GACjB,KAAMA,EAAK,KACX,QAAS,KAAK,UAAUC,EAAa,MAAM,CAC7C,CAAC,CACH,CACF,CAEA,MAAM,IAAI,MACR,UAAU,KAAK,IAAI,cAAcL,CAAa,kBAChD,CACF,CAEA,MAAc,WAAWP,EAM+B,CACtD,KAAM,CAAE,IAAAa,EAAK,SAAAT,EAAU,YAAAC,EAAa,YAAAS,EAAa,UAAAC,CAAU,EAAIf,EAC/D,IAAIS,EAAO,GACX,MAAMC,EAA2B,CAAC,EAElC,gBAAiBM,KAASH,EAAI,OAAO,CACnC,SAAAT,EACA,MAAOC,EACP,YAAAS,EACA,UAAAC,CACF,CAAC,EACC,OAAQC,EAAM,KAAM,CAClB,IAAK,QACHP,GAAQO,EAAM,QACd,MACF,IAAK,YACHN,EAAU,KAAK,CAAE,GAAIM,EAAM,GAAI,KAAMA,EAAM,KAAM,UAAWA,EAAM,SAAU,CAAC,EAC7E,MACF,IAAK,OACH,MAAO,CAAE,KAAAP,EAAM,UAAAC,CAAU,EAC3B,IAAK,QACH,MAAMM,EAAM,KAChB,CAGF,MAAO,CAAE,KAAAP,EAAM,UAAAC,CAAU,CAC3B,CAEA,MAAc,gBAAgBC,EAA8C,CAC1E,MAAMT,EAAO,KAAK,aAAa,IAAIS,EAAK,IAAI,EAE5C,IAAIM,EACJ,GAAI,CACFA,EAAO,KAAK,MAAMN,EAAK,SAAS,CAClC,MAAQ,CACNM,EAAON,EAAK,SACd,CAEA,GAAI,CAACT,EACH,MAAO,CACL,GAAIS,EAAK,GACT,KAAMA,EAAK,KACX,UAAWM,EACX,OAAQ,CAAE,MAAO,iBAAiBN,EAAK,IAAI,GAAI,CACjD,EAGF,GAAI,CACF,MAAMO,EAAS,MAAMhB,EAAK,QAAQe,CAAa,EAC/C,MAAO,CAAE,GAAIN,EAAK,GAAI,KAAMA,EAAK,KAAM,UAAWM,EAAM,OAAAC,CAAO,CACjE,OAASC,EAAO,CACd,MAAO,CACL,GAAIR,EAAK,GACT,KAAMA,EAAK,KACX,UAAWM,EACX,OAAQ,CAAE,MAAOE,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAAE,CAC1E,CACF,CACF,CACF",
6
- "names": ["Agent", "__name", "options", "name", "tool", "request", "messages", "definitions", "executed", "maxIterations", "iteration", "text", "toolCalls", "call", "executedCall", "llm", "temperature", "maxTokens", "event", "args", "result", "error"]
4
+ "sourcesContent": ["import { Tool } from \"./tools/tools\";\nimport type {\n LLM,\n LLMMessage,\n LLMToolCall,\n LLMToolDefinition,\n} from \"../providers/llm/types\";\n\nexport interface AgentOptions {\n name: string;\n /** Names a participant might use to address this agent. */\n aliases?: string[];\n context?: string;\n tools?: Tool<never, unknown>[];\n /** LLM provider used by `run()`. Injected by `Pipeflow.agent()`. */\n llm?: LLM;\n}\n\nexport interface AgentRunRequest {\n prompt: string;\n /** Prior messages to continue from, e.g. a previous `run()` result. */\n history?: LLMMessage[];\n temperature?: number;\n maxTokens?: number;\n /** Safety bound on the number of tool-call round trips. */\n maxToolIterations?: number;\n}\n\nexport interface ExecutedToolCall {\n id: string;\n name: string;\n /** Parsed arguments, or the raw JSON string if parsing failed. */\n arguments: unknown;\n /** The tool result, or `{ error }` when the tool failed or is unknown. */\n result: unknown;\n}\n\nexport interface AgentRunResult {\n /** The assistant's final text response. */\n text: string;\n /** The full message history including the response and tool results. */\n messages: LLMMessage[];\n /** Every tool call executed during the run, in order. */\n toolCalls: ExecutedToolCall[];\n}\n\n/**\n * An AI persona: a name, a system context, and a set of tools.\n *\n * An agent can participate in conversations or be invoked independently\n * with `run()`.\n */\nexport class Agent {\n readonly name: string;\n readonly aliases: string[];\n readonly context: string;\n private readonly toolRegistry = new Map<string, Tool<never, unknown>>();\n /** LLM provider used by `run()` and the orchestrator. */\n readonly llm: LLM | undefined;\n\n constructor(options: AgentOptions) {\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Agent requires a non-empty name\");\n }\n this.name = name;\n this.aliases = [...(options.aliases ?? [])];\n this.context = options.context?.trim() ?? \"\";\n this.llm = options.llm;\n for (const tool of options.tools ?? []) {\n this.addTool(tool);\n }\n }\n\n get tools(): Tool<never, unknown>[] {\n return [...this.toolRegistry.values()];\n }\n\n addTool(tool: Tool<never, unknown>): void {\n if (this.toolRegistry.has(tool.name)) {\n throw new Error(`Agent already has a tool named \"${tool.name}\"`);\n }\n this.toolRegistry.set(tool.name, tool);\n }\n\n hasTool(name: string): boolean {\n return this.toolRegistry.has(name);\n }\n\n getTool(name: string): Tool<never, unknown> | undefined {\n return this.toolRegistry.get(name);\n }\n\n /**\n * Run the agent against the LLM, executing any requested tools and\n * feeding their results back until the model responds without a tool\n * call.\n */\n async run(request: AgentRunRequest): Promise<AgentRunResult> {\n if (!this.llm) {\n throw new Error(\n `Agent \"${this.name}\" has no LLM provider configured. ` +\n \"Pass an LLM when constructing the agent or the Pipeflow instance.\",\n );\n }\n\n const messages: LLMMessage[] = [];\n if (this.context) {\n messages.push({ role: \"system\", content: this.context });\n }\n if (request.history) {\n messages.push(...request.history);\n }\n messages.push({ role: \"user\", content: request.prompt });\n\n const definitions: LLMToolDefinition[] = this.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters ?? { type: \"object\", properties: {} },\n }));\n\n const executed: ExecutedToolCall[] = [];\n const maxIterations = request.maxToolIterations ?? 10;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n const { text, toolCalls } = await this.streamOnce({\n llm: this.llm,\n messages,\n definitions,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n });\n\n if (toolCalls.length === 0) {\n return { text, messages, toolCalls: executed };\n }\n\n messages.push({ role: \"assistant\", content: text, toolCalls });\n // Execute the batch concurrently: the model issued these calls\n // together, so they are independent. Results keep call order.\n const executedBatch = await Promise.all(\n toolCalls.map((call) => this.executeToolCall(call)),\n );\n for (const executedCall of executedBatch) {\n executed.push(executedCall);\n messages.push({\n role: \"tool\",\n toolCallId: executedCall.id,\n name: executedCall.name,\n content: JSON.stringify(executedCall.result),\n });\n }\n }\n\n throw new Error(\n `Agent \"${this.name}\" exceeded ${maxIterations} tool iterations`,\n );\n }\n\n private async streamOnce(options: {\n llm: LLM;\n messages: LLMMessage[];\n definitions: LLMToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; toolCalls: LLMToolCall[] }> {\n const { llm, messages, definitions, temperature, maxTokens } = options;\n let text = \"\";\n const toolCalls: LLMToolCall[] = [];\n\n for await (const event of llm.stream({\n messages,\n tools: definitions,\n temperature,\n maxTokens,\n })) {\n switch (event.type) {\n case \"delta\":\n text += event.content;\n break;\n case \"tool_call\":\n toolCalls.push({ id: event.id, name: event.name, arguments: event.arguments });\n break;\n case \"done\":\n return { text, toolCalls };\n case \"error\":\n throw event.error;\n }\n }\n\n return { text, toolCalls };\n }\n\n private async executeToolCall(call: LLMToolCall): Promise<ExecutedToolCall> {\n const tool = this.toolRegistry.get(call.name);\n\n let args: unknown;\n try {\n args = JSON.parse(call.arguments);\n } catch {\n args = call.arguments;\n }\n\n if (!tool) {\n return {\n id: call.id,\n name: call.name,\n arguments: args,\n result: { error: `Unknown tool \"${call.name}\"` },\n };\n }\n\n try {\n const result = await tool.execute(args as never);\n return { id: call.id, name: call.name, arguments: args, result };\n } catch (error) {\n return {\n id: call.id,\n name: call.name,\n arguments: args,\n result: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Agent", "__name", "options", "name", "tool", "request", "messages", "definitions", "executed", "maxIterations", "iteration", "text", "toolCalls", "executedBatch", "call", "executedCall", "llm", "temperature", "maxTokens", "event", "args", "result", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var o=Object.defineProperty;var s=(r,e)=>o(r,"name",{value:e,configurable:!0});class a{static{s(this,"Tool")}name;description;parameters;executor;constructor(e){const t=e.name.trim();if(!t)throw new Error("Tool requires a non-empty name");const n=e.description.trim();if(!n)throw new Error("Tool requires a non-empty description");this.name=t,this.description=n,this.parameters=e.parameters,this.executor=e.execute}async execute(e){return this.executor(e)}}export{a as Tool};
1
+ var d=Object.defineProperty;var i=(s,e)=>d(s,"name",{value:e,configurable:!0});import{z as h}from"zod";class p{static{i(this,"Tool")}name;description;parameters;parse;executor;constructor(e){const n=e.name.trim();if(!n)throw new Error("Tool requires a non-empty name");const a=e.description.trim();if(!a)throw new Error("Tool requires a non-empty description");if(e.schema!==void 0&&e.parameters!==void 0)throw new Error(`${n}: pass either schema or parameters, not both \u2014 schema derives the LLM schema`);if(this.name=n,this.description=a,e.schema!==void 0){const o=h.toJSONSchema(e.schema.in);delete o.$schema,this.parameters=o;const u=e.schema.out??e.schema.in;this.parse=c=>{const t=u.safeParse(c);if(!t.success){const m=t.error.issues.map(r=>r.path.length>0?`${r.path.join(".")}: ${r.message}`:r.message).join("; ");throw new Error(`${n}: invalid arguments: ${m}`)}return t.data}}else this.parameters=e.parameters,this.parse=void 0;this.executor=e.execute}async execute(e){const n=this.parse!==void 0?this.parse(e):e;return this.executor(n)}}export{p as Tool};
2
2
  //# sourceMappingURL=tools.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/agents/tools/tools.ts"],
4
- "sourcesContent": ["export interface ToolOptions<TArgs, TResult> {\n name: string;\n description: string;\n /** JSON schema describing the arguments for the LLM. */\n parameters?: Record<string, unknown>;\n execute: (args: TArgs) => TResult | Promise<TResult>;\n}\n\n/**\n * A capability exposed by the application to an agent.\n *\n * Tools execute in the application's backend: Pipeflow never runs\n * application code directly.\n */\nexport class Tool<TArgs = Record<string, unknown>, TResult = unknown> {\n readonly name: string;\n readonly description: string;\n readonly parameters: Record<string, unknown> | undefined;\n private readonly executor: (args: TArgs) => TResult | Promise<TResult>;\n\n constructor(options: ToolOptions<TArgs, TResult>) {\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Tool requires a non-empty name\");\n }\n const description = options.description.trim();\n if (!description) {\n throw new Error(\"Tool requires a non-empty description\");\n }\n this.name = name;\n this.description = description;\n this.parameters = options.parameters;\n this.executor = options.execute;\n }\n\n /** Execute the tool. Sync throws and rejections both surface as rejections. */\n async execute(args: TArgs): Promise<TResult> {\n return this.executor(args);\n }\n}\n"],
5
- "mappings": "+EAcO,MAAMA,CAAyD,CAdtE,MAcsE,CAAAC,EAAA,aAC3D,KACA,YACA,WACQ,SAEjB,YAAYC,EAAsC,CAChD,MAAMC,EAAOD,EAAQ,KAAK,KAAK,EAC/B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gCAAgC,EAElD,MAAMC,EAAcF,EAAQ,YAAY,KAAK,EAC7C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,KAAK,KAAOD,EACZ,KAAK,YAAcC,EACnB,KAAK,WAAaF,EAAQ,WAC1B,KAAK,SAAWA,EAAQ,OAC1B,CAGA,MAAM,QAAQG,EAA+B,CAC3C,OAAO,KAAK,SAASA,CAAI,CAC3B,CACF",
6
- "names": ["Tool", "__name", "options", "name", "description", "args"]
4
+ "sourcesContent": ["import { z } from \"zod\";\n\n/**\n * Zod schemas for a tool's arguments. `in` shapes what the model sends (and\n * derives the LLM-facing JSON schema); `out` is what `execute` receives after\n * validation. Keeping them separate means `in` stays plain JSON-schema-able\n * while `out` may transform, normalize, or narrow.\n */\nexport interface ToolSchema<TOut, TIn> {\n /** What the model sends \u2014 derives the LLM-facing JSON schema. */\n in: z.ZodType<TIn>;\n /** What `execute` receives, validated at run time. Defaults to `in`. */\n out?: z.ZodType<TOut>;\n}\n\nexport interface ToolOptions<TOut, TResult, TIn> {\n name: string;\n description: string;\n /**\n * Zod schemas for the tool arguments \u2014 the single source of truth: `in`\n * derives the LLM-facing JSON schema (`parameters`), and `out` (defaulting\n * to `in`) validates the arguments at `execute()` time, so a model sending\n * garbage surfaces a clear tool error instead of a crash inside the tool.\n * Mutually exclusive with `parameters`.\n */\n schema?: ToolSchema<TOut, TIn>;\n /** JSON schema describing the arguments for the LLM (no runtime validation). */\n parameters?: Record<string, unknown>;\n execute: (args: TOut) => TResult | Promise<TResult>;\n}\n\n/**\n * A capability exposed by the application to an agent.\n *\n * Tools execute in the application's backend: Pipeflow never runs\n * application code directly.\n */\nexport class Tool<TOut = Record<string, unknown>, TResult = unknown, TIn = TOut> {\n readonly name: string;\n readonly description: string;\n readonly parameters: Record<string, unknown> | undefined;\n // Widened to a generic-free parse function: holding `z.ZodType<...>` typed\n // against the class generics directly would make Tool invariant in its type\n // parameters and break the `Tool<{ city }, string>` \u2192 `Tool<never, unknown>`\n // assignability agents rely on.\n private readonly parse: ((args: unknown) => unknown) | undefined;\n private readonly executor: (args: TOut) => TResult | Promise<TResult>;\n\n constructor(options: ToolOptions<TOut, TResult, TIn>) {\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Tool requires a non-empty name\");\n }\n const description = options.description.trim();\n if (!description) {\n throw new Error(\"Tool requires a non-empty description\");\n }\n if (options.schema !== undefined && options.parameters !== undefined) {\n throw new Error(\n `${name}: pass either schema or parameters, not both \u2014 schema derives the LLM schema`,\n );\n }\n this.name = name;\n this.description = description;\n if (options.schema !== undefined) {\n // Single source of truth: the LLM sees exactly what execute validates.\n // `in` is always plain (transforms live on `out`), so this never throws.\n const jsonSchema = z.toJSONSchema(options.schema.in) as Record<string, unknown>;\n delete jsonSchema.$schema;\n this.parameters = jsonSchema;\n const schema = options.schema.out ?? options.schema.in;\n this.parse = (args: unknown): unknown => {\n const result = schema.safeParse(args as TIn);\n if (!result.success) {\n const details = result.error.issues\n .map((issue) =>\n issue.path.length > 0\n ? `${issue.path.join(\".\")}: ${issue.message}`\n : issue.message,\n )\n .join(\"; \");\n throw new Error(`${name}: invalid arguments: ${details}`);\n }\n return result.data;\n };\n } else {\n this.parameters = options.parameters;\n this.parse = undefined;\n }\n this.executor = options.execute;\n }\n\n /** Execute the tool. Sync throws and rejections both surface as rejections. */\n async execute(args: TIn): Promise<TResult> {\n const parsed = this.parse !== undefined ? this.parse(args) : args;\n return this.executor(parsed as TOut);\n }\n}\n"],
5
+ "mappings": "+EAAA,OAAS,KAAAA,MAAS,MAqCX,MAAMC,CAAoE,CArCjF,MAqCiF,CAAAC,EAAA,aACtE,KACA,YACA,WAKQ,MACA,SAEjB,YAAYC,EAA0C,CACpD,MAAMC,EAAOD,EAAQ,KAAK,KAAK,EAC/B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gCAAgC,EAElD,MAAMC,EAAcF,EAAQ,YAAY,KAAK,EAC7C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,GAAIF,EAAQ,SAAW,QAAaA,EAAQ,aAAe,OACzD,MAAM,IAAI,MACR,GAAGC,CAAI,mFACT,EAIF,GAFA,KAAK,KAAOA,EACZ,KAAK,YAAcC,EACfF,EAAQ,SAAW,OAAW,CAGhC,MAAMG,EAAaN,EAAE,aAAaG,EAAQ,OAAO,EAAE,EACnD,OAAOG,EAAW,QAClB,KAAK,WAAaA,EAClB,MAAMC,EAASJ,EAAQ,OAAO,KAAOA,EAAQ,OAAO,GACpD,KAAK,MAASK,GAA2B,CACvC,MAAMC,EAASF,EAAO,UAAUC,CAAW,EAC3C,GAAI,CAACC,EAAO,QAAS,CACnB,MAAMC,EAAUD,EAAO,MAAM,OAC1B,IAAKE,GACJA,EAAM,KAAK,OAAS,EAChB,GAAGA,EAAM,KAAK,KAAK,GAAG,CAAC,KAAKA,EAAM,OAAO,GACzCA,EAAM,OACZ,EACC,KAAK,IAAI,EACZ,MAAM,IAAI,MAAM,GAAGP,CAAI,wBAAwBM,CAAO,EAAE,CAC1D,CACA,OAAOD,EAAO,IAChB,CACF,MACE,KAAK,WAAaN,EAAQ,WAC1B,KAAK,MAAQ,OAEf,KAAK,SAAWA,EAAQ,OAC1B,CAGA,MAAM,QAAQK,EAA6B,CACzC,MAAMI,EAAS,KAAK,QAAU,OAAY,KAAK,MAAMJ,CAAI,EAAIA,EAC7D,OAAO,KAAK,SAASI,CAAc,CACrC,CACF",
6
+ "names": ["z", "Tool", "__name", "options", "name", "description", "jsonSchema", "schema", "args", "result", "details", "issue", "parsed"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ var l=Object.defineProperty;var c=(a,e)=>l(a,"name",{value:e,configurable:!0});class p{static{c(this,"PipeflowClient")}protocol;audio;reconnect;defaultUserId;listeners=new Map;mediaStream=null;mediaRecorder=null;startMicPromise=null;reconnectAttempts=0;reconnectTimer=null;closedByUser=!1;nextSequence=0;constructor(e){this.protocol=e.protocol,this.audio=e.audio??{},this.reconnect={maxAttempts:e.reconnect?.maxAttempts??0,initialBackoffMs:e.reconnect?.initialBackoffMs??500,maxBackoffMs:e.reconnect?.maxBackoffMs??1e4},this.defaultUserId=e.userId??"anonymous",this.protocol.onMessage(t=>this.handleMessage(t)),this.protocol.onStatus(t=>this.handleStatus(t))}async connect(){this.closedByUser=!1,await this.protocol.connect(),this.audio.input&&await this.startMic()}async disconnect(){this.closedByUser=!0,this.clearReconnect(),this.stopMic(),await this.protocol.close()}sendText(e,t={}){this.send({type:"text-in",payload:{userId:t.userId??this.defaultUserId,text:e}})}sendAudio(e,t={}){this.send({type:"audio-in",payload:{userId:t.userId??this.defaultUserId,audio:e,sequence:e.sequence??this.nextSequence++}})}interrupt(e={}){this.send({type:"interrupt",payload:{conversationId:e.conversationId??null}})}resolveToolCall(e,t={}){this.send({type:"tool-result",payload:{conversationId:t.conversationId??null,result:e}})}playAudio(e){}on(e,t){let r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.add(t),()=>{r.delete(t)}}off(e,t){this.listeners.get(e)?.delete(t)}send(e){try{this.protocol.send(e)}catch(t){this.emit("error",{error:t instanceof Error?t:new Error(String(t))})}}handleMessage(e){switch(e.type){case"start":case"stop":case"interrupt":case"turn":case"transcript":case"partial-transcript":case"audio":case"audio-in":case"generation":case"tool-call":case"tool-call-result":case"state":{this.emit(e.type,e.payload);return}case"error":{const t=e.payload;this.emit("error",{conversationId:t?.conversationId,error:new Error(t?.message??"Server error")});return}default:return}}handleStatus(e){if(e==="open"){this.reconnectAttempts=0;return}e==="closed"&&!this.closedByUser&&this.scheduleReconnect()}scheduleReconnect(){if(this.reconnect.maxAttempts<=0)return;if(this.reconnectAttempts>=this.reconnect.maxAttempts){this.emit("error",{error:new Error("PipeflowClient: reconnect attempts exhausted")});return}const e=this.reconnectAttempts++,t=Math.min(this.reconnect.initialBackoffMs*2**e,this.reconnect.maxBackoffMs);this.reconnectTimer=setTimeout(()=>{this.protocol.connect().catch(r=>{this.emit("error",{error:r instanceof Error?r:new Error(String(r))}),this.scheduleReconnect()})},t)}clearReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.reconnectAttempts=0}startMic(){return this.mediaStream?Promise.resolve():(this.startMicPromise??=this.openMic().finally(()=>{this.startMicPromise=null}),this.startMicPromise)}async openMic(){const e=globalThis;if(!e.navigator?.mediaDevices?.getUserMedia||this.mediaStream)return;const t=e.MediaRecorder;if(t)try{const r={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,...this.audio.constraints};this.mediaStream=await e.navigator.mediaDevices.getUserMedia({audio:r}),this.mediaRecorder=new t(this.mediaStream),this.mediaRecorder.addEventListener("dataavailable",o=>{o.data.size!==0&&o.data.arrayBuffer().then(async d=>{const n={data:new Uint8Array(d),timestamp:Date.now(),sequence:this.nextSequence++};let i;try{i=this.audio.transform?await this.audio.transform(n):n}catch(s){this.emit("error",{error:s instanceof Error?s:new Error(String(s))});return}i&&this.sendAudio({...i,sequence:i.sequence??n.sequence})})}),this.mediaRecorder.start(250)}catch(r){this.emit("error",{error:r instanceof Error?r:new Error(String(r))})}}stopMic(){if(this.mediaRecorder&&this.mediaRecorder.state!=="inactive")try{this.mediaRecorder.stop()}catch{}if(this.mediaRecorder=null,this.mediaStream){for(const e of this.mediaStream.getTracks())e.stop();this.mediaStream=null}}emit(e,t){const r=this.listeners.get(e);if(r)for(const o of[...r])try{o(t)}catch{}}}export{p as PipeflowClient};
2
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/client/client.ts"],
4
+ "sourcesContent": ["/**\n * Pipeflow client SDK: talk to a Pipeflow server from a browser or Node.\n */\nimport type {\n AudioChunk,\n ConversationId,\n Generation,\n ToolCall,\n ToolCallResult,\n Turn,\n UserId,\n} from \"../conversations/types\";\nimport type { TranscriptEntry } from \"../conversations/transcription/transcription\";\nimport type {\n Protocol,\n ProtocolMessage,\n ProtocolStatus,\n} from \"./protocol\";\n\n/** Track constraints used when opening the mic. */\nexport interface CaptureConstraints {\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n}\n\n/** Optional mic auto-attach on `connect()`. */\nexport interface AudioInputOptions {\n /** Auto-attach `getUserMedia` and stream mic audio into the connection. */\n input?: boolean;\n /**\n * Gate or rewrite captured audio before it hits the wire: return a chunk\n * to send it, or `null` to drop it (a VAD gate). May be async. Chunks are\n * sent as the hook resolves and their `sequence` marks capture order, so\n * the server can reorder them before STT. Applies only to captured\n * audio; manual `sendAudio()` calls go out untouched.\n */\n transform?: (chunk: AudioChunk) => AudioChunk | null | Promise<AudioChunk | null>;\n /**\n * Mic track constraints. Each defaults to `true`. Echo cancellation is the\n * one that matters: without it the mic re-captures the agent's own reply.\n */\n constraints?: CaptureConstraints;\n}\n\nexport interface ReconnectOptions {\n /** Maximum reconnect attempts after an unexpected close. `0` disables it. */\n maxAttempts?: number;\n /** Initial backoff in ms; doubled each attempt up to `maxBackoffMs`. */\n initialBackoffMs?: number;\n /** Backoff cap in ms. */\n maxBackoffMs?: number;\n}\n\nexport interface PipeflowClientOptions {\n /** The wire protocol. */\n protocol: Protocol;\n /** Audio capture options. */\n audio?: AudioInputOptions;\n /** Auto-reconnect on unexpected close. */\n reconnect?: ReconnectOptions;\n /** Default user id for `sendText()` / `sendAudio()` when not provided. */\n userId?: UserId;\n}\n\n/**\n * Payloads emitted by `PipeflowClient` events, mirroring `ConversationEvents`\n * for the events that travel the wire.\n */\nexport interface PipeflowClientEventMap {\n start: { conversationId: ConversationId };\n stop: { conversationId: ConversationId };\n \"audio-in\": { conversationId: ConversationId; userId: UserId; audio: AudioChunk };\n audio: { conversationId: ConversationId; audio: AudioChunk };\n \"partial-transcript\": { conversationId: ConversationId; userId: UserId; text: string };\n turn: { conversationId: ConversationId; turn: Turn };\n transcript: { conversationId: ConversationId; entry: TranscriptEntry };\n generation: { conversationId: ConversationId; generation: Generation };\n \"tool-call\": { conversationId: ConversationId; call: ToolCall };\n \"tool-call-result\": { conversationId: ConversationId; result: ToolCallResult };\n interrupt: { conversationId: ConversationId };\n error: { conversationId?: ConversationId; error: Error };\n state: { conversationId: ConversationId; state: unknown };\n}\n\nexport type PipeflowClientEvent = keyof PipeflowClientEventMap;\n\nexport type Listener<E extends PipeflowClientEvent> = (\n event: PipeflowClientEventMap[E],\n) => void;\n\n/** The minimal browser surface mic capture needs; missing globals make it a no-op in Node. */\ninterface MicCapture {\n getUserMedia?: (constraints: {\n audio: boolean | CaptureConstraints;\n }) => Promise<MediaStreamLike>;\n}\ninterface MediaStreamLike {\n getTracks(): Array<{ stop(): void }>;\n}\ninterface MediaRecorderLike {\n state: string;\n start(timeslice: number): void;\n stop(): void;\n addEventListener(type: \"dataavailable\", listener: (event: { data: { size: number; arrayBuffer(): Promise<ArrayBuffer> } }) => void): void;\n}\ninterface BrowserGlobals {\n navigator?: { mediaDevices?: MicCapture };\n MediaRecorder?: new (stream: MediaStreamLike) => MediaRecorderLike;\n}\n\n/**\n * Typed client for a Pipeflow server: `connect()`, then events flow while\n * you send text and audio, then `disconnect()`.\n *\n * ```ts\n * const client = new PipeflowClient({\n * protocol: new WebSocketProtocol({ url: \"wss://\u2026/conversations/abc\" }),\n * audio: { input: true },\n * });\n * client.on(\"turn\", (e) => console.log(e.turn.text));\n * await client.connect();\n * ```\n *\n * Mic capture is opt-in via `audio.input`. Playback is the caller's job:\n * wire the `audio` event into your own `AudioContext` or `<audio>` queue,\n * or override `playAudio()`.\n */\nexport class PipeflowClient {\n private readonly protocol: Protocol;\n private readonly audio: AudioInputOptions;\n private readonly reconnect: Required<ReconnectOptions>;\n private readonly defaultUserId: UserId;\n\n private readonly listeners = new Map<PipeflowClientEvent, Set<Listener<PipeflowClientEvent>>>();\n private mediaStream: MediaStreamLike | null = null;\n private mediaRecorder: MediaRecorderLike | null = null;\n private startMicPromise: Promise<void> | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private closedByUser = false;\n private nextSequence = 0;\n\n constructor(options: PipeflowClientOptions) {\n this.protocol = options.protocol;\n this.audio = options.audio ?? {};\n this.reconnect = {\n maxAttempts: options.reconnect?.maxAttempts ?? 0,\n initialBackoffMs: options.reconnect?.initialBackoffMs ?? 500,\n maxBackoffMs: options.reconnect?.maxBackoffMs ?? 10_000,\n };\n this.defaultUserId = options.userId ?? \"anonymous\";\n\n this.protocol.onMessage((m) => this.handleMessage(m));\n this.protocol.onStatus((s) => this.handleStatus(s));\n }\n\n // ---------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------\n\n /**\n * Open the connection and, if `audio.input` is set, attach the mic.\n * Subsequent calls are no-ops while the connection is open.\n */\n async connect(): Promise<void> {\n this.closedByUser = false;\n await this.protocol.connect();\n if (this.audio.input) await this.startMic();\n }\n\n /** Close the connection, release the mic, and disable reconnect. */\n async disconnect(): Promise<void> {\n this.closedByUser = true;\n this.clearReconnect();\n this.stopMic();\n await this.protocol.close();\n }\n\n // ---------------------------------------------------------------------\n // Outbound: text + audio + tool resolution\n // ---------------------------------------------------------------------\n\n /**\n * Send a finalized text turn. Equivalent to `conversation.send({ userId, text })`.\n */\n sendText(text: string, options: { userId?: UserId } = {}): void {\n this.send({\n type: \"text-in\",\n payload: {\n userId: options.userId ?? this.defaultUserId,\n text,\n },\n });\n }\n\n /**\n * Send a raw audio chunk. `listen()` on the server is synchronous; call\n * this for every chunk as it arrives. The chunk's `sequence` marks\n * capture order for the server's reorder buffer.\n */\n sendAudio(audio: AudioChunk, options: { userId?: UserId } = {}): void {\n this.send({\n type: \"audio-in\",\n payload: {\n userId: options.userId ?? this.defaultUserId,\n audio,\n sequence: audio.sequence ?? this.nextSequence++,\n },\n });\n }\n\n /** Request an interrupt on the server. */\n interrupt(options: { conversationId?: ConversationId } = {}): void {\n this.send({\n type: \"interrupt\",\n payload: { conversationId: options.conversationId ?? null },\n });\n }\n\n /** Resolve a tool call when `autoExecuteTools` is off on the server. */\n resolveToolCall(\n result: ToolCallResult,\n options: { conversationId?: ConversationId } = {},\n ): void {\n this.send({\n type: \"tool-result\",\n payload: {\n conversationId: options.conversationId ?? null,\n result,\n },\n });\n }\n\n /**\n * No-op playback hook. Override it, or listen to `audio` directly.\n */\n playAudio(_audio: AudioChunk): void {}\n\n // ---------------------------------------------------------------------\n // Event subscription\n // ---------------------------------------------------------------------\n\n /** Subscribe to an event. Returns an unsubscribe function. */\n on<E extends PipeflowClientEvent>(event: E, listener: Listener<E>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener as Listener<PipeflowClientEvent>);\n return () => {\n set!.delete(listener as Listener<PipeflowClientEvent>);\n };\n }\n\n /** Remove a previously added listener. */\n off<E extends PipeflowClientEvent>(event: E, listener: Listener<E>): void {\n this.listeners.get(event)?.delete(listener as Listener<PipeflowClientEvent>);\n }\n\n // ---------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------\n\n private send(message: ProtocolMessage): void {\n try {\n this.protocol.send(message);\n } catch (err) {\n this.emit(\"error\", {\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n }\n\n private handleMessage(message: ProtocolMessage): void {\n switch (message.type) {\n case \"start\":\n case \"stop\":\n case \"interrupt\":\n case \"turn\":\n case \"transcript\":\n case \"partial-transcript\":\n case \"audio\":\n case \"audio-in\":\n case \"generation\":\n case \"tool-call\":\n case \"tool-call-result\":\n case \"state\": {\n this.emit(message.type, message.payload as never);\n return;\n }\n case \"error\": {\n const payload = message.payload as { message?: string; conversationId?: ConversationId };\n this.emit(\"error\", {\n conversationId: payload?.conversationId,\n error: new Error(payload?.message ?? \"Server error\"),\n });\n return;\n }\n default:\n // Unknown message types are ignored to stay forward-compatible.\n return;\n }\n }\n\n private handleStatus(status: ProtocolStatus): void {\n if (status === \"open\") {\n this.reconnectAttempts = 0;\n return;\n }\n if (status === \"closed\" && !this.closedByUser) {\n this.scheduleReconnect();\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnect.maxAttempts <= 0) return;\n if (this.reconnectAttempts >= this.reconnect.maxAttempts) {\n this.emit(\"error\", {\n error: new Error(\"PipeflowClient: reconnect attempts exhausted\"),\n });\n return;\n }\n const attempt = this.reconnectAttempts++;\n const delay = Math.min(\n this.reconnect.initialBackoffMs * 2 ** attempt,\n this.reconnect.maxBackoffMs,\n );\n this.reconnectTimer = setTimeout(() => {\n this.protocol\n .connect()\n .catch((err: unknown) => {\n this.emit(\"error\", {\n error: err instanceof Error ? err : new Error(String(err)),\n });\n this.scheduleReconnect();\n });\n }, delay);\n }\n\n private clearReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.reconnectAttempts = 0;\n }\n\n /** Attach the mic once, even under concurrent `connect()` calls. */\n private startMic(): Promise<void> {\n if (this.mediaStream) return Promise.resolve();\n this.startMicPromise ??= this.openMic().finally(() => {\n this.startMicPromise = null;\n });\n return this.startMicPromise;\n }\n\n private async openMic(): Promise<void> {\n const globals = globalThis as unknown as BrowserGlobals;\n if (!globals.navigator?.mediaDevices?.getUserMedia) return;\n if (this.mediaStream) return;\n const Recorder = globals.MediaRecorder;\n if (!Recorder) return;\n try {\n const constraints: CaptureConstraints = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n ...this.audio.constraints,\n };\n this.mediaStream = await globals.navigator.mediaDevices.getUserMedia({\n audio: constraints,\n });\n this.mediaRecorder = new Recorder(this.mediaStream);\n this.mediaRecorder.addEventListener(\"dataavailable\", (event) => {\n if (event.data.size === 0) return;\n event.data.arrayBuffer().then(async (buffer) => {\n // Assigned before the transform: the sequence marks capture\n // order even when async hooks resolve out of order.\n const chunk: AudioChunk = {\n data: new Uint8Array(buffer),\n timestamp: Date.now(),\n sequence: this.nextSequence++,\n };\n let out: AudioChunk | null;\n try {\n out = this.audio.transform ? await this.audio.transform(chunk) : chunk;\n } catch (err) {\n this.emit(\"error\", {\n error: err instanceof Error ? err : new Error(String(err)),\n });\n return;\n }\n if (!out) return; // gated, e.g. by a VAD\n this.sendAudio({ ...out, sequence: out.sequence ?? chunk.sequence });\n });\n });\n this.mediaRecorder.start(250);\n } catch (err) {\n this.emit(\"error\", {\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n }\n\n private stopMic(): void {\n if (this.mediaRecorder && this.mediaRecorder.state !== \"inactive\") {\n try {\n this.mediaRecorder.stop();\n } catch {\n // ignore\n }\n }\n this.mediaRecorder = null;\n if (this.mediaStream) {\n for (const track of this.mediaStream.getTracks()) track.stop();\n this.mediaStream = null;\n }\n }\n\n private emit<E extends PipeflowClientEvent>(\n event: E,\n payload: PipeflowClientEventMap[E],\n ): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const listener of [...set]) {\n try {\n (listener as Listener<E>)(payload);\n } catch {\n // A faulty listener must not prevent delivery to others.\n }\n }\n }\n}"],
5
+ "mappings": "+EAgIO,MAAMA,CAAe,CAhI5B,MAgI4B,CAAAC,EAAA,uBACT,SACA,MACA,UACA,cAEA,UAAY,IAAI,IACzB,YAAsC,KACtC,cAA0C,KAC1C,gBAAwC,KACxC,kBAAoB,EACpB,eAAuD,KACvD,aAAe,GACf,aAAe,EAEvB,YAAYC,EAAgC,CAC1C,KAAK,SAAWA,EAAQ,SACxB,KAAK,MAAQA,EAAQ,OAAS,CAAC,EAC/B,KAAK,UAAY,CACf,YAAaA,EAAQ,WAAW,aAAe,EAC/C,iBAAkBA,EAAQ,WAAW,kBAAoB,IACzD,aAAcA,EAAQ,WAAW,cAAgB,GACnD,EACA,KAAK,cAAgBA,EAAQ,QAAU,YAEvC,KAAK,SAAS,UAAWC,GAAM,KAAK,cAAcA,CAAC,CAAC,EACpD,KAAK,SAAS,SAAUC,GAAM,KAAK,aAAaA,CAAC,CAAC,CACpD,CAUA,MAAM,SAAyB,CAC7B,KAAK,aAAe,GACpB,MAAM,KAAK,SAAS,QAAQ,EACxB,KAAK,MAAM,OAAO,MAAM,KAAK,SAAS,CAC5C,CAGA,MAAM,YAA4B,CAChC,KAAK,aAAe,GACpB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,MAAM,KAAK,SAAS,MAAM,CAC5B,CASA,SAASC,EAAcH,EAA+B,CAAC,EAAS,CAC9D,KAAK,KAAK,CACR,KAAM,UACN,QAAS,CACP,OAAQA,EAAQ,QAAU,KAAK,cAC/B,KAAAG,CACF,CACF,CAAC,CACH,CAOA,UAAUC,EAAmBJ,EAA+B,CAAC,EAAS,CACpE,KAAK,KAAK,CACR,KAAM,WACN,QAAS,CACP,OAAQA,EAAQ,QAAU,KAAK,cAC/B,MAAAI,EACA,SAAUA,EAAM,UAAY,KAAK,cACnC,CACF,CAAC,CACH,CAGA,UAAUJ,EAA+C,CAAC,EAAS,CACjE,KAAK,KAAK,CACR,KAAM,YACN,QAAS,CAAE,eAAgBA,EAAQ,gBAAkB,IAAK,CAC5D,CAAC,CACH,CAGA,gBACEK,EACAL,EAA+C,CAAC,EAC1C,CACN,KAAK,KAAK,CACR,KAAM,cACN,QAAS,CACP,eAAgBA,EAAQ,gBAAkB,KAC1C,OAAAK,CACF,CACF,CAAC,CACH,CAKA,UAAUC,EAA0B,CAAC,CAOrC,GAAkCC,EAAUC,EAAmC,CAC7E,IAAIC,EAAM,KAAK,UAAU,IAAIF,CAAK,EAClC,OAAKE,IACHA,EAAM,IAAI,IACV,KAAK,UAAU,IAAIF,EAAOE,CAAG,GAE/BA,EAAI,IAAID,CAAyC,EAC1C,IAAM,CACXC,EAAK,OAAOD,CAAyC,CACvD,CACF,CAGA,IAAmCD,EAAUC,EAA6B,CACxE,KAAK,UAAU,IAAID,CAAK,GAAG,OAAOC,CAAyC,CAC7E,CAMQ,KAAKE,EAAgC,CAC3C,GAAI,CACF,KAAK,SAAS,KAAKA,CAAO,CAC5B,OAASC,EAAK,CACZ,KAAK,KAAK,QAAS,CACjB,MAAOA,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAC3D,CAAC,CACH,CACF,CAEQ,cAAcD,EAAgC,CACpD,OAAQA,EAAQ,KAAM,CACpB,IAAK,QACL,IAAK,OACL,IAAK,YACL,IAAK,OACL,IAAK,aACL,IAAK,qBACL,IAAK,QACL,IAAK,WACL,IAAK,aACL,IAAK,YACL,IAAK,mBACL,IAAK,QAAS,CACZ,KAAK,KAAKA,EAAQ,KAAMA,EAAQ,OAAgB,EAChD,MACF,CACA,IAAK,QAAS,CACZ,MAAME,EAAUF,EAAQ,QACxB,KAAK,KAAK,QAAS,CACjB,eAAgBE,GAAS,eACzB,MAAO,IAAI,MAAMA,GAAS,SAAW,cAAc,CACrD,CAAC,EACD,MACF,CACA,QAEE,MACJ,CACF,CAEQ,aAAaC,EAA8B,CACjD,GAAIA,IAAW,OAAQ,CACrB,KAAK,kBAAoB,EACzB,MACF,CACIA,IAAW,UAAY,CAAC,KAAK,cAC/B,KAAK,kBAAkB,CAE3B,CAEQ,mBAA0B,CAChC,GAAI,KAAK,UAAU,aAAe,EAAG,OACrC,GAAI,KAAK,mBAAqB,KAAK,UAAU,YAAa,CACxD,KAAK,KAAK,QAAS,CACjB,MAAO,IAAI,MAAM,8CAA8C,CACjE,CAAC,EACD,MACF,CACA,MAAMC,EAAU,KAAK,oBACfC,EAAQ,KAAK,IACjB,KAAK,UAAU,iBAAmB,GAAKD,EACvC,KAAK,UAAU,YACjB,EACA,KAAK,eAAiB,WAAW,IAAM,CACrC,KAAK,SACF,QAAQ,EACR,MAAOH,GAAiB,CACvB,KAAK,KAAK,QAAS,CACjB,MAAOA,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAC3D,CAAC,EACD,KAAK,kBAAkB,CACzB,CAAC,CACL,EAAGI,CAAK,CACV,CAEQ,gBAAuB,CACzB,KAAK,iBACP,aAAa,KAAK,cAAc,EAChC,KAAK,eAAiB,MAExB,KAAK,kBAAoB,CAC3B,CAGQ,UAA0B,CAChC,OAAI,KAAK,YAAoB,QAAQ,QAAQ,GAC7C,KAAK,kBAAoB,KAAK,QAAQ,EAAE,QAAQ,IAAM,CACpD,KAAK,gBAAkB,IACzB,CAAC,EACM,KAAK,gBACd,CAEA,MAAc,SAAyB,CACrC,MAAMC,EAAU,WAEhB,GADI,CAACA,EAAQ,WAAW,cAAc,cAClC,KAAK,YAAa,OACtB,MAAMC,EAAWD,EAAQ,cACzB,GAAKC,EACL,GAAI,CACF,MAAMC,EAAkC,CACtC,iBAAkB,GAClB,iBAAkB,GAClB,gBAAiB,GACjB,GAAG,KAAK,MAAM,WAChB,EACA,KAAK,YAAc,MAAMF,EAAQ,UAAU,aAAa,aAAa,CACnE,MAAOE,CACT,CAAC,EACD,KAAK,cAAgB,IAAID,EAAS,KAAK,WAAW,EAClD,KAAK,cAAc,iBAAiB,gBAAkBV,GAAU,CAC1DA,EAAM,KAAK,OAAS,GACxBA,EAAM,KAAK,YAAY,EAAE,KAAK,MAAOY,GAAW,CAG9C,MAAMC,EAAoB,CACxB,KAAM,IAAI,WAAWD,CAAM,EAC3B,UAAW,KAAK,IAAI,EACpB,SAAU,KAAK,cACjB,EACA,IAAIE,EACJ,GAAI,CACFA,EAAM,KAAK,MAAM,UAAY,MAAM,KAAK,MAAM,UAAUD,CAAK,EAAIA,CACnE,OAAST,EAAK,CACZ,KAAK,KAAK,QAAS,CACjB,MAAOA,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAC3D,CAAC,EACD,MACF,CACKU,GACL,KAAK,UAAU,CAAE,GAAGA,EAAK,SAAUA,EAAI,UAAYD,EAAM,QAAS,CAAC,CACrE,CAAC,CACH,CAAC,EACD,KAAK,cAAc,MAAM,GAAG,CAC9B,OAAST,EAAK,CACZ,KAAK,KAAK,QAAS,CACjB,MAAOA,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAC3D,CAAC,CACH,CACF,CAEQ,SAAgB,CACtB,GAAI,KAAK,eAAiB,KAAK,cAAc,QAAU,WACrD,GAAI,CACF,KAAK,cAAc,KAAK,CAC1B,MAAQ,CAER,CAGF,GADA,KAAK,cAAgB,KACjB,KAAK,YAAa,CACpB,UAAWW,KAAS,KAAK,YAAY,UAAU,EAAGA,EAAM,KAAK,EAC7D,KAAK,YAAc,IACrB,CACF,CAEQ,KACNf,EACAK,EACM,CACN,MAAMH,EAAM,KAAK,UAAU,IAAIF,CAAK,EACpC,GAAKE,EACL,UAAWD,IAAY,CAAC,GAAGC,CAAG,EAC5B,GAAI,CACDD,EAAyBI,CAAO,CACnC,MAAQ,CAER,CAEJ,CACF",
6
+ "names": ["PipeflowClient", "__name", "options", "m", "s", "text", "audio", "result", "_audio", "event", "listener", "set", "message", "err", "payload", "status", "attempt", "delay", "globals", "Recorder", "constraints", "buffer", "chunk", "out", "track"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{PipeflowClient as e}from"./client.js";import{WebSocketProtocol as p}from"./protocol/websocket.js";export{e as PipeflowClient,p as WebSocketProtocol};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/client/index.ts"],
4
+ "sourcesContent": ["/**\n * Browser/client SDK for talking to a Pipeflow server.\n *\n * The client is intentionally tiny: a typed event surface that mirrors\n * `Conversation`, backed by a swappable wire protocol. It knows nothing about\n * STT/LLM/TTS: it forwards your input and surfaces what comes back.\n *\n * ```ts\n * import { PipeflowClient, WebSocketProtocol } from \"@moureau/pipeflow/client\";\n *\n * const client = new PipeflowClient({\n * protocol: new WebSocketProtocol({\n * url: \"wss://api.example.com/conversations/abc\",\n * token: () => localStorage.getItem(\"jwt\"),\n * }),\n * audio: { input: true },\n * });\n *\n * client.on(\"transcript\", (e) => render(e.entry.text));\n * client.on(\"audio\", (e) => client.playAudio(e.audio));\n * await client.connect();\n * await client.sendText(\"hello\", { userId: \"alice\" });\n * ```\n *\n * @packageDocumentation\n */\n\nexport { PipeflowClient } from \"./client\";\nexport type {\n PipeflowClientOptions,\n PipeflowClientEvent,\n PipeflowClientEventMap,\n Listener,\n ReconnectOptions,\n AudioInputOptions,\n CaptureConstraints,\n} from \"./client\";\n\nexport type {\n Protocol,\n ProtocolStatus,\n ProtocolMessage,\n ProtocolListener,\n StatusListener,\n} from \"./protocol\";\n\nexport { WebSocketProtocol } from \"./protocol/websocket\";\nexport type {\n WebSocketProtocolOptions,\n TokenProvider,\n} from \"./protocol/websocket\";"],
5
+ "mappings": "AA2BA,OAAS,kBAAAA,MAAsB,WAmB/B,OAAS,qBAAAC,MAAyB",
6
+ "names": ["PipeflowClient", "WebSocketProtocol"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var o=Object.defineProperty;var n=(r,e)=>o(r,"name",{value:e,configurable:!0});function t(r){if(r===null)return!0;const e=typeof r;return e==="string"||e==="boolean"?!0:e==="number"?Number.isFinite(r):Array.isArray(r)?r.every(t):e==="object"?Object.values(r).every(t):!1}n(t,"isJsonSerializable");export{t as isJsonSerializable};
2
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/client/json.ts"],
4
+ "sourcesContent": ["/**\n * Minimal JSON value guard for outbound messages.\n *\n * Kept narrow on purpose: server payloads carry domain types (turns,\n * transcripts, audio chunks) that aren't structurally typed as JSON values,\n * so the wire uses `unknown`. Outbound payloads, however, must serialize;\n * this guard catches values that JSON.stringify would silently drop\n * (functions, `undefined`, `bigint`).\n */\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport function isJsonSerializable(value: unknown): boolean {\n if (value === null) return true;\n const type = typeof value;\n if (type === \"string\" || type === \"boolean\") return true;\n if (type === \"number\") return Number.isFinite(value as number);\n if (Array.isArray(value)) return value.every(isJsonSerializable);\n if (type === \"object\") {\n const record = value as Record<string, unknown>;\n return Object.values(record).every(isJsonSerializable);\n }\n return false;\n}"],
5
+ "mappings": "+EAiBO,SAASA,EAAmBC,EAAyB,CAC1D,GAAIA,IAAU,KAAM,MAAO,GAC3B,MAAMC,EAAO,OAAOD,EACpB,OAAIC,IAAS,UAAYA,IAAS,UAAkB,GAChDA,IAAS,SAAiB,OAAO,SAASD,CAAe,EACzD,MAAM,QAAQA,CAAK,EAAUA,EAAM,MAAMD,CAAkB,EAC3DE,IAAS,SAEJ,OAAO,OADCD,CACY,EAAE,MAAMD,CAAkB,EAEhD,EACT,CAXgBG,EAAAH,EAAA",
6
+ "names": ["isJsonSerializable", "value", "type", "__name"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var l=Object.defineProperty;var r=(o,t)=>l(o,"name",{value:t,configurable:!0});import{isJsonSerializable as d}from"../json.js";class v{static{r(this,"WebSocketProtocol")}url;token;protocols;socketFactory;socket=null;_status="idle";messageListeners=new Set;statusListeners=new Set;constructor(t){this.url=t.url,this.token=t.token,this.protocols=t.protocols,this.socketFactory=t.socketFactory??((s,e)=>new WebSocket(s,e))}get status(){return this._status}async connect(){if(this._status==="open"||this._status==="connecting")return;this.socket&&this.teardownSocket(this.socket),this.setStatus("connecting");const t=this.token?await this.token():null,s=t?h(this.url,t):this.url,e=this.socketFactory(s,this.protocols);return this.socket=e,new Promise((n,c)=>{const i=r(()=>{e.removeEventListener("open",i),e.removeEventListener("error",a),this.setStatus("open"),n()},"onOpen"),a=r(()=>{e.removeEventListener("open",i),e.removeEventListener("error",a),this.setStatus("closed"),c(new Error(`Failed to connect to ${this.url}`))},"onError");e.addEventListener("open",i),e.addEventListener("error",a),e.addEventListener("message",this.handleMessage),e.addEventListener("close",this.handleClose)})}async close(){const t=this.socket;!t||this._status==="closed"||this._status==="idle"||(this.setStatus("closing"),await new Promise(s=>{const e=r(()=>{t.removeEventListener("close",e),s()},"done");t.addEventListener("close",e),t.readyState===WebSocket.CONNECTING?t.close():t.readyState===WebSocket.OPEN?t.close(1e3,"client closing"):s()}),this.teardownSocket(t),this.setStatus("closed"))}send(t){if(this._status!=="open"||!this.socket)throw new Error(`Cannot send on a ${this._status} protocol`);if(!d(t.payload))throw new Error("ProtocolMessage.payload must be JSON-serializable");this.socket.send(JSON.stringify(t))}onMessage(t){return this.messageListeners.add(t),()=>{this.messageListeners.delete(t)}}onStatus(t){return this.statusListeners.add(t),()=>{this.statusListeners.delete(t)}}handleMessage=r(t=>{const s=typeof t.data=="string"?t.data:"";if(!s)return;let e;try{e=JSON.parse(s)}catch{return}if(u(e))for(const n of[...this.messageListeners])try{n(e)}catch{}},"handleMessage");handleClose=r(()=>{this._status!=="closed"&&this.setStatus("closed"),this.socket&&this.teardownSocket(this.socket)},"handleClose");teardownSocket(t){t.removeEventListener("message",this.handleMessage),t.removeEventListener("close",this.handleClose),this.socket=null}setStatus(t){if(this._status!==t){this._status=t;for(const s of[...this.statusListeners])try{s(t)}catch{}}}}function u(o){return!o||typeof o!="object"?!1:typeof o.type=="string"}r(u,"isProtocolMessage");function h(o,t){try{const s=new URL(o);return s.searchParams.set("token",t),s.toString()}catch{const s=o.includes("?")?"&":"?";return`${o}${s}token=${encodeURIComponent(t)}`}}r(h,"withToken");export{v as WebSocketProtocol};
2
+ //# sourceMappingURL=websocket.js.map