@tanstack/ai 0.41.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/README.md +15 -1
  2. package/dist/esm/activities/chat/adapter.js +23 -16
  3. package/dist/esm/activities/chat/adapter.js.map +1 -1
  4. package/dist/esm/activities/chat/agent-loop-strategies.d.ts +10 -4
  5. package/dist/esm/activities/chat/agent-loop-strategies.js +75 -17
  6. package/dist/esm/activities/chat/agent-loop-strategies.js.map +1 -1
  7. package/dist/esm/activities/chat/cancel.d.ts +40 -0
  8. package/dist/esm/activities/chat/cancel.js +54 -0
  9. package/dist/esm/activities/chat/cancel.js.map +1 -0
  10. package/dist/esm/activities/chat/index.d.ts +28 -16
  11. package/dist/esm/activities/chat/index.js +2100 -1744
  12. package/dist/esm/activities/chat/index.js.map +1 -1
  13. package/dist/esm/activities/chat/mcp/manager.d.ts +2 -2
  14. package/dist/esm/activities/chat/mcp/manager.js +90 -77
  15. package/dist/esm/activities/chat/mcp/manager.js.map +1 -1
  16. package/dist/esm/activities/chat/mcp/types.d.ts +2 -2
  17. package/dist/esm/activities/chat/messages.js +397 -346
  18. package/dist/esm/activities/chat/messages.js.map +1 -1
  19. package/dist/esm/activities/chat/middleware/builder.js +17 -15
  20. package/dist/esm/activities/chat/middleware/builder.js.map +1 -1
  21. package/dist/esm/activities/chat/middleware/capabilities.js +78 -43
  22. package/dist/esm/activities/chat/middleware/capabilities.js.map +1 -1
  23. package/dist/esm/activities/chat/middleware/compose.d.ts +94 -1
  24. package/dist/esm/activities/chat/middleware/compose.js +623 -531
  25. package/dist/esm/activities/chat/middleware/compose.js.map +1 -1
  26. package/dist/esm/activities/chat/middleware/define.js +12 -5
  27. package/dist/esm/activities/chat/middleware/define.js.map +1 -1
  28. package/dist/esm/activities/chat/middleware/index.d.ts +5 -1
  29. package/dist/esm/activities/chat/middleware/locks.d.ts +50 -0
  30. package/dist/esm/activities/chat/middleware/locks.js +71 -0
  31. package/dist/esm/activities/chat/middleware/locks.js.map +1 -0
  32. package/dist/esm/activities/chat/middleware/pending-turn.d.ts +15 -0
  33. package/dist/esm/activities/chat/middleware/pending-turn.js +35 -0
  34. package/dist/esm/activities/chat/middleware/pending-turn.js.map +1 -0
  35. package/dist/esm/activities/chat/middleware/run-disconnect.d.ts +23 -0
  36. package/dist/esm/activities/chat/middleware/run-disconnect.js +42 -0
  37. package/dist/esm/activities/chat/middleware/run-disconnect.js.map +1 -0
  38. package/dist/esm/activities/chat/middleware/run-store.d.ts +283 -0
  39. package/dist/esm/activities/chat/middleware/run-store.js +176 -0
  40. package/dist/esm/activities/chat/middleware/run-store.js.map +1 -0
  41. package/dist/esm/activities/chat/middleware/sandbox-runtime.js +14 -8
  42. package/dist/esm/activities/chat/middleware/sandbox-runtime.js.map +1 -1
  43. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js +79 -70
  44. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js.map +1 -1
  45. package/dist/esm/activities/chat/middleware/types.d.ts +59 -2
  46. package/dist/esm/activities/chat/middleware/validate.js +23 -28
  47. package/dist/esm/activities/chat/middleware/validate.js.map +1 -1
  48. package/dist/esm/activities/chat/stream/json-parser.js +39 -25
  49. package/dist/esm/activities/chat/stream/json-parser.js.map +1 -1
  50. package/dist/esm/activities/chat/stream/message-updaters.js +275 -234
  51. package/dist/esm/activities/chat/stream/message-updaters.js.map +1 -1
  52. package/dist/esm/activities/chat/stream/processor.d.ts +24 -4
  53. package/dist/esm/activities/chat/stream/processor.js +1341 -1542
  54. package/dist/esm/activities/chat/stream/processor.js.map +1 -1
  55. package/dist/esm/activities/chat/stream/strategies.js +69 -53
  56. package/dist/esm/activities/chat/stream/strategies.js.map +1 -1
  57. package/dist/esm/activities/chat/tools/approval-schema.d.ts +19 -0
  58. package/dist/esm/activities/chat/tools/approval-schema.js +117 -0
  59. package/dist/esm/activities/chat/tools/approval-schema.js.map +1 -0
  60. package/dist/esm/activities/chat/tools/lazy-tool-manager.js +164 -191
  61. package/dist/esm/activities/chat/tools/lazy-tool-manager.js.map +1 -1
  62. package/dist/esm/activities/chat/tools/lazy-tools.js +24 -12
  63. package/dist/esm/activities/chat/tools/lazy-tools.js.map +1 -1
  64. package/dist/esm/activities/chat/tools/schema-converter.js +293 -146
  65. package/dist/esm/activities/chat/tools/schema-converter.js.map +1 -1
  66. package/dist/esm/activities/chat/tools/tool-calls.d.ts +18 -2
  67. package/dist/esm/activities/chat/tools/tool-calls.js +522 -531
  68. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
  69. package/dist/esm/activities/chat/tools/tool-definition.d.ts +75 -16
  70. package/dist/esm/activities/chat/tools/tool-definition.js +95 -23
  71. package/dist/esm/activities/chat/tools/tool-definition.js.map +1 -1
  72. package/dist/esm/activities/error-payload.js +85 -47
  73. package/dist/esm/activities/error-payload.js.map +1 -1
  74. package/dist/esm/activities/generateAudio/adapter.js +22 -15
  75. package/dist/esm/activities/generateAudio/adapter.js.map +1 -1
  76. package/dist/esm/activities/generateAudio/index.d.ts +4 -0
  77. package/dist/esm/activities/generateAudio/index.js +141 -105
  78. package/dist/esm/activities/generateAudio/index.js.map +1 -1
  79. package/dist/esm/activities/generateImage/adapter.js +22 -15
  80. package/dist/esm/activities/generateImage/adapter.js.map +1 -1
  81. package/dist/esm/activities/generateImage/index.d.ts +4 -0
  82. package/dist/esm/activities/generateImage/index.js +155 -111
  83. package/dist/esm/activities/generateImage/index.js.map +1 -1
  84. package/dist/esm/activities/generateSpeech/adapter.js +22 -15
  85. package/dist/esm/activities/generateSpeech/adapter.js.map +1 -1
  86. package/dist/esm/activities/generateSpeech/index.d.ts +4 -0
  87. package/dist/esm/activities/generateSpeech/index.js +159 -110
  88. package/dist/esm/activities/generateSpeech/index.js.map +1 -1
  89. package/dist/esm/activities/generateTranscription/adapter.js +22 -15
  90. package/dist/esm/activities/generateTranscription/adapter.js.map +1 -1
  91. package/dist/esm/activities/generateTranscription/index.d.ts +4 -0
  92. package/dist/esm/activities/generateTranscription/index.js +159 -100
  93. package/dist/esm/activities/generateTranscription/index.js.map +1 -1
  94. package/dist/esm/activities/generateVideo/adapter.js +36 -29
  95. package/dist/esm/activities/generateVideo/adapter.js.map +1 -1
  96. package/dist/esm/activities/generateVideo/index.d.ts +143 -19
  97. package/dist/esm/activities/generateVideo/index.js +456 -279
  98. package/dist/esm/activities/generateVideo/index.js.map +1 -1
  99. package/dist/esm/activities/generateVideo/snap.js +60 -48
  100. package/dist/esm/activities/generateVideo/snap.js.map +1 -1
  101. package/dist/esm/activities/index.js +8 -34
  102. package/dist/esm/activities/middleware/index.d.ts +1 -1
  103. package/dist/esm/activities/middleware/run.d.ts +10 -0
  104. package/dist/esm/activities/middleware/run.js +53 -29
  105. package/dist/esm/activities/middleware/run.js.map +1 -1
  106. package/dist/esm/activities/middleware/types.d.ts +44 -6
  107. package/dist/esm/activities/stream-generation-result.d.ts +4 -1
  108. package/dist/esm/activities/stream-generation-result.js +79 -44
  109. package/dist/esm/activities/stream-generation-result.js.map +1 -1
  110. package/dist/esm/activities/summarize/adapter.js +22 -15
  111. package/dist/esm/activities/summarize/adapter.js.map +1 -1
  112. package/dist/esm/activities/summarize/chat-stream-summarize.js +252 -202
  113. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +1 -1
  114. package/dist/esm/activities/summarize/index.d.ts +27 -0
  115. package/dist/esm/activities/summarize/index.js +268 -102
  116. package/dist/esm/activities/summarize/index.js.map +1 -1
  117. package/dist/esm/adapter-internals.d.ts +2 -1
  118. package/dist/esm/adapter-internals.js +4 -11
  119. package/dist/esm/client.d.ts +25 -3
  120. package/dist/esm/client.js +131 -64
  121. package/dist/esm/client.js.map +1 -1
  122. package/dist/esm/custom-events.d.ts +76 -0
  123. package/dist/esm/custom-events.js +37 -0
  124. package/dist/esm/custom-events.js.map +1 -0
  125. package/dist/esm/delivery-detach.d.ts +50 -0
  126. package/dist/esm/delivery-detach.js +71 -0
  127. package/dist/esm/delivery-detach.js.map +1 -0
  128. package/dist/esm/delivery-disconnect.d.ts +62 -0
  129. package/dist/esm/delivery-disconnect.js +81 -0
  130. package/dist/esm/delivery-disconnect.js.map +1 -0
  131. package/dist/esm/extend-adapter.js +19 -17
  132. package/dist/esm/extend-adapter.js.map +1 -1
  133. package/dist/esm/index.d.ts +23 -5
  134. package/dist/esm/index.js +30 -97
  135. package/dist/esm/interrupt-resume.d.ts +71 -0
  136. package/dist/esm/interrupt-resume.js +438 -0
  137. package/dist/esm/interrupt-resume.js.map +1 -0
  138. package/dist/esm/interrupt-serialization.d.ts +12 -0
  139. package/dist/esm/interrupt-serialization.js +178 -0
  140. package/dist/esm/interrupt-serialization.js.map +1 -0
  141. package/dist/esm/interrupts.d.ts +84 -0
  142. package/dist/esm/interrupts.js +31 -0
  143. package/dist/esm/interrupts.js.map +1 -0
  144. package/dist/esm/locks.d.ts +10 -0
  145. package/dist/esm/locks.js +2 -0
  146. package/dist/esm/logger/console-logger.js +101 -78
  147. package/dist/esm/logger/console-logger.js.map +1 -1
  148. package/dist/esm/logger/internal-logger.js +104 -89
  149. package/dist/esm/logger/internal-logger.js.map +1 -1
  150. package/dist/esm/logger/resolve.js +54 -49
  151. package/dist/esm/logger/resolve.js.map +1 -1
  152. package/dist/esm/logger/types.d.ts +1 -1
  153. package/dist/esm/middlewares/content-guard.js +142 -148
  154. package/dist/esm/middlewares/content-guard.js.map +1 -1
  155. package/dist/esm/middlewares/index.js +2 -6
  156. package/dist/esm/middlewares/otel.js +598 -732
  157. package/dist/esm/middlewares/otel.js.map +1 -1
  158. package/dist/esm/middlewares/usage-attributes.js +47 -40
  159. package/dist/esm/middlewares/usage-attributes.js.map +1 -1
  160. package/dist/esm/realtime/event-emitter.js +24 -25
  161. package/dist/esm/realtime/event-emitter.js.map +1 -1
  162. package/dist/esm/realtime/index.d.ts +5 -9
  163. package/dist/esm/realtime/index.js +29 -6
  164. package/dist/esm/realtime/index.js.map +1 -1
  165. package/dist/esm/scope.d.ts +47 -0
  166. package/dist/esm/stream-durability.d.ts +171 -0
  167. package/dist/esm/stream-durability.js +295 -0
  168. package/dist/esm/stream-durability.js.map +1 -0
  169. package/dist/esm/stream-to-response.d.ts +178 -13
  170. package/dist/esm/stream-to-response.js +663 -115
  171. package/dist/esm/stream-to-response.js.map +1 -1
  172. package/dist/esm/strip-to-spec-middleware.js +30 -16
  173. package/dist/esm/strip-to-spec-middleware.js.map +1 -1
  174. package/dist/esm/system-prompts.js +27 -21
  175. package/dist/esm/system-prompts.js.map +1 -1
  176. package/dist/esm/tool-registry.js +72 -45
  177. package/dist/esm/tool-registry.js.map +1 -1
  178. package/dist/esm/tools/provider-tool.js +14 -5
  179. package/dist/esm/tools/provider-tool.js.map +1 -1
  180. package/dist/esm/types.d.ts +332 -21
  181. package/dist/esm/types.js +2 -0
  182. package/dist/esm/utilities/ag-ui-wire.js +79 -93
  183. package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
  184. package/dist/esm/utilities/chat-params.d.ts +26 -4
  185. package/dist/esm/utilities/chat-params.js +218 -92
  186. package/dist/esm/utilities/chat-params.js.map +1 -1
  187. package/dist/esm/utilities/errors.js +28 -18
  188. package/dist/esm/utilities/errors.js.map +1 -1
  189. package/dist/esm/utilities/media-prompt.js +46 -41
  190. package/dist/esm/utilities/media-prompt.js.map +1 -1
  191. package/dist/esm/utilities/numbers.js +13 -10
  192. package/dist/esm/utilities/numbers.js.map +1 -1
  193. package/dist/esm/utilities/provider-executed.js +20 -11
  194. package/dist/esm/utilities/provider-executed.js.map +1 -1
  195. package/dist/esm/utilities/sampling-keys.js +31 -19
  196. package/dist/esm/utilities/sampling-keys.js.map +1 -1
  197. package/dist/esm/utilities/tool-result.js +42 -30
  198. package/dist/esm/utilities/tool-result.js.map +1 -1
  199. package/dist/esm/utilities/usage.js +27 -9
  200. package/dist/esm/utilities/usage.js.map +1 -1
  201. package/dist/esm/utils.js +26 -18
  202. package/dist/esm/utils.js.map +1 -1
  203. package/package.json +10 -6
  204. package/skills/ai-core/SKILL.md +69 -18
  205. package/skills/ai-core/adapter-configuration/SKILL.md +44 -21
  206. package/skills/ai-core/adapter-configuration/references/anthropic-adapter.md +1 -3
  207. package/skills/ai-core/adapter-configuration/references/byteplus-adapter.md +148 -0
  208. package/skills/ai-core/adapter-configuration/references/gemini-adapter.md +2 -6
  209. package/skills/ai-core/adapter-configuration/references/groq-adapter.md +2 -6
  210. package/skills/ai-core/adapter-configuration/references/openai-adapter.md +1 -3
  211. package/skills/ai-core/ag-ui-protocol/SKILL.md +1 -1
  212. package/skills/ai-core/chat-experience/SKILL.md +156 -11
  213. package/skills/ai-core/client-persistence/SKILL.md +277 -0
  214. package/skills/ai-core/custom-backend-integration/SKILL.md +1 -1
  215. package/skills/ai-core/debug-logging/SKILL.md +1 -1
  216. package/skills/ai-core/locks/SKILL.md +143 -0
  217. package/skills/ai-core/media-generation/SKILL.md +144 -12
  218. package/skills/ai-core/middleware/SKILL.md +258 -33
  219. package/skills/ai-core/structured-outputs/SKILL.md +1 -1
  220. package/skills/ai-core/tool-calling/SKILL.md +54 -59
  221. package/src/activities/chat/agent-loop-strategies.ts +10 -4
  222. package/src/activities/chat/cancel.ts +81 -0
  223. package/src/activities/chat/index.ts +1152 -153
  224. package/src/activities/chat/mcp/manager.ts +4 -4
  225. package/src/activities/chat/mcp/types.ts +2 -2
  226. package/src/activities/chat/messages.ts +5 -3
  227. package/src/activities/chat/middleware/builder.ts +1 -1
  228. package/src/activities/chat/middleware/compose.ts +186 -9
  229. package/src/activities/chat/middleware/index.ts +26 -0
  230. package/src/activities/chat/middleware/locks.ts +102 -0
  231. package/src/activities/chat/middleware/pending-turn.ts +47 -0
  232. package/src/activities/chat/middleware/run-disconnect.ts +62 -0
  233. package/src/activities/chat/middleware/run-store.ts +412 -0
  234. package/src/activities/chat/middleware/types.ts +62 -1
  235. package/src/activities/chat/stream/processor.ts +189 -5
  236. package/src/activities/chat/tools/approval-schema.ts +205 -0
  237. package/src/activities/chat/tools/tool-calls.ts +106 -13
  238. package/src/activities/chat/tools/tool-definition.ts +210 -39
  239. package/src/activities/generateAudio/index.ts +20 -3
  240. package/src/activities/generateImage/index.ts +20 -3
  241. package/src/activities/generateSpeech/index.ts +25 -3
  242. package/src/activities/generateTranscription/index.ts +26 -3
  243. package/src/activities/generateVideo/index.ts +345 -82
  244. package/src/activities/middleware/index.ts +2 -0
  245. package/src/activities/middleware/run.ts +31 -0
  246. package/src/activities/middleware/types.ts +49 -5
  247. package/src/activities/stream-generation-result.ts +30 -2
  248. package/src/activities/summarize/chat-stream-summarize.ts +5 -0
  249. package/src/activities/summarize/index.ts +200 -10
  250. package/src/adapter-internals.ts +10 -1
  251. package/src/client.ts +244 -0
  252. package/src/custom-events.ts +107 -0
  253. package/src/delivery-detach.ts +72 -0
  254. package/src/delivery-disconnect.ts +84 -0
  255. package/src/index.ts +138 -0
  256. package/src/interrupt-resume.ts +824 -0
  257. package/src/interrupt-serialization.ts +183 -0
  258. package/src/interrupts.ts +146 -0
  259. package/src/locks.ts +17 -0
  260. package/src/logger/types.ts +1 -1
  261. package/src/middlewares/otel.ts +1 -0
  262. package/src/realtime/index.ts +5 -9
  263. package/src/scope.ts +47 -0
  264. package/src/stream-durability.ts +598 -0
  265. package/src/stream-to-response.ts +1051 -95
  266. package/src/strip-to-spec-middleware.ts +3 -3
  267. package/src/types.ts +416 -24
  268. package/src/utilities/chat-params.ts +245 -55
  269. package/dist/esm/activities/index.js.map +0 -1
  270. package/dist/esm/adapter-internals.js.map +0 -1
  271. package/dist/esm/index.js.map +0 -1
  272. package/dist/esm/middlewares/index.js.map +0 -1
@@ -1,67 +1,134 @@
1
- import { toolDefinition } from "./activities/chat/tools/tool-definition.js";
2
- import { convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema } from "./activities/chat/tools/schema-converter.js";
1
+ import { canonicalInterruptJson, cloneAndDeepFreezeJson, digestInterruptJson } from "./interrupt-serialization.js";
2
+ import { INTERRUPT_BINDING_VERSION, canonicalizeInterruptResolutions } from "./interrupts.js";
3
+ import { convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema, validateWithStandardSchema } from "./activities/chat/tools/schema-converter.js";
4
+ import { hashSchemaInput, normalizeApprovalSchema } from "./activities/chat/tools/approval-schema.js";
5
+ import { INTERRUPT_BINDING_METADATA_KEY, readInterruptBinding, readUnopenedInterruptBinding, withInterruptBinding, withoutInterruptBinding } from "./interrupt-resume.js";
3
6
  import { convertMessagesToModelMessages, generateMessageId, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, uiMessageToModelMessages } from "./activities/chat/messages.js";
4
- import { uiMessagesToWire } from "./utilities/ag-ui-wire.js";
5
- import { BatchStrategy, CompositeStrategy, ImmediateStrategy, PunctuationStrategy, WordBoundaryStrategy } from "./activities/chat/stream/strategies.js";
7
+ import { toolDefinition } from "./activities/chat/tools/tool-definition.js";
6
8
  import { PartialJSONParser, defaultJSONParser, parsePartialJSON } from "./activities/chat/stream/json-parser.js";
9
+ import { BatchStrategy, CompositeStrategy, ImmediateStrategy, PunctuationStrategy, WordBoundaryStrategy } from "./activities/chat/stream/strategies.js";
7
10
  import { StreamProcessor } from "./activities/chat/stream/processor.js";
8
- var EventType = /* @__PURE__ */ ((EventType2) => {
9
- EventType2["TEXT_MESSAGE_START"] = "TEXT_MESSAGE_START";
10
- EventType2["TEXT_MESSAGE_CONTENT"] = "TEXT_MESSAGE_CONTENT";
11
- EventType2["TEXT_MESSAGE_END"] = "TEXT_MESSAGE_END";
12
- EventType2["TEXT_MESSAGE_CHUNK"] = "TEXT_MESSAGE_CHUNK";
13
- EventType2["TOOL_CALL_START"] = "TOOL_CALL_START";
14
- EventType2["TOOL_CALL_ARGS"] = "TOOL_CALL_ARGS";
15
- EventType2["TOOL_CALL_END"] = "TOOL_CALL_END";
16
- EventType2["TOOL_CALL_CHUNK"] = "TOOL_CALL_CHUNK";
17
- EventType2["TOOL_CALL_RESULT"] = "TOOL_CALL_RESULT";
18
- EventType2["THINKING_START"] = "THINKING_START";
19
- EventType2["THINKING_END"] = "THINKING_END";
20
- EventType2["THINKING_TEXT_MESSAGE_START"] = "THINKING_TEXT_MESSAGE_START";
21
- EventType2["THINKING_TEXT_MESSAGE_CONTENT"] = "THINKING_TEXT_MESSAGE_CONTENT";
22
- EventType2["THINKING_TEXT_MESSAGE_END"] = "THINKING_TEXT_MESSAGE_END";
23
- EventType2["STATE_SNAPSHOT"] = "STATE_SNAPSHOT";
24
- EventType2["STATE_DELTA"] = "STATE_DELTA";
25
- EventType2["MESSAGES_SNAPSHOT"] = "MESSAGES_SNAPSHOT";
26
- EventType2["ACTIVITY_SNAPSHOT"] = "ACTIVITY_SNAPSHOT";
27
- EventType2["ACTIVITY_DELTA"] = "ACTIVITY_DELTA";
28
- EventType2["RAW"] = "RAW";
29
- EventType2["CUSTOM"] = "CUSTOM";
30
- EventType2["RUN_STARTED"] = "RUN_STARTED";
31
- EventType2["RUN_FINISHED"] = "RUN_FINISHED";
32
- EventType2["RUN_ERROR"] = "RUN_ERROR";
33
- EventType2["STEP_STARTED"] = "STEP_STARTED";
34
- EventType2["STEP_FINISHED"] = "STEP_FINISHED";
35
- EventType2["REASONING_START"] = "REASONING_START";
36
- EventType2["REASONING_MESSAGE_START"] = "REASONING_MESSAGE_START";
37
- EventType2["REASONING_MESSAGE_CONTENT"] = "REASONING_MESSAGE_CONTENT";
38
- EventType2["REASONING_MESSAGE_END"] = "REASONING_MESSAGE_END";
39
- EventType2["REASONING_MESSAGE_CHUNK"] = "REASONING_MESSAGE_CHUNK";
40
- EventType2["REASONING_END"] = "REASONING_END";
41
- EventType2["REASONING_ENCRYPTED_VALUE"] = "REASONING_ENCRYPTED_VALUE";
42
- return EventType2;
43
- })(EventType || {});
44
- export {
45
- BatchStrategy,
46
- CompositeStrategy,
47
- EventType,
48
- ImmediateStrategy,
49
- PartialJSONParser,
50
- PunctuationStrategy,
51
- StreamProcessor,
52
- WordBoundaryStrategy,
53
- convertMessagesToModelMessages,
54
- convertSchemaToJsonSchema,
55
- defaultJSONParser,
56
- generateMessageId,
57
- isStandardSchema,
58
- modelMessageToUIMessage,
59
- modelMessagesToUIMessages,
60
- normalizeToUIMessage,
61
- parsePartialJSON,
62
- parseWithStandardSchema,
63
- toolDefinition,
64
- uiMessageToModelMessages,
65
- uiMessagesToWire
66
- };
67
- //# sourceMappingURL=client.js.map
11
+ import { uiMessagesToWire } from "./utilities/ag-ui-wire.js";
12
+ //#region src/client.ts
13
+ var generationKinds = [
14
+ "image",
15
+ "audio",
16
+ "tts",
17
+ "video",
18
+ "transcription"
19
+ ];
20
+ function isRecord(value) {
21
+ return typeof value === "object" && value !== null && !Array.isArray(value);
22
+ }
23
+ function hasOwnKey(value, key) {
24
+ return Object.prototype.hasOwnProperty.call(value, key);
25
+ }
26
+ function isGenerationEnvelope(body) {
27
+ return isRecord(body) && (hasOwnKey(body, "data") || hasOwnKey(body, "forwardedProps"));
28
+ }
29
+ function assertGenerationKind(kind) {
30
+ if (!generationKinds.includes(kind)) throw new Error(`Unsupported generation kind: ${String(kind)}. Expected one of ${generationKinds.join(", ")}.`);
31
+ }
32
+ function assertInputForKind(kind, input) {
33
+ if (!isRecord(input)) throw new Error(`Generation ${kind} input must be an object.`);
34
+ const requiredKey = kind === "tts" ? "text" : kind === "transcription" ? "audio" : "prompt";
35
+ if (!hasOwnKey(input, requiredKey)) throw new Error(`Generation ${kind} input must include ${requiredKey}.`);
36
+ }
37
+ function isInputForKind(kind, input) {
38
+ if (!isRecord(input)) return false;
39
+ return hasOwnKey(input, kind === "tts" ? "text" : kind === "transcription" ? "audio" : "prompt");
40
+ }
41
+ function forwardedPropsFromEnvelope(envelope) {
42
+ if (!hasOwnKey(envelope, "forwardedProps")) return {};
43
+ if (!isRecord(envelope.forwardedProps)) throw new Error("Generation envelope forwardedProps must be an object.");
44
+ return envelope.forwardedProps;
45
+ }
46
+ function optionalStringField(envelope, key) {
47
+ if (!hasOwnKey(envelope, key)) return;
48
+ const value = envelope[key];
49
+ if (typeof value !== "string") throw new Error(`Generation envelope ${key} must be a string.`);
50
+ return value;
51
+ }
52
+ function generationIdentityFields(envelope) {
53
+ const identity = {};
54
+ const threadId = optionalStringField(envelope, "threadId");
55
+ const runId = optionalStringField(envelope, "runId");
56
+ if (threadId !== void 0) identity.threadId = threadId;
57
+ if (runId !== void 0) identity.runId = runId;
58
+ return identity;
59
+ }
60
+ function generationParamsFromBody(kind, body) {
61
+ assertGenerationKind(kind);
62
+ if (isInputForKind(kind, body)) {
63
+ assertInputForKind(kind, body);
64
+ return {
65
+ input: body,
66
+ forwardedProps: {}
67
+ };
68
+ }
69
+ if (!isGenerationEnvelope(body)) {
70
+ assertInputForKind(kind, body);
71
+ return {
72
+ input: body,
73
+ forwardedProps: {}
74
+ };
75
+ }
76
+ if (!hasOwnKey(body, "data")) throw new Error(`Generation ${kind} envelope must include data.`);
77
+ const input = body.data;
78
+ assertInputForKind(kind, input);
79
+ return {
80
+ input,
81
+ forwardedProps: forwardedPropsFromEnvelope(body),
82
+ ...generationIdentityFields(body)
83
+ };
84
+ }
85
+ async function generationParamsFromRequest(kind, request) {
86
+ let body;
87
+ try {
88
+ body = await request.json();
89
+ } catch (error) {
90
+ throw new Error("Invalid JSON request body.", { cause: error });
91
+ }
92
+ if (!isRecord(body)) throw new Error("Generation request body must be a JSON object.");
93
+ return generationParamsFromBody(kind, body);
94
+ }
95
+ var EventType = /* @__PURE__ */ function(EventType) {
96
+ EventType["TEXT_MESSAGE_START"] = "TEXT_MESSAGE_START";
97
+ EventType["TEXT_MESSAGE_CONTENT"] = "TEXT_MESSAGE_CONTENT";
98
+ EventType["TEXT_MESSAGE_END"] = "TEXT_MESSAGE_END";
99
+ EventType["TEXT_MESSAGE_CHUNK"] = "TEXT_MESSAGE_CHUNK";
100
+ EventType["TOOL_CALL_START"] = "TOOL_CALL_START";
101
+ EventType["TOOL_CALL_ARGS"] = "TOOL_CALL_ARGS";
102
+ EventType["TOOL_CALL_END"] = "TOOL_CALL_END";
103
+ EventType["TOOL_CALL_CHUNK"] = "TOOL_CALL_CHUNK";
104
+ EventType["TOOL_CALL_RESULT"] = "TOOL_CALL_RESULT";
105
+ EventType["THINKING_START"] = "THINKING_START";
106
+ EventType["THINKING_END"] = "THINKING_END";
107
+ EventType["THINKING_TEXT_MESSAGE_START"] = "THINKING_TEXT_MESSAGE_START";
108
+ EventType["THINKING_TEXT_MESSAGE_CONTENT"] = "THINKING_TEXT_MESSAGE_CONTENT";
109
+ EventType["THINKING_TEXT_MESSAGE_END"] = "THINKING_TEXT_MESSAGE_END";
110
+ EventType["STATE_SNAPSHOT"] = "STATE_SNAPSHOT";
111
+ EventType["STATE_DELTA"] = "STATE_DELTA";
112
+ EventType["MESSAGES_SNAPSHOT"] = "MESSAGES_SNAPSHOT";
113
+ EventType["ACTIVITY_SNAPSHOT"] = "ACTIVITY_SNAPSHOT";
114
+ EventType["ACTIVITY_DELTA"] = "ACTIVITY_DELTA";
115
+ EventType["RAW"] = "RAW";
116
+ EventType["CUSTOM"] = "CUSTOM";
117
+ EventType["RUN_STARTED"] = "RUN_STARTED";
118
+ EventType["RUN_FINISHED"] = "RUN_FINISHED";
119
+ EventType["RUN_ERROR"] = "RUN_ERROR";
120
+ EventType["STEP_STARTED"] = "STEP_STARTED";
121
+ EventType["STEP_FINISHED"] = "STEP_FINISHED";
122
+ EventType["REASONING_START"] = "REASONING_START";
123
+ EventType["REASONING_MESSAGE_START"] = "REASONING_MESSAGE_START";
124
+ EventType["REASONING_MESSAGE_CONTENT"] = "REASONING_MESSAGE_CONTENT";
125
+ EventType["REASONING_MESSAGE_END"] = "REASONING_MESSAGE_END";
126
+ EventType["REASONING_MESSAGE_CHUNK"] = "REASONING_MESSAGE_CHUNK";
127
+ EventType["REASONING_END"] = "REASONING_END";
128
+ EventType["REASONING_ENCRYPTED_VALUE"] = "REASONING_ENCRYPTED_VALUE";
129
+ return EventType;
130
+ }({});
131
+ //#endregion
132
+ export { BatchStrategy, CompositeStrategy, EventType, INTERRUPT_BINDING_METADATA_KEY, INTERRUPT_BINDING_VERSION, ImmediateStrategy, PartialJSONParser, PunctuationStrategy, StreamProcessor, WordBoundaryStrategy, canonicalInterruptJson, canonicalizeInterruptResolutions, cloneAndDeepFreezeJson, convertMessagesToModelMessages, convertSchemaToJsonSchema, defaultJSONParser, digestInterruptJson, generateMessageId, generationParamsFromBody, generationParamsFromRequest, hashSchemaInput, isStandardSchema, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeApprovalSchema, normalizeToUIMessage, parsePartialJSON, parseWithStandardSchema, readInterruptBinding, readUnopenedInterruptBinding, toolDefinition, uiMessageToModelMessages, uiMessagesToWire, validateWithStandardSchema, withInterruptBinding, withoutInterruptBinding };
133
+
134
+ //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../../src/client.ts"],"sourcesContent":["export enum EventType {\n TEXT_MESSAGE_START = 'TEXT_MESSAGE_START',\n TEXT_MESSAGE_CONTENT = 'TEXT_MESSAGE_CONTENT',\n TEXT_MESSAGE_END = 'TEXT_MESSAGE_END',\n TEXT_MESSAGE_CHUNK = 'TEXT_MESSAGE_CHUNK',\n TOOL_CALL_START = 'TOOL_CALL_START',\n TOOL_CALL_ARGS = 'TOOL_CALL_ARGS',\n TOOL_CALL_END = 'TOOL_CALL_END',\n TOOL_CALL_CHUNK = 'TOOL_CALL_CHUNK',\n TOOL_CALL_RESULT = 'TOOL_CALL_RESULT',\n THINKING_START = 'THINKING_START',\n THINKING_END = 'THINKING_END',\n THINKING_TEXT_MESSAGE_START = 'THINKING_TEXT_MESSAGE_START',\n THINKING_TEXT_MESSAGE_CONTENT = 'THINKING_TEXT_MESSAGE_CONTENT',\n THINKING_TEXT_MESSAGE_END = 'THINKING_TEXT_MESSAGE_END',\n STATE_SNAPSHOT = 'STATE_SNAPSHOT',\n STATE_DELTA = 'STATE_DELTA',\n MESSAGES_SNAPSHOT = 'MESSAGES_SNAPSHOT',\n ACTIVITY_SNAPSHOT = 'ACTIVITY_SNAPSHOT',\n ACTIVITY_DELTA = 'ACTIVITY_DELTA',\n RAW = 'RAW',\n CUSTOM = 'CUSTOM',\n RUN_STARTED = 'RUN_STARTED',\n RUN_FINISHED = 'RUN_FINISHED',\n RUN_ERROR = 'RUN_ERROR',\n STEP_STARTED = 'STEP_STARTED',\n STEP_FINISHED = 'STEP_FINISHED',\n REASONING_START = 'REASONING_START',\n REASONING_MESSAGE_START = 'REASONING_MESSAGE_START',\n REASONING_MESSAGE_CONTENT = 'REASONING_MESSAGE_CONTENT',\n REASONING_MESSAGE_END = 'REASONING_MESSAGE_END',\n REASONING_MESSAGE_CHUNK = 'REASONING_MESSAGE_CHUNK',\n REASONING_END = 'REASONING_END',\n REASONING_ENCRYPTED_VALUE = 'REASONING_ENCRYPTED_VALUE',\n}\n\nexport {\n toolDefinition,\n type AnyClientTool,\n type ClientTool,\n type InferToolInput,\n type InferToolName,\n type InferToolOutput,\n type ToolDefinition,\n type ToolDefinitionConfig,\n type ToolDefinitionInstance,\n} from './activities/chat/tools/tool-definition'\n\nexport {\n convertSchemaToJsonSchema,\n isStandardSchema,\n parseWithStandardSchema,\n} from './activities/chat/tools/schema-converter'\n\nexport {\n convertMessagesToModelMessages,\n generateMessageId,\n modelMessageToUIMessage,\n modelMessagesToUIMessages,\n normalizeToUIMessage,\n uiMessageToModelMessages,\n} from './activities/chat/messages'\n\nexport {\n BatchStrategy,\n CompositeStrategy,\n defaultJSONParser,\n ImmediateStrategy,\n parsePartialJSON,\n PartialJSONParser,\n PunctuationStrategy,\n StreamProcessor,\n WordBoundaryStrategy,\n} from './activities/chat/stream/index'\nexport type {\n ChunkRecording,\n ChunkStrategy,\n InternalToolCallState,\n JSONParser,\n ProcessorResult,\n ProcessorState,\n StreamProcessorEvents,\n StreamProcessorOptions,\n ToolCallState,\n ToolResultState,\n} from './activities/chat/stream/index'\n\nexport { uiMessagesToWire } from './utilities/ag-ui-wire'\nexport type { WireMessage } from './utilities/ag-ui-wire'\n\nexport type {\n AudioPart,\n ContentPart,\n ContentPartDataSource,\n ContentPartSource,\n ContentPartUrlSource,\n CustomEvent,\n DocumentPart,\n ImagePart,\n MediaInputMetadata,\n MediaInputRole,\n MediaPrompt,\n MediaPromptPart,\n MessagePart,\n ModelMessage,\n RunErrorEvent,\n RunFinishedEvent,\n SchemaInput,\n StreamChunk,\n StructuredOutputPart,\n TextPart,\n ThinkingPart,\n ToolCall,\n ToolCallPart,\n ToolResultPart,\n UIMessage,\n UIResourcePart,\n VideoPart,\n InferSchemaType,\n} from './types'\n\nexport type {\n AudioVisualization,\n RealtimeAdapter,\n RealtimeConnection,\n RealtimeError,\n RealtimeErrorCode,\n RealtimeEvent,\n RealtimeEventHandler,\n RealtimeEventPayloads,\n RealtimeMessage,\n RealtimeMessagePart,\n RealtimeMode,\n RealtimeSessionConfig,\n RealtimeStatus,\n RealtimeToken,\n RealtimeAudioPart,\n RealtimeImagePart,\n RealtimeTextPart,\n RealtimeToolCallPart,\n RealtimeToolResultPart,\n VADConfig,\n} from './realtime/types'\n"],"names":["EventType"],"mappings":";;;;;;;AAAO,IAAK,8BAAAA,eAAL;AACLA,aAAA,oBAAA,IAAqB;AACrBA,aAAA,sBAAA,IAAuB;AACvBA,aAAA,kBAAA,IAAmB;AACnBA,aAAA,oBAAA,IAAqB;AACrBA,aAAA,iBAAA,IAAkB;AAClBA,aAAA,gBAAA,IAAiB;AACjBA,aAAA,eAAA,IAAgB;AAChBA,aAAA,iBAAA,IAAkB;AAClBA,aAAA,kBAAA,IAAmB;AACnBA,aAAA,gBAAA,IAAiB;AACjBA,aAAA,cAAA,IAAe;AACfA,aAAA,6BAAA,IAA8B;AAC9BA,aAAA,+BAAA,IAAgC;AAChCA,aAAA,2BAAA,IAA4B;AAC5BA,aAAA,gBAAA,IAAiB;AACjBA,aAAA,aAAA,IAAc;AACdA,aAAA,mBAAA,IAAoB;AACpBA,aAAA,mBAAA,IAAoB;AACpBA,aAAA,gBAAA,IAAiB;AACjBA,aAAA,KAAA,IAAM;AACNA,aAAA,QAAA,IAAS;AACTA,aAAA,aAAA,IAAc;AACdA,aAAA,cAAA,IAAe;AACfA,aAAA,WAAA,IAAY;AACZA,aAAA,cAAA,IAAe;AACfA,aAAA,eAAA,IAAgB;AAChBA,aAAA,iBAAA,IAAkB;AAClBA,aAAA,yBAAA,IAA0B;AAC1BA,aAAA,2BAAA,IAA4B;AAC5BA,aAAA,uBAAA,IAAwB;AACxBA,aAAA,yBAAA,IAA0B;AAC1BA,aAAA,eAAA,IAAgB;AAChBA,aAAA,2BAAA,IAA4B;AAjClB,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../src/client.ts"],"sourcesContent":["import type {\n AudioGenerationOptions,\n ImageGenerationOptions,\n TTSOptions,\n TranscriptionOptions,\n VideoGenerationOptions,\n} from './types'\n\nexport type GenerationKind =\n | 'image'\n | 'audio'\n | 'tts'\n | 'video'\n | 'transcription'\n\ntype GenerationInputByKind = {\n image: Omit<ImageGenerationOptions, 'logger' | 'model'>\n audio: Omit<AudioGenerationOptions, 'logger' | 'model'>\n tts: Omit<TTSOptions, 'logger' | 'model'>\n video: Omit<VideoGenerationOptions, 'logger' | 'model'>\n transcription: Omit<TranscriptionOptions, 'logger' | 'model'>\n}\n\nexport interface GenerationParams<TKind extends GenerationKind> {\n input: GenerationInputByKind[TKind]\n forwardedProps: Record<string, unknown>\n threadId?: string\n runId?: string\n}\n\nconst generationKinds = [\n 'image',\n 'audio',\n 'tts',\n 'video',\n 'transcription',\n] as const satisfies ReadonlyArray<GenerationKind>\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction hasOwnKey(value: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key)\n}\n\nfunction isGenerationEnvelope(body: unknown): body is Record<string, unknown> {\n return (\n isRecord(body) &&\n (hasOwnKey(body, 'data') || hasOwnKey(body, 'forwardedProps'))\n )\n}\n\nfunction assertGenerationKind(kind: unknown): asserts kind is GenerationKind {\n if (!generationKinds.includes(kind as GenerationKind)) {\n throw new Error(\n `Unsupported generation kind: ${String(\n kind,\n )}. Expected one of ${generationKinds.join(', ')}.`,\n )\n }\n}\n\nfunction assertInputForKind(\n kind: GenerationKind,\n input: unknown,\n): asserts input is GenerationInputByKind[GenerationKind] {\n if (!isRecord(input)) {\n throw new Error(`Generation ${kind} input must be an object.`)\n }\n\n const requiredKey =\n kind === 'tts' ? 'text' : kind === 'transcription' ? 'audio' : 'prompt'\n\n if (!hasOwnKey(input, requiredKey)) {\n throw new Error(`Generation ${kind} input must include ${requiredKey}.`)\n }\n}\n\nfunction isInputForKind(kind: GenerationKind, input: unknown): boolean {\n if (!isRecord(input)) return false\n\n const requiredKey =\n kind === 'tts' ? 'text' : kind === 'transcription' ? 'audio' : 'prompt'\n\n return hasOwnKey(input, requiredKey)\n}\n\nfunction forwardedPropsFromEnvelope(\n envelope: Record<string, unknown>,\n): Record<string, unknown> {\n if (!hasOwnKey(envelope, 'forwardedProps')) {\n return {}\n }\n\n if (!isRecord(envelope.forwardedProps)) {\n throw new Error('Generation envelope forwardedProps must be an object.')\n }\n\n return envelope.forwardedProps\n}\n\nfunction optionalStringField(\n envelope: Record<string, unknown>,\n key: 'threadId' | 'runId',\n): string | undefined {\n if (!hasOwnKey(envelope, key)) {\n return undefined\n }\n\n const value = envelope[key]\n if (typeof value !== 'string') {\n throw new Error(`Generation envelope ${key} must be a string.`)\n }\n\n return value\n}\n\nfunction generationIdentityFields(envelope: Record<string, unknown>): {\n threadId?: string\n runId?: string\n} {\n const identity: {\n threadId?: string\n runId?: string\n } = {}\n const threadId = optionalStringField(envelope, 'threadId')\n const runId = optionalStringField(envelope, 'runId')\n\n if (threadId !== undefined) identity.threadId = threadId\n if (runId !== undefined) identity.runId = runId\n\n return identity\n}\n\nexport function generationParamsFromBody<TKind extends GenerationKind>(\n kind: TKind,\n body: unknown,\n): GenerationParams<TKind> {\n assertGenerationKind(kind)\n\n if (isInputForKind(kind, body)) {\n assertInputForKind(kind, body)\n return {\n input: body as GenerationInputByKind[TKind],\n forwardedProps: {},\n }\n }\n\n if (!isGenerationEnvelope(body)) {\n assertInputForKind(kind, body)\n return {\n input: body as GenerationInputByKind[TKind],\n forwardedProps: {},\n }\n }\n\n if (!hasOwnKey(body, 'data')) {\n throw new Error(`Generation ${kind} envelope must include data.`)\n }\n\n const input = body.data\n assertInputForKind(kind, input)\n\n const forwardedProps = forwardedPropsFromEnvelope(body)\n\n return {\n input: input as GenerationInputByKind[TKind],\n forwardedProps,\n ...generationIdentityFields(body),\n }\n}\n\nexport async function generationParamsFromRequest<TKind extends GenerationKind>(\n kind: TKind,\n request: Request,\n): Promise<GenerationParams<TKind>> {\n let body: unknown\n try {\n body = await request.json()\n } catch (error) {\n throw new Error('Invalid JSON request body.', { cause: error })\n }\n\n if (!isRecord(body)) {\n throw new Error('Generation request body must be a JSON object.')\n }\n\n return generationParamsFromBody(kind, body)\n}\n\nexport enum EventType {\n TEXT_MESSAGE_START = 'TEXT_MESSAGE_START',\n TEXT_MESSAGE_CONTENT = 'TEXT_MESSAGE_CONTENT',\n TEXT_MESSAGE_END = 'TEXT_MESSAGE_END',\n TEXT_MESSAGE_CHUNK = 'TEXT_MESSAGE_CHUNK',\n TOOL_CALL_START = 'TOOL_CALL_START',\n TOOL_CALL_ARGS = 'TOOL_CALL_ARGS',\n TOOL_CALL_END = 'TOOL_CALL_END',\n TOOL_CALL_CHUNK = 'TOOL_CALL_CHUNK',\n TOOL_CALL_RESULT = 'TOOL_CALL_RESULT',\n THINKING_START = 'THINKING_START',\n THINKING_END = 'THINKING_END',\n THINKING_TEXT_MESSAGE_START = 'THINKING_TEXT_MESSAGE_START',\n THINKING_TEXT_MESSAGE_CONTENT = 'THINKING_TEXT_MESSAGE_CONTENT',\n THINKING_TEXT_MESSAGE_END = 'THINKING_TEXT_MESSAGE_END',\n STATE_SNAPSHOT = 'STATE_SNAPSHOT',\n STATE_DELTA = 'STATE_DELTA',\n MESSAGES_SNAPSHOT = 'MESSAGES_SNAPSHOT',\n ACTIVITY_SNAPSHOT = 'ACTIVITY_SNAPSHOT',\n ACTIVITY_DELTA = 'ACTIVITY_DELTA',\n RAW = 'RAW',\n CUSTOM = 'CUSTOM',\n RUN_STARTED = 'RUN_STARTED',\n RUN_FINISHED = 'RUN_FINISHED',\n RUN_ERROR = 'RUN_ERROR',\n STEP_STARTED = 'STEP_STARTED',\n STEP_FINISHED = 'STEP_FINISHED',\n REASONING_START = 'REASONING_START',\n REASONING_MESSAGE_START = 'REASONING_MESSAGE_START',\n REASONING_MESSAGE_CONTENT = 'REASONING_MESSAGE_CONTENT',\n REASONING_MESSAGE_END = 'REASONING_MESSAGE_END',\n REASONING_MESSAGE_CHUNK = 'REASONING_MESSAGE_CHUNK',\n REASONING_END = 'REASONING_END',\n REASONING_ENCRYPTED_VALUE = 'REASONING_ENCRYPTED_VALUE',\n}\n\nexport {\n toolDefinition,\n type AnyClientTool,\n type ClientTool,\n type InferToolInput,\n type InferToolName,\n type InferToolOutput,\n type ApprovalCapabilityOf,\n type ApprovalSchemaConfig,\n type ApprovalSchemaOf,\n type InputSchemaOf,\n type OutputSchemaOf,\n type NoSchema,\n type ToolDefinition,\n type ToolDefinitionConfig,\n type ToolDefinitionInstance,\n} from './activities/chat/tools/tool-definition'\n\nexport {\n hashSchemaInput,\n normalizeApprovalSchema,\n type NormalizedApprovalSchema,\n type NormalizedSchemaInput,\n} from './activities/chat/tools/approval-schema'\n\nexport {\n canonicalInterruptJson,\n cloneAndDeepFreezeJson,\n digestInterruptJson,\n} from './interrupt-serialization'\n\nexport {\n convertSchemaToJsonSchema,\n isStandardSchema,\n parseWithStandardSchema,\n validateWithStandardSchema,\n} from './activities/chat/tools/schema-converter'\n\nexport {\n convertMessagesToModelMessages,\n generateMessageId,\n modelMessageToUIMessage,\n modelMessagesToUIMessages,\n normalizeToUIMessage,\n uiMessageToModelMessages,\n} from './activities/chat/messages'\n\nexport {\n BatchStrategy,\n CompositeStrategy,\n defaultJSONParser,\n ImmediateStrategy,\n parsePartialJSON,\n PartialJSONParser,\n PunctuationStrategy,\n StreamProcessor,\n WordBoundaryStrategy,\n} from './activities/chat/stream/index'\nexport type {\n ChunkRecording,\n ChunkStrategy,\n InternalToolCallState,\n JSONParser,\n ProcessorResult,\n ProcessorState,\n StreamProcessorEvents,\n StreamProcessorOptions,\n ToolCallState,\n ToolResultState,\n} from './activities/chat/stream/index'\n\nexport { uiMessagesToWire } from './utilities/ag-ui-wire'\nexport type { WireMessage } from './utilities/ag-ui-wire'\n\nexport type {\n AudioPart,\n ContentPart,\n ContentPartDataSource,\n ContentPartSource,\n ContentPartUrlSource,\n CustomEvent,\n DocumentPart,\n ImagePart,\n MediaInputMetadata,\n MediaInputRole,\n MediaPrompt,\n MediaPromptPart,\n MessagePart,\n ModelMessage,\n PersistedArtifactActivity,\n PersistedArtifactRef,\n PersistedArtifactRole,\n Interrupt,\n RunAgentResumeItem,\n RunErrorEvent,\n RunFinishedEvent,\n RunFinishedOutcome,\n SchemaInput,\n StreamChunk,\n StructuredOutputPart,\n TextPart,\n ThinkingPart,\n ToolCall,\n ToolCallPart,\n ToolResultPart,\n UIMessage,\n UIResourcePart,\n VideoPart,\n InferSchemaType,\n} from './types'\n\n// Enumerated, not `export *` — see the matching note in `index.ts`. The\n// interrupt protocol surface is a commitment, so it is published field by\n// field.\nexport {\n INTERRUPT_BINDING_VERSION,\n canonicalizeInterruptResolutions,\n} from './interrupts'\nexport type {\n BatchInterruptError,\n BatchInterruptErrorCode,\n InterruptBinding,\n InterruptCorrelation,\n InterruptSubmissionError,\n ItemInterruptError,\n ItemInterruptErrorCode,\n ToolApprovalResolution,\n UnopenedInterruptBinding,\n} from './interrupts'\n\nexport {\n INTERRUPT_BINDING_METADATA_KEY,\n readInterruptBinding,\n readUnopenedInterruptBinding,\n withInterruptBinding,\n withoutInterruptBinding,\n} from './interrupt-resume'\n\nexport type {\n AudioVisualization,\n RealtimeAdapter,\n RealtimeConnection,\n RealtimeError,\n RealtimeErrorCode,\n RealtimeEvent,\n RealtimeEventHandler,\n RealtimeEventPayloads,\n RealtimeMessage,\n RealtimeMessagePart,\n RealtimeMode,\n RealtimeSessionConfig,\n RealtimeStatus,\n RealtimeToken,\n RealtimeAudioPart,\n RealtimeImagePart,\n RealtimeTextPart,\n RealtimeToolCallPart,\n RealtimeToolResultPart,\n VADConfig,\n} from './realtime/types'\n"],"mappings":";;;;;;;;;;;;AA8BA,IAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,OAAgC,KAAsB;CACvE,OAAO,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG;AACxD;AAEA,SAAS,qBAAqB,MAAgD;CAC5E,OACE,SAAS,IAAI,MACZ,UAAU,MAAM,MAAM,KAAK,UAAU,MAAM,gBAAgB;AAEhE;AAEA,SAAS,qBAAqB,MAA+C;CAC3E,IAAI,CAAC,gBAAgB,SAAS,IAAsB,GAClD,MAAM,IAAI,MACR,gCAAgC,OAC9B,IACF,EAAE,oBAAoB,gBAAgB,KAAK,IAAI,EAAE,EACnD;AAEJ;AAEA,SAAS,mBACP,MACA,OACwD;CACxD,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,MAAM,cAAc,KAAK,0BAA0B;CAG/D,MAAM,cACJ,SAAS,QAAQ,SAAS,SAAS,kBAAkB,UAAU;CAEjE,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B,MAAM,IAAI,MAAM,cAAc,KAAK,sBAAsB,YAAY,EAAE;AAE3E;AAEA,SAAS,eAAe,MAAsB,OAAyB;CACrE,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAK7B,OAAO,UAAU,OAFf,SAAS,QAAQ,SAAS,SAAS,kBAAkB,UAAU,QAE9B;AACrC;AAEA,SAAS,2BACP,UACyB;CACzB,IAAI,CAAC,UAAU,UAAU,gBAAgB,GACvC,OAAO,CAAC;CAGV,IAAI,CAAC,SAAS,SAAS,cAAc,GACnC,MAAM,IAAI,MAAM,uDAAuD;CAGzE,OAAO,SAAS;AAClB;AAEA,SAAS,oBACP,UACA,KACoB;CACpB,IAAI,CAAC,UAAU,UAAU,GAAG,GAC1B;CAGF,MAAM,QAAQ,SAAS;CACvB,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,MAAM,uBAAuB,IAAI,mBAAmB;CAGhE,OAAO;AACT;AAEA,SAAS,yBAAyB,UAGhC;CACA,MAAM,WAGF,CAAC;CACL,MAAM,WAAW,oBAAoB,UAAU,UAAU;CACzD,MAAM,QAAQ,oBAAoB,UAAU,OAAO;CAEnD,IAAI,aAAa,KAAA,GAAW,SAAS,WAAW;CAChD,IAAI,UAAU,KAAA,GAAW,SAAS,QAAQ;CAE1C,OAAO;AACT;AAEA,SAAgB,yBACd,MACA,MACyB;CACzB,qBAAqB,IAAI;CAEzB,IAAI,eAAe,MAAM,IAAI,GAAG;EAC9B,mBAAmB,MAAM,IAAI;EAC7B,OAAO;GACL,OAAO;GACP,gBAAgB,CAAC;EACnB;CACF;CAEA,IAAI,CAAC,qBAAqB,IAAI,GAAG;EAC/B,mBAAmB,MAAM,IAAI;EAC7B,OAAO;GACL,OAAO;GACP,gBAAgB,CAAC;EACnB;CACF;CAEA,IAAI,CAAC,UAAU,MAAM,MAAM,GACzB,MAAM,IAAI,MAAM,cAAc,KAAK,6BAA6B;CAGlE,MAAM,QAAQ,KAAK;CACnB,mBAAmB,MAAM,KAAK;CAI9B,OAAO;EACE;EACP,gBAJqB,2BAA2B,IAIhD;EACA,GAAG,yBAAyB,IAAI;CAClC;AACF;AAEA,eAAsB,4BACpB,MACA,SACkC;CAClC,IAAI;CACJ,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK;CAC5B,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,8BAA8B,EAAE,OAAO,MAAM,CAAC;CAChE;CAEA,IAAI,CAAC,SAAS,IAAI,GAChB,MAAM,IAAI,MAAM,gDAAgD;CAGlE,OAAO,yBAAyB,MAAM,IAAI;AAC5C;AAEA,IAAY,YAAL,yBAAA,WAAA;CACL,UAAA,wBAAA;CACA,UAAA,0BAAA;CACA,UAAA,sBAAA;CACA,UAAA,wBAAA;CACA,UAAA,qBAAA;CACA,UAAA,oBAAA;CACA,UAAA,mBAAA;CACA,UAAA,qBAAA;CACA,UAAA,sBAAA;CACA,UAAA,oBAAA;CACA,UAAA,kBAAA;CACA,UAAA,iCAAA;CACA,UAAA,mCAAA;CACA,UAAA,+BAAA;CACA,UAAA,oBAAA;CACA,UAAA,iBAAA;CACA,UAAA,uBAAA;CACA,UAAA,uBAAA;CACA,UAAA,oBAAA;CACA,UAAA,SAAA;CACA,UAAA,YAAA;CACA,UAAA,iBAAA;CACA,UAAA,kBAAA;CACA,UAAA,eAAA;CACA,UAAA,kBAAA;CACA,UAAA,mBAAA;CACA,UAAA,qBAAA;CACA,UAAA,6BAAA;CACA,UAAA,+BAAA;CACA,UAAA,2BAAA;CACA,UAAA,6BAAA;CACA,UAAA,mBAAA;CACA,UAAA,+BAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -0,0 +1,76 @@
1
+ import { CustomEvent, StreamChunk } from './types.js';
2
+ /** Well-known CUSTOM event names. */
3
+ export declare const CUSTOM_EVENT: {
4
+ readonly FILE_CHANGED: "file.changed";
5
+ readonly PROCESS_STDOUT: "process.stdout";
6
+ readonly PROCESS_STDERR: "process.stderr";
7
+ readonly PORT_OPENED: "port.opened";
8
+ readonly APPROVAL_REQUESTED: "approval.requested";
9
+ readonly APPROVAL_RESOLVED: "approval.resolved";
10
+ readonly ARTIFACT_CREATED: "artifact.created";
11
+ readonly SANDBOX_CREATED: "sandbox.created";
12
+ readonly SANDBOX_RESUMED: "sandbox.resumed";
13
+ };
14
+ /** Union of the well-known CUSTOM event name literals. */
15
+ export type WellKnownCustomEventName = (typeof CUSTOM_EVENT)[keyof typeof CUSTOM_EVENT];
16
+ export interface FileChangedPayload {
17
+ type: 'create' | 'change' | 'delete';
18
+ /** Absolute path inside the sandbox (under the workspace root). */
19
+ path: string;
20
+ /** Unified diff, when the harness can produce one. */
21
+ diff?: string;
22
+ timestamp: number;
23
+ }
24
+ export interface ProcessOutputPayload {
25
+ /** Stable id for the spawned process whose output this is. */
26
+ processId: string;
27
+ /** A chunk of stdout/stderr text. */
28
+ chunk: string;
29
+ }
30
+ export interface PortOpenedPayload {
31
+ port: number;
32
+ /** Externally reachable URL, when the provider exposes one. */
33
+ url?: string;
34
+ }
35
+ export interface ApprovalRequestedPayload {
36
+ approvalId: string;
37
+ title: string;
38
+ /** Free-form detail describing the action awaiting approval. */
39
+ [key: string]: unknown;
40
+ }
41
+ export interface ApprovalResolvedPayload {
42
+ approvalId: string;
43
+ granted: boolean;
44
+ }
45
+ export interface ArtifactCreatedPayload {
46
+ artifactId: string;
47
+ name: string;
48
+ mimeType: string;
49
+ size: number;
50
+ }
51
+ export interface SandboxLifecyclePayload {
52
+ sandboxId: string;
53
+ provider: string;
54
+ }
55
+ /** Maps each well-known name to its payload type. */
56
+ export interface CustomEventPayloads {
57
+ [CUSTOM_EVENT.FILE_CHANGED]: FileChangedPayload;
58
+ [CUSTOM_EVENT.PROCESS_STDOUT]: ProcessOutputPayload;
59
+ [CUSTOM_EVENT.PROCESS_STDERR]: ProcessOutputPayload;
60
+ [CUSTOM_EVENT.PORT_OPENED]: PortOpenedPayload;
61
+ [CUSTOM_EVENT.APPROVAL_REQUESTED]: ApprovalRequestedPayload;
62
+ [CUSTOM_EVENT.APPROVAL_RESOLVED]: ApprovalResolvedPayload;
63
+ [CUSTOM_EVENT.ARTIFACT_CREATED]: ArtifactCreatedPayload;
64
+ [CUSTOM_EVENT.SANDBOX_CREATED]: SandboxLifecyclePayload;
65
+ [CUSTOM_EVENT.SANDBOX_RESUMED]: SandboxLifecyclePayload;
66
+ }
67
+ /** A CUSTOM event narrowed to a specific well-known name and its payload. */
68
+ export type WellKnownCustomEvent<TName extends WellKnownCustomEventName> = CustomEvent & {
69
+ name: TName;
70
+ value: CustomEventPayloads[TName];
71
+ };
72
+ /**
73
+ * Type guard: is `chunk` a CUSTOM event with the given well-known `name`?
74
+ * Narrows the payload type when true, so consumers read `chunk.value` typed.
75
+ */
76
+ export declare function isCustomEvent<TName extends WellKnownCustomEventName>(chunk: StreamChunk, name: TName): chunk is WellKnownCustomEvent<TName>;
@@ -0,0 +1,37 @@
1
+ import { EventType } from "./types.js";
2
+ //#region src/custom-events.ts
3
+ /**
4
+ * Catalog of well-known AG-UI `CUSTOM` event names used by the sandbox/agent
5
+ * layers, plus their payload shapes.
6
+ *
7
+ * The persisted run log is the AG-UI `StreamChunk` stream itself — there is no
8
+ * separate `RunEvent` type. Agent activity that has no first-class AG-UI event
9
+ * (process output, file diffs, ports, approvals, artifacts, sandbox lifecycle)
10
+ * rides on `CUSTOM` events carrying one of these names. Centralizing the names +
11
+ * payloads here keeps emitters (harness adapters, sandbox) and consumers
12
+ * (persistence projections, devtools, diff/terminal panels) in agreement without
13
+ * inventing a parallel event union.
14
+ */
15
+ /** Well-known CUSTOM event names. */
16
+ var CUSTOM_EVENT = {
17
+ FILE_CHANGED: "file.changed",
18
+ PROCESS_STDOUT: "process.stdout",
19
+ PROCESS_STDERR: "process.stderr",
20
+ PORT_OPENED: "port.opened",
21
+ APPROVAL_REQUESTED: "approval.requested",
22
+ APPROVAL_RESOLVED: "approval.resolved",
23
+ ARTIFACT_CREATED: "artifact.created",
24
+ SANDBOX_CREATED: "sandbox.created",
25
+ SANDBOX_RESUMED: "sandbox.resumed"
26
+ };
27
+ /**
28
+ * Type guard: is `chunk` a CUSTOM event with the given well-known `name`?
29
+ * Narrows the payload type when true, so consumers read `chunk.value` typed.
30
+ */
31
+ function isCustomEvent(chunk, name) {
32
+ return chunk.type === EventType.CUSTOM && chunk.name === name;
33
+ }
34
+ //#endregion
35
+ export { CUSTOM_EVENT, isCustomEvent };
36
+
37
+ //# sourceMappingURL=custom-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-events.js","names":[],"sources":["../../src/custom-events.ts"],"sourcesContent":["/**\n * Catalog of well-known AG-UI `CUSTOM` event names used by the sandbox/agent\n * layers, plus their payload shapes.\n *\n * The persisted run log is the AG-UI `StreamChunk` stream itself — there is no\n * separate `RunEvent` type. Agent activity that has no first-class AG-UI event\n * (process output, file diffs, ports, approvals, artifacts, sandbox lifecycle)\n * rides on `CUSTOM` events carrying one of these names. Centralizing the names +\n * payloads here keeps emitters (harness adapters, sandbox) and consumers\n * (persistence projections, devtools, diff/terminal panels) in agreement without\n * inventing a parallel event union.\n */\nimport { EventType } from './types'\nimport type { CustomEvent, StreamChunk } from './types'\n\n/** Well-known CUSTOM event names. */\nexport const CUSTOM_EVENT = {\n FILE_CHANGED: 'file.changed',\n PROCESS_STDOUT: 'process.stdout',\n PROCESS_STDERR: 'process.stderr',\n PORT_OPENED: 'port.opened',\n APPROVAL_REQUESTED: 'approval.requested',\n APPROVAL_RESOLVED: 'approval.resolved',\n ARTIFACT_CREATED: 'artifact.created',\n SANDBOX_CREATED: 'sandbox.created',\n SANDBOX_RESUMED: 'sandbox.resumed',\n} as const\n\n/** Union of the well-known CUSTOM event name literals. */\nexport type WellKnownCustomEventName =\n (typeof CUSTOM_EVENT)[keyof typeof CUSTOM_EVENT]\n\n// ---- Payload shapes ----\n\nexport interface FileChangedPayload {\n type: 'create' | 'change' | 'delete'\n /** Absolute path inside the sandbox (under the workspace root). */\n path: string\n /** Unified diff, when the harness can produce one. */\n diff?: string\n timestamp: number\n}\n\nexport interface ProcessOutputPayload {\n /** Stable id for the spawned process whose output this is. */\n processId: string\n /** A chunk of stdout/stderr text. */\n chunk: string\n}\n\nexport interface PortOpenedPayload {\n port: number\n /** Externally reachable URL, when the provider exposes one. */\n url?: string\n}\n\nexport interface ApprovalRequestedPayload {\n approvalId: string\n title: string\n /** Free-form detail describing the action awaiting approval. */\n [key: string]: unknown\n}\n\nexport interface ApprovalResolvedPayload {\n approvalId: string\n granted: boolean\n}\n\nexport interface ArtifactCreatedPayload {\n artifactId: string\n name: string\n mimeType: string\n size: number\n}\n\nexport interface SandboxLifecyclePayload {\n sandboxId: string\n provider: string\n}\n\n/** Maps each well-known name to its payload type. */\nexport interface CustomEventPayloads {\n [CUSTOM_EVENT.FILE_CHANGED]: FileChangedPayload\n [CUSTOM_EVENT.PROCESS_STDOUT]: ProcessOutputPayload\n [CUSTOM_EVENT.PROCESS_STDERR]: ProcessOutputPayload\n [CUSTOM_EVENT.PORT_OPENED]: PortOpenedPayload\n [CUSTOM_EVENT.APPROVAL_REQUESTED]: ApprovalRequestedPayload\n [CUSTOM_EVENT.APPROVAL_RESOLVED]: ApprovalResolvedPayload\n [CUSTOM_EVENT.ARTIFACT_CREATED]: ArtifactCreatedPayload\n [CUSTOM_EVENT.SANDBOX_CREATED]: SandboxLifecyclePayload\n [CUSTOM_EVENT.SANDBOX_RESUMED]: SandboxLifecyclePayload\n}\n\n/** A CUSTOM event narrowed to a specific well-known name and its payload. */\nexport type WellKnownCustomEvent<TName extends WellKnownCustomEventName> =\n CustomEvent & { name: TName; value: CustomEventPayloads[TName] }\n\n/**\n * Type guard: is `chunk` a CUSTOM event with the given well-known `name`?\n * Narrows the payload type when true, so consumers read `chunk.value` typed.\n */\nexport function isCustomEvent<TName extends WellKnownCustomEventName>(\n chunk: StreamChunk,\n name: TName,\n): chunk is WellKnownCustomEvent<TName> {\n return chunk.type === EventType.CUSTOM && chunk.name === name\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,IAAa,eAAe;CAC1B,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,aAAa;CACb,oBAAoB;CACpB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,iBAAiB;AACnB;;;;;AA2EA,SAAgB,cACd,OACA,MACsC;CACtC,OAAO,MAAM,SAAS,UAAU,UAAU,MAAM,SAAS;AAC3D"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The one-way channel from a chat run to the durable DELIVERY sink that is
3
+ * persisting it.
4
+ *
5
+ * The sink (`durableStreamSource` in `./stream-to-response.ts`) has to answer one
6
+ * question on the abort path: was this disconnect a DETACH — the agent keeps
7
+ * running and a later attach will continue the log — or the end of the run? Only
8
+ * the run's own middleware can answer it (`withSandbox`'s `onAbort` resolves both
9
+ * out-of-band cancel bands and `detachOnDisconnect`), and the sink cannot reach
10
+ * the middleware capability bus: it lives one layer up, in the transport, and is
11
+ * handed nothing but the stream and a durability adapter.
12
+ *
13
+ * So the fact travels on the STREAM ITSELF, keyed by the exact object `chat()`
14
+ * returned. That is the seam an application cannot forget to wire: passing the
15
+ * stream to `toServerSentEventsResponse(stream, { durability })` is already
16
+ * mandatory, and it is the same object both sides hold. The alternative — a
17
+ * `detachable` flag on the response options — has to be re-wired correctly at
18
+ * every durable call site, and a forgotten one silently terminalizes a healthy
19
+ * detached run's log, which is the exact defect this channel exists to fix.
20
+ *
21
+ * The value is a THUNK, not a boolean: the verdict is only known during the run's
22
+ * teardown, long after the response object was built.
23
+ */
24
+ /**
25
+ * Publish `stream`'s detach predicate. Called by `chat()` on the object it hands
26
+ * back, once per stream.
27
+ *
28
+ * Wired on BOTH streaming paths — `runStreamingText` and
29
+ * `runStreamingStructuredOutput` — since either can be handed to a durable
30
+ * transport helper. The non-streaming paths (`stream: false`, and the
31
+ * `Promise<T>` structured-output variant) resolve a value rather than yielding a
32
+ * stream, so there is no delivery sink to inform and nothing to publish.
33
+ *
34
+ * @internal
35
+ */
36
+ export declare function publishRunDetachedSignal(stream: object, wasDetached: () => boolean): void;
37
+ /**
38
+ * Whether the run behind `stream` declared its abort a detach.
39
+ *
40
+ * `false` for anything that never published a predicate — a hand-rolled
41
+ * iterable, a `chat()` from an older build, a non-object source — so an unknown
42
+ * stream keeps the terminalize-and-close behavior rather than being spared it.
43
+ *
44
+ * A throwing predicate is also `false`, for the same reason: this is consulted on
45
+ * a teardown path where the only safe default is to terminalize. Leaving a log
46
+ * open because a probe threw would park every tailer forever.
47
+ *
48
+ * @internal
49
+ */
50
+ export declare function wasRunDetached(stream: unknown): boolean;
@@ -0,0 +1,71 @@
1
+ //#region src/delivery-detach.ts
2
+ /**
3
+ * The one-way channel from a chat run to the durable DELIVERY sink that is
4
+ * persisting it.
5
+ *
6
+ * The sink (`durableStreamSource` in `./stream-to-response.ts`) has to answer one
7
+ * question on the abort path: was this disconnect a DETACH — the agent keeps
8
+ * running and a later attach will continue the log — or the end of the run? Only
9
+ * the run's own middleware can answer it (`withSandbox`'s `onAbort` resolves both
10
+ * out-of-band cancel bands and `detachOnDisconnect`), and the sink cannot reach
11
+ * the middleware capability bus: it lives one layer up, in the transport, and is
12
+ * handed nothing but the stream and a durability adapter.
13
+ *
14
+ * So the fact travels on the STREAM ITSELF, keyed by the exact object `chat()`
15
+ * returned. That is the seam an application cannot forget to wire: passing the
16
+ * stream to `toServerSentEventsResponse(stream, { durability })` is already
17
+ * mandatory, and it is the same object both sides hold. The alternative — a
18
+ * `detachable` flag on the response options — has to be re-wired correctly at
19
+ * every durable call site, and a forgotten one silently terminalizes a healthy
20
+ * detached run's log, which is the exact defect this channel exists to fix.
21
+ *
22
+ * The value is a THUNK, not a boolean: the verdict is only known during the run's
23
+ * teardown, long after the response object was built.
24
+ */
25
+ /**
26
+ * Per-stream detach predicates. Keyed weakly by the stream object, so a stream
27
+ * that is dropped without ever being consumed takes its entry with it.
28
+ */
29
+ var detachSignals = /* @__PURE__ */ new WeakMap();
30
+ /**
31
+ * Publish `stream`'s detach predicate. Called by `chat()` on the object it hands
32
+ * back, once per stream.
33
+ *
34
+ * Wired on BOTH streaming paths — `runStreamingText` and
35
+ * `runStreamingStructuredOutput` — since either can be handed to a durable
36
+ * transport helper. The non-streaming paths (`stream: false`, and the
37
+ * `Promise<T>` structured-output variant) resolve a value rather than yielding a
38
+ * stream, so there is no delivery sink to inform and nothing to publish.
39
+ *
40
+ * @internal
41
+ */
42
+ function publishRunDetachedSignal(stream, wasDetached) {
43
+ detachSignals.set(stream, wasDetached);
44
+ }
45
+ /**
46
+ * Whether the run behind `stream` declared its abort a detach.
47
+ *
48
+ * `false` for anything that never published a predicate — a hand-rolled
49
+ * iterable, a `chat()` from an older build, a non-object source — so an unknown
50
+ * stream keeps the terminalize-and-close behavior rather than being spared it.
51
+ *
52
+ * A throwing predicate is also `false`, for the same reason: this is consulted on
53
+ * a teardown path where the only safe default is to terminalize. Leaving a log
54
+ * open because a probe threw would park every tailer forever.
55
+ *
56
+ * @internal
57
+ */
58
+ function wasRunDetached(stream) {
59
+ if (typeof stream !== "object" || stream === null) return false;
60
+ const signal = detachSignals.get(stream);
61
+ if (signal === void 0) return false;
62
+ try {
63
+ return signal();
64
+ } catch {
65
+ return false;
66
+ }
67
+ }
68
+ //#endregion
69
+ export { publishRunDetachedSignal, wasRunDetached };
70
+
71
+ //# sourceMappingURL=delivery-detach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-detach.js","names":[],"sources":["../../src/delivery-detach.ts"],"sourcesContent":["/**\n * The one-way channel from a chat run to the durable DELIVERY sink that is\n * persisting it.\n *\n * The sink (`durableStreamSource` in `./stream-to-response.ts`) has to answer one\n * question on the abort path: was this disconnect a DETACH — the agent keeps\n * running and a later attach will continue the log — or the end of the run? Only\n * the run's own middleware can answer it (`withSandbox`'s `onAbort` resolves both\n * out-of-band cancel bands and `detachOnDisconnect`), and the sink cannot reach\n * the middleware capability bus: it lives one layer up, in the transport, and is\n * handed nothing but the stream and a durability adapter.\n *\n * So the fact travels on the STREAM ITSELF, keyed by the exact object `chat()`\n * returned. That is the seam an application cannot forget to wire: passing the\n * stream to `toServerSentEventsResponse(stream, { durability })` is already\n * mandatory, and it is the same object both sides hold. The alternative — a\n * `detachable` flag on the response options — has to be re-wired correctly at\n * every durable call site, and a forgotten one silently terminalizes a healthy\n * detached run's log, which is the exact defect this channel exists to fix.\n *\n * The value is a THUNK, not a boolean: the verdict is only known during the run's\n * teardown, long after the response object was built.\n */\n\n/**\n * Per-stream detach predicates. Keyed weakly by the stream object, so a stream\n * that is dropped without ever being consumed takes its entry with it.\n */\nconst detachSignals = new WeakMap<object, () => boolean>()\n\n/**\n * Publish `stream`'s detach predicate. Called by `chat()` on the object it hands\n * back, once per stream.\n *\n * Wired on BOTH streaming paths — `runStreamingText` and\n * `runStreamingStructuredOutput` — since either can be handed to a durable\n * transport helper. The non-streaming paths (`stream: false`, and the\n * `Promise<T>` structured-output variant) resolve a value rather than yielding a\n * stream, so there is no delivery sink to inform and nothing to publish.\n *\n * @internal\n */\nexport function publishRunDetachedSignal(\n stream: object,\n wasDetached: () => boolean,\n): void {\n detachSignals.set(stream, wasDetached)\n}\n\n/**\n * Whether the run behind `stream` declared its abort a detach.\n *\n * `false` for anything that never published a predicate — a hand-rolled\n * iterable, a `chat()` from an older build, a non-object source — so an unknown\n * stream keeps the terminalize-and-close behavior rather than being spared it.\n *\n * A throwing predicate is also `false`, for the same reason: this is consulted on\n * a teardown path where the only safe default is to terminalize. Leaving a log\n * open because a probe threw would park every tailer forever.\n *\n * @internal\n */\nexport function wasRunDetached(stream: unknown): boolean {\n if (typeof stream !== 'object' || stream === null) return false\n const signal = detachSignals.get(stream)\n if (signal === undefined) return false\n try {\n return signal()\n } catch {\n return false\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,IAAM,gCAAgB,IAAI,QAA+B;;;;;;;;;;;;;AAczD,SAAgB,yBACd,QACA,aACM;CACN,cAAc,IAAI,QAAQ,WAAW;AACvC;;;;;;;;;;;;;;AAeA,SAAgB,eAAe,QAA0B;CACvD,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM,OAAO;CAC1D,MAAM,SAAS,cAAc,IAAI,MAAM;CACvC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI;EACF,OAAO,OAAO;CAChB,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * The one-way channel from the durable DELIVERY sink back to the chat run: "your
3
+ * viewer is gone, but you are not."
4
+ *
5
+ * This is the MIRROR of `./delivery-detach.ts`. That module answers a question the
6
+ * sink asks the run (was this abort a detach?); this one delivers a fact the sink
7
+ * learns first and the run cannot observe at all — the response body was
8
+ * cancelled. Both are keyed weakly by the exact stream object `chat()` returned,
9
+ * for the same reason: passing that object to
10
+ * `toServerSentEventsResponse(stream, { durability })` is already mandatory, so it
11
+ * is the one seam an application cannot forget to wire.
12
+ *
13
+ * WHY THE RUN CANNOT JUST WATCH AN ABORT SIGNAL. Before this channel existed, the
14
+ * only way a disconnect reached a run's middleware was for the application to
15
+ * mirror `request.signal` into `chat()`'s `abortController` — which ABORTS THE RUN.
16
+ * For a durable run that is precisely wrong, and wrong in the most expensive
17
+ * direction: `chat()` returns at its `isCancelled()` check immediately after
18
+ * middleware setup, so the harness adapter's `chatStream` is never called and the
19
+ * agent in the freshly-created sandbox is NEVER LAUNCHED. The user re-attaches to
20
+ * an empty log belonging to a run that did nothing, and no takeover can recover it
21
+ * because there is no journal to replay. The application was forced to choose
22
+ * between "the middleware learns about the disconnect" and "the run survives it".
23
+ *
24
+ * So the disconnect travels as a NOTIFICATION rather than a cancellation. The run
25
+ * hands it to whatever subscribed through `RunDisconnectCapability` — bookkeeping
26
+ * only, no teardown — and keeps producing into its still-open durable log, which
27
+ * is exactly what a re-attaching client tails to catch up.
28
+ *
29
+ * DISPATCHED FROM THE TRANSPORT, NOT FROM THE RUN'S UNWINDING. That is what makes
30
+ * it prompt. A run suspended inside a minutes-wide `setup` (cloning a repo into a
31
+ * sandbox) cannot dispatch anything from its own `finally`, because the `finally`
32
+ * is reached only once the generator unwinds — which is what made `detachedSince`
33
+ * land three minutes late instead of immediately.
34
+ */
35
+ /**
36
+ * Publish `stream`'s disconnect handler. Called by `chat()` on the object it hands
37
+ * back, once per stream.
38
+ *
39
+ * Wired on BOTH streaming paths — `runStreamingText` and
40
+ * `runStreamingStructuredOutput` — since either can be handed to a durable
41
+ * transport helper, matching `publishRunDetachedSignal`.
42
+ *
43
+ * @internal
44
+ */
45
+ export declare function publishRunDisconnectHandler(stream: object, onDisconnect: () => void): void;
46
+ /**
47
+ * Tell the run behind `stream` that its delivery socket closed.
48
+ *
49
+ * A NO-OP for anything that never published a handler — a hand-rolled iterable, a
50
+ * `chat()` from an older build, a non-object source — so an unknown stream simply
51
+ * keeps today's behavior.
52
+ *
53
+ * NEVER THROWS and never returns a promise to await. This is called from
54
+ * `ReadableStream.cancel()`, whose rejection would surface as an unhandled error
55
+ * on a path where the consumer has already gone away; and the handler's own work
56
+ * is tracked by the run (which awaits it before finishing), not by this call. A
57
+ * throwing handler is swallowed for the same reason `wasRunDetached` swallows: the
58
+ * disconnect path has no second channel to report on.
59
+ *
60
+ * @internal
61
+ */
62
+ export declare function notifyRunDisconnected(stream: unknown): void;