agents 0.26.0 → 0.27.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 (233) hide show
  1. package/README.md +8 -9
  2. package/dist/{agent-routing-0DR0Tk2v.d.ts → agent-routing-Bhdbvf7s.d.ts} +13 -8
  3. package/dist/agent-routing.d.ts +1 -1
  4. package/dist/agent-tool-types.d.ts +1 -1
  5. package/dist/{agent-tools-YrATZJu2.d.ts → agent-tools-bJZwBMfq.d.ts} +2 -2
  6. package/dist/agent-tools.d.ts +1 -1
  7. package/dist/ai-sdk-OoGkFy3s.js +2444 -0
  8. package/dist/ai-sdk-OoGkFy3s.js.map +1 -0
  9. package/dist/apply-chunks-1FheRb9W.js +99 -0
  10. package/dist/apply-chunks-1FheRb9W.js.map +1 -0
  11. package/dist/broadcast-state-CEyI4uAK.js +69 -0
  12. package/dist/broadcast-state-CEyI4uAK.js.map +1 -0
  13. package/dist/browser/ai-sdk.d.ts +1 -1
  14. package/dist/browser/ai-sdk.js +2 -2
  15. package/dist/browser/ai-sdk.js.map +1 -1
  16. package/dist/browser/index.d.ts +1 -1
  17. package/dist/browser/tanstack-ai.d.ts +1 -1
  18. package/dist/browser/tanstack-ai.js +1 -1
  19. package/dist/{browser-DE3d-RLk.d.ts → browser-tmkcAAI3.d.ts} +2 -2
  20. package/dist/{browser-tool-DuNdlwZ9.d.ts → browser-tool-Bn-nzJQI.d.ts} +3 -3
  21. package/dist/{browser-tool-CQ10e6Kj.js → browser-tool-CBqs6hqa.js} +58 -18
  22. package/dist/browser-tool-CBqs6hqa.js.map +1 -0
  23. package/dist/capability-B4WbF81e.js.map +1 -1
  24. package/dist/{capability-runner-DBAnGr6L.d.ts → capability-runner-O5VbQzqg.d.ts} +9 -1
  25. package/dist/channel-Bak_6zDP.d.ts +333 -0
  26. package/dist/chat/index.d.ts +11 -9
  27. package/dist/chat/index.js +5 -194
  28. package/dist/chat/index.js.map +1 -1
  29. package/dist/chat/react.d.ts +2 -4
  30. package/dist/chat/react.js +3 -1
  31. package/dist/chat/react.js.map +1 -1
  32. package/dist/chat-sdk/index.d.ts +1 -1
  33. package/dist/chat-sdk/index.js +1 -1
  34. package/dist/cli.js +144 -0
  35. package/dist/{client-fyQrLGkD.js → client-1tEQ1Oqz.js} +27 -2
  36. package/dist/{client-fyQrLGkD.js.map → client-1tEQ1Oqz.js.map} +1 -1
  37. package/dist/{client-je3koD9Z.d.ts → client-DS3Dz9l0.d.ts} +2 -2
  38. package/dist/client-tools-aIBO0Fk7.d.ts +53 -0
  39. package/dist/client.d.ts +1 -1
  40. package/dist/conversations-DH0ut_8n.d.ts +192 -0
  41. package/dist/{current-agent-vAk_5JMt.d.ts → current-agent-C07C5o5Y.d.ts} +3 -3
  42. package/dist/daemon-core-Buubj-y1.js +481 -0
  43. package/dist/daemon-core-Buubj-y1.js.map +1 -0
  44. package/dist/daemon-core-CbohVPAu.d.ts +132 -0
  45. package/dist/{do-oauth-client-provider-Tmf1vgKz.d.ts → do-oauth-client-provider-DfsUcpc3.d.ts} +7 -1
  46. package/dist/{durable-object-lifecycle-HhgOMWq9.d.ts → durable-object-lifecycle-DRqp475_.d.ts} +2 -2
  47. package/dist/{channels/email.d.ts → experimental/channels/email/index.d.ts} +25 -12
  48. package/dist/{channels/email.js → experimental/channels/email/index.js} +13 -35
  49. package/dist/experimental/channels/email/index.js.map +1 -0
  50. package/dist/experimental/channels/index.d.ts +270 -0
  51. package/dist/experimental/channels/index.js +1186 -0
  52. package/dist/experimental/channels/index.js.map +1 -0
  53. package/dist/{channels/slack.d.ts → experimental/channels/slack/index.d.ts} +19 -9
  54. package/dist/experimental/channels/slack/index.js +267 -0
  55. package/dist/experimental/channels/slack/index.js.map +1 -0
  56. package/dist/{channels/telegram.d.ts → experimental/channels/telegram/index.d.ts} +19 -9
  57. package/dist/experimental/channels/telegram/index.js +198 -0
  58. package/dist/experimental/channels/telegram/index.js.map +1 -0
  59. package/dist/experimental/channels/web/ai-sdk.d.ts +55 -0
  60. package/dist/experimental/channels/web/ai-sdk.js +266 -0
  61. package/dist/experimental/channels/web/ai-sdk.js.map +1 -0
  62. package/dist/experimental/channels/web/client.d.ts +97 -0
  63. package/dist/experimental/channels/web/client.js +349 -0
  64. package/dist/experimental/channels/web/client.js.map +1 -0
  65. package/dist/experimental/channels/web/index.d.ts +189 -0
  66. package/dist/experimental/channels/web/index.js +332 -0
  67. package/dist/experimental/channels/web/index.js.map +1 -0
  68. package/dist/gateway-BDC07gYO.d.ts +100 -0
  69. package/dist/handle-zAzh0UW2.d.ts +460 -0
  70. package/dist/harness/ai-sdk/index.d.ts +175 -0
  71. package/dist/harness/ai-sdk/index.js +605 -0
  72. package/dist/harness/ai-sdk/index.js.map +1 -0
  73. package/dist/harness/container/daemon/index.d.ts +76 -0
  74. package/dist/harness/container/daemon/index.js +3 -0
  75. package/dist/harness/container/index.d.ts +740 -0
  76. package/dist/harness/container/index.js +2152 -0
  77. package/dist/harness/container/index.js.map +1 -0
  78. package/dist/harness/container/runtime/index.d.ts +144 -0
  79. package/dist/harness/container/runtime/index.js +1082 -0
  80. package/dist/harness/container/runtime/index.js.map +1 -0
  81. package/dist/harness/opencode/index.d.ts +369 -0
  82. package/dist/harness/opencode/index.js +1072 -0
  83. package/dist/harness/opencode/index.js.map +1 -0
  84. package/dist/harness/pi/index.d.ts +2 -1
  85. package/dist/harness/store/index.d.ts +24 -0
  86. package/dist/harness/store/index.js +2 -0
  87. package/dist/harness/think/index.d.ts +821 -0
  88. package/dist/harness/think/index.js +2529 -0
  89. package/dist/harness/think/index.js.map +1 -0
  90. package/dist/harness-B6B9S3rb.d.ts +203 -0
  91. package/dist/{images-iiTDSyRu.js → images-Ce9SCu3X.js} +2 -248
  92. package/dist/images-Ce9SCu3X.js.map +1 -0
  93. package/dist/{index-BreL0YrQ.d.ts → index-D0A5tbWu.d.ts} +2 -2
  94. package/dist/index-Ib_4dwOo.d.ts +200 -0
  95. package/dist/index.d.ts +5 -5
  96. package/dist/index.js +2 -2
  97. package/dist/ingress-EFbrS547.js +9 -0
  98. package/dist/ingress-EFbrS547.js.map +1 -0
  99. package/dist/input-schema-DNrpTu49.js +23 -0
  100. package/dist/input-schema-DNrpTu49.js.map +1 -0
  101. package/dist/internal-kmw70xwR.js +46 -0
  102. package/dist/internal-kmw70xwR.js.map +1 -0
  103. package/dist/internal_context.d.ts +1 -1
  104. package/dist/lifecycle/index.d.ts +3 -3
  105. package/dist/mcp/client/do-oauth-client-provider.d.ts +1 -1
  106. package/dist/mcp/client/do-oauth-client-provider.js +9 -0
  107. package/dist/mcp/client/do-oauth-client-provider.js.map +1 -1
  108. package/dist/mcp/client/index.d.ts +1 -1
  109. package/dist/mcp/client/index.js +1 -1
  110. package/dist/mcp/client/x402.d.ts +35 -4
  111. package/dist/mcp/client/x402.js +24 -3
  112. package/dist/mcp/client/x402.js.map +1 -1
  113. package/dist/mcp/index.d.ts +1 -1
  114. package/dist/mcp/index.js +2 -2
  115. package/dist/models/ai-sdk/index.d.ts +16 -14
  116. package/dist/models/ai-sdk/index.js +1 -2442
  117. package/dist/models/opencode/index.d.ts +65 -0
  118. package/dist/models/opencode/index.js +285 -0
  119. package/dist/models/opencode/index.js.map +1 -0
  120. package/dist/models/pi-ai/index.d.ts +9 -7
  121. package/dist/models/pi-ai/index.js +2 -1
  122. package/dist/models/pi-ai/index.js.map +1 -1
  123. package/dist/options-pwTNq9z6.d.ts +134 -0
  124. package/dist/protocol-BEgrJYC5.d.ts +331 -0
  125. package/dist/protocol-CukuI73M.d.ts +386 -0
  126. package/dist/protocol-cOklVBBD.js +227 -0
  127. package/dist/protocol-cOklVBBD.js.map +1 -0
  128. package/dist/{protocol-kHsr-f0X.js → protocol-eXeJxhgu.js} +2 -67
  129. package/dist/protocol-eXeJxhgu.js.map +1 -0
  130. package/dist/protocol-y2sSY584.js +148 -0
  131. package/dist/protocol-y2sSY584.js.map +1 -0
  132. package/dist/queue/index.d.ts +1 -1
  133. package/dist/react.d.ts +2 -2
  134. package/dist/routing/index.d.ts +2 -2
  135. package/dist/{scheduler-RdACNXDP.d.ts → scheduler-CrFCnv_J.d.ts} +2 -2
  136. package/dist/schedules/index.d.ts +1 -1
  137. package/dist/serializable.d.ts +1 -1
  138. package/dist/sessions/index.d.ts +11 -434
  139. package/dist/sessions/index.js +1 -2271
  140. package/dist/sessions-B9pNuxdT.js +2272 -0
  141. package/dist/sessions-B9pNuxdT.js.map +1 -0
  142. package/dist/settings-C45hDliX.js +253 -0
  143. package/dist/settings-C45hDliX.js.map +1 -0
  144. package/dist/{transport-PfFnt-Ld.d.ts → settings-NgGwF7Qt.d.ts} +14 -208
  145. package/dist/{src-BZeu-SCD.js → src-DgCbZtIR.js} +4 -4
  146. package/dist/{src-BZeu-SCD.js.map → src-DgCbZtIR.js.map} +1 -1
  147. package/dist/stall-watchdog-BpRF2uwG.js +195 -0
  148. package/dist/stall-watchdog-BpRF2uwG.js.map +1 -0
  149. package/dist/state/index.d.ts +1 -1
  150. package/dist/store-DLeqKuj3.d.ts +310 -0
  151. package/dist/store-vgcPYo8K.js +432 -0
  152. package/dist/store-vgcPYo8K.js.map +1 -0
  153. package/dist/streams/index.d.ts +1 -1
  154. package/dist/streams/index.js +1 -1
  155. package/dist/{streams-DW-UCOUc.js → streams-CITClVer.js} +16 -3
  156. package/dist/streams-CITClVer.js.map +1 -0
  157. package/dist/{streams-Cmkj9QfW.d.ts → streams-fbG61qM8.d.ts} +2 -2
  158. package/dist/sub-routing.d.ts +1 -1
  159. package/dist/tasks/index.d.ts +1 -1
  160. package/dist/tasks/index.js +1 -1
  161. package/dist/{tasks-68DESxf0.js → tasks-CkTZNaV1.js} +2 -1
  162. package/dist/tasks-CkTZNaV1.js.map +1 -0
  163. package/dist/{tasks-9YxYtByh.d.ts → tasks-PtlB4Uyn.d.ts} +2 -2
  164. package/dist/tool-3PA8xjB_.js +421 -0
  165. package/dist/tool-3PA8xjB_.js.map +1 -0
  166. package/dist/tool-BPJEbwaX.d.ts +278 -0
  167. package/dist/transport-k2mFrtL8.d.ts +200 -0
  168. package/dist/turns-DCV3ycDl.js +317 -0
  169. package/dist/turns-DCV3ycDl.js.map +1 -0
  170. package/dist/voice/client.js +1 -1
  171. package/dist/voice/index.d.ts +2 -2
  172. package/dist/voice/index.js +1 -1
  173. package/dist/websearch/index.d.ts +58 -0
  174. package/dist/websearch/index.js +2 -0
  175. package/dist/websearch/tools/ai-sdk.d.ts +77 -0
  176. package/dist/websearch/tools/ai-sdk.js +46 -0
  177. package/dist/websearch/tools/ai-sdk.js.map +1 -0
  178. package/dist/websearch/tools/pi.d.ts +82 -0
  179. package/dist/websearch/tools/pi.js +89 -0
  180. package/dist/websearch/tools/pi.js.map +1 -0
  181. package/dist/websearch/tools/tanstack-ai.d.ts +71 -0
  182. package/dist/websearch/tools/tanstack-ai.js +46 -0
  183. package/dist/websearch/tools/tanstack-ai.js.map +1 -0
  184. package/dist/websockets/index.d.ts +12 -296
  185. package/dist/websockets/index.js +1 -1
  186. package/dist/{websockets-Ci-LZFHH.js → websockets-CmENGb-Z.js} +18 -4
  187. package/dist/websockets-CmENGb-Z.js.map +1 -0
  188. package/dist/{wire-types-CrjKvDyi.d.ts → wire-types-Cv0iwjk5.d.ts} +3 -51
  189. package/dist/workflow-types.d.ts +1 -1
  190. package/dist/workflows.d.ts +1 -1
  191. package/dist/workflows.js +1 -1
  192. package/docs/browse-the-web.md +3 -0
  193. package/docs/harnesses/think.md +215 -0
  194. package/docs/index.md +2 -1
  195. package/docs/lifecycle.md +40 -0
  196. package/docs/search-the-web.md +133 -0
  197. package/package.json +117 -38
  198. package/dist/browser-tool-CQ10e6Kj.js.map +0 -1
  199. package/dist/channel-Bnm4S7T2.d.ts +0 -491
  200. package/dist/channels/ai-sdk.d.ts +0 -46
  201. package/dist/channels/ai-sdk.js +0 -120
  202. package/dist/channels/ai-sdk.js.map +0 -1
  203. package/dist/channels/email.js.map +0 -1
  204. package/dist/channels/index.d.ts +0 -233
  205. package/dist/channels/index.js +0 -608
  206. package/dist/channels/index.js.map +0 -1
  207. package/dist/channels/slack.js +0 -614
  208. package/dist/channels/slack.js.map +0 -1
  209. package/dist/channels/tanstack-ai.d.ts +0 -39
  210. package/dist/channels/tanstack-ai.js +0 -17
  211. package/dist/channels/tanstack-ai.js.map +0 -1
  212. package/dist/channels/telegram.js +0 -427
  213. package/dist/channels/telegram.js.map +0 -1
  214. package/dist/channels/voice.d.ts +0 -45
  215. package/dist/channels/voice.js +0 -122
  216. package/dist/channels/voice.js.map +0 -1
  217. package/dist/images-iiTDSyRu.js.map +0 -1
  218. package/dist/index-BB0kqhIz.d.ts +0 -101
  219. package/dist/ingress-BfetZbMO.js +0 -83
  220. package/dist/ingress-BfetZbMO.js.map +0 -1
  221. package/dist/internal-CYlgHl1l.js +0 -59
  222. package/dist/internal-CYlgHl1l.js.map +0 -1
  223. package/dist/models/ai-sdk/index.js.map +0 -1
  224. package/dist/protocol-kHsr-f0X.js.map +0 -1
  225. package/dist/sessions/index.js.map +0 -1
  226. package/dist/streams-DW-UCOUc.js.map +0 -1
  227. package/dist/surface-bZZJqBka.js +0 -17
  228. package/dist/surface-bZZJqBka.js.map +0 -1
  229. package/dist/tasks-68DESxf0.js.map +0 -1
  230. package/dist/tool-schema-CBjGPrsQ.js +0 -31
  231. package/dist/tool-schema-CBjGPrsQ.js.map +0 -1
  232. package/dist/websockets-Ci-LZFHH.js.map +0 -1
  233. package/docs/channels.md +0 -323
@@ -138,71 +138,6 @@ var StreamAccumulator = class {
138
138
  }
139
139
  };
140
140
  //#endregion
141
- //#region src/chat/broadcast-state.ts
142
- function textOf(parts) {
143
- let text = "";
144
- for (const part of parts) if (part.type === "text") text += part.text;
145
- return text;
146
- }
147
- /**
148
- * Whether `messages` already holds a copy of the observed message whose text
149
- * the accumulator does not extend. A healthy live accumulator is always the
150
- * stored copy plus more; one that diverges holds interleaved or duplicated
151
- * chunks (#2166), so the stored copy must win or the corruption never heals.
152
- */
153
- function observedDivergesFrom(accumulator, messages) {
154
- const existing = messages.find((m) => m.id === accumulator.messageId);
155
- if (!existing) return false;
156
- return !textOf(accumulator.parts).startsWith(textOf(existing.parts));
157
- }
158
- function transition(state, event) {
159
- switch (event.type) {
160
- case "clear": return {
161
- state: { status: "idle" },
162
- isStreaming: false
163
- };
164
- case "resume-fallback": {
165
- const accumulator = new StreamAccumulator({ messageId: event.messageId });
166
- return {
167
- state: {
168
- status: "observing",
169
- streamId: event.streamId,
170
- accumulator
171
- },
172
- isStreaming: true
173
- };
174
- }
175
- case "response": {
176
- let accumulator;
177
- const isReplayedStart = event.replay === true && event.chunkData?.type === "start";
178
- if (state.status === "idle" || state.streamId !== event.streamId || isReplayedStart) accumulator = new StreamAccumulator({
179
- messageId: event.messageId,
180
- continuation: event.continuation
181
- });
182
- else accumulator = state.accumulator;
183
- if (event.chunkData) accumulator.applyChunk(event.chunkData);
184
- let messagesUpdate;
185
- const mergeUnlessDiverged = (prev) => observedDivergesFrom(accumulator, prev) ? prev : accumulator.mergeInto(prev);
186
- if (event.done) return {
187
- state: { status: "idle" },
188
- messagesUpdate: mergeUnlessDiverged,
189
- isStreaming: false
190
- };
191
- if (event.chunkData && !event.replay) messagesUpdate = mergeUnlessDiverged;
192
- else if (event.replayComplete) messagesUpdate = (prev) => accumulator.mergeInto(prev);
193
- return {
194
- state: {
195
- status: "observing",
196
- streamId: event.streamId,
197
- accumulator
198
- },
199
- messagesUpdate,
200
- isStreaming: true
201
- };
202
- }
203
- }
204
- }
205
- //#endregion
206
141
  //#region src/chat/protocol.ts
207
142
  /**
208
143
  * Wire protocol message type constants for the cf_agent_chat_* protocol.
@@ -234,6 +169,6 @@ const CHAT_MESSAGE_TYPES = {
234
169
  CHAT_RECOVERING: "cf_agent_chat_recovering"
235
170
  };
236
171
  //#endregion
237
- export { StreamAccumulator as a, transition as i, STREAM_RESUME_NONE_REASONS as n, observedDivergesFrom as r, CHAT_MESSAGE_TYPES as t };
172
+ export { STREAM_RESUME_NONE_REASONS as n, StreamAccumulator as r, CHAT_MESSAGE_TYPES as t };
238
173
 
239
- //# sourceMappingURL=protocol-kHsr-f0X.js.map
174
+ //# sourceMappingURL=protocol-eXeJxhgu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-eXeJxhgu.js","names":[],"sources":["../src/chat/stream-accumulator.ts","../src/chat/protocol.ts"],"sourcesContent":["/**\n * StreamAccumulator — unified chunk-to-message builder.\n *\n * Used by @cloudflare/ai-chat (server + client) and @cloudflare/think\n * to incrementally build a UIMessage from stream chunks. Wraps\n * applyChunkToParts and handles the metadata chunk types (start, finish,\n * message-metadata, error) that applyChunkToParts does not cover.\n *\n * The accumulator signals domain-specific concerns (early persistence,\n * cross-message tool updates) via ChunkAction returns — callers handle\n * these according to their context.\n */\n\nimport type { UIMessage } from \"ai\";\nimport { applyChunkToParts, type StreamChunkData } from \"./message-builder\";\n\nfunction asMetadata(value: unknown): Record<string, unknown> | undefined {\n if (value != null && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return undefined;\n}\n\nexport interface StreamAccumulatorOptions {\n messageId: string;\n /** Whether chunks continue the current assistant message when merged. */\n continuation?: boolean;\n /** Eager seed; omitted continuations seed from the messages passed to `mergeInto`. */\n existingParts?: UIMessage[\"parts\"];\n existingMetadata?: Record<string, unknown>;\n}\n\nexport type ChunkAction =\n | {\n type: \"start\";\n messageId?: string;\n metadata?: Record<string, unknown>;\n }\n | {\n type: \"finish\";\n finishReason?: string;\n metadata?: Record<string, unknown>;\n }\n | { type: \"message-metadata\"; metadata: Record<string, unknown> }\n | { type: \"tool-approval-request\"; toolCallId: string }\n | {\n type: \"cross-message-tool-update\";\n updateType: \"output-available\" | \"output-error\";\n toolCallId: string;\n output?: unknown;\n errorText?: string;\n preliminary?: boolean;\n }\n | { type: \"error\"; error: string };\n\nexport interface ChunkResult {\n handled: boolean;\n action?: ChunkAction;\n}\n\nexport class StreamAccumulator {\n messageId: string;\n readonly parts: UIMessage[\"parts\"];\n metadata?: Record<string, unknown>;\n private _isContinuation: boolean;\n // Continuation chunks wait here until mergeInto can seed from current state.\n private _pendingContinuationChunks: StreamChunkData[] | null;\n\n constructor(options: StreamAccumulatorOptions) {\n this.messageId = options.messageId;\n this._isContinuation = options.continuation ?? false;\n this.parts = options.existingParts ? [...options.existingParts] : [];\n this.metadata = options.existingMetadata\n ? { ...options.existingMetadata }\n : undefined;\n this._pendingContinuationChunks =\n this._isContinuation &&\n options.existingParts === undefined &&\n options.existingMetadata === undefined\n ? []\n : null;\n }\n\n applyChunk(chunk: StreamChunkData): ChunkResult {\n this._pendingContinuationChunks?.push(chunk);\n const handled = applyChunkToParts(this.parts, chunk);\n\n // Detect tool-approval-request for early persistence signaling\n if (chunk.type === \"tool-approval-request\" && chunk.toolCallId) {\n return {\n handled,\n action: { type: \"tool-approval-request\", toolCallId: chunk.toolCallId }\n };\n }\n\n // Detect cross-message tool output/error: applyChunkToParts returns true\n // for recognized types but silently does nothing when the toolCallId\n // doesn't exist in the current parts array.\n if (\n (chunk.type === \"tool-output-available\" ||\n chunk.type === \"tool-output-error\") &&\n chunk.toolCallId\n ) {\n const foundInParts = this.parts.some(\n (p) => \"toolCallId\" in p && p.toolCallId === chunk.toolCallId\n );\n if (!foundInParts) {\n return {\n handled,\n action: {\n type: \"cross-message-tool-update\",\n updateType:\n chunk.type === \"tool-output-available\"\n ? \"output-available\"\n : \"output-error\",\n toolCallId: chunk.toolCallId,\n output: chunk.output,\n errorText: chunk.errorText,\n preliminary: chunk.preliminary\n }\n };\n }\n }\n\n if (!handled) {\n switch (chunk.type) {\n case \"start\": {\n if (chunk.messageId != null && !this._isContinuation) {\n this.messageId = chunk.messageId;\n }\n const startMeta = asMetadata(chunk.messageMetadata);\n if (startMeta) {\n this.metadata = this.metadata\n ? { ...this.metadata, ...startMeta }\n : { ...startMeta };\n }\n return {\n handled: true,\n action: {\n type: \"start\",\n messageId: chunk.messageId,\n metadata: startMeta\n }\n };\n }\n case \"finish\": {\n const finishMeta = asMetadata(chunk.messageMetadata);\n if (finishMeta) {\n this.metadata = this.metadata\n ? { ...this.metadata, ...finishMeta }\n : { ...finishMeta };\n }\n const finishReason =\n \"finishReason\" in chunk\n ? (chunk.finishReason as string)\n : undefined;\n return {\n handled: true,\n action: {\n type: \"finish\",\n finishReason,\n metadata: finishMeta\n }\n };\n }\n case \"message-metadata\": {\n const msgMeta = asMetadata(chunk.messageMetadata);\n if (msgMeta) {\n this.metadata = this.metadata\n ? { ...this.metadata, ...msgMeta }\n : { ...msgMeta };\n }\n return {\n handled: true,\n action: {\n type: \"message-metadata\",\n metadata: msgMeta ?? {}\n }\n };\n }\n case \"finish-step\": {\n return { handled: true };\n }\n case \"error\": {\n return {\n handled: true,\n action: {\n type: \"error\",\n error: chunk.errorText ?? JSON.stringify(chunk)\n }\n };\n }\n }\n }\n\n return { handled };\n }\n\n /** Snapshot the current state as a UIMessage. */\n toMessage(): UIMessage {\n return {\n id: this.messageId,\n role: \"assistant\",\n parts: [...this.parts],\n ...(this.metadata != null && { metadata: this.metadata })\n } as UIMessage;\n }\n\n /**\n * Merge this accumulator's message into an existing message array.\n * Handles continuation (walk backward for last assistant), replacement\n * (update existing by messageId), or append (new message). An unseeded\n * continuation adopts current parts here before applying its queued chunks.\n */\n mergeInto(messages: UIMessage[]): UIMessage[] {\n let existingIdx = messages.findIndex((m) => m.id === this.messageId);\n\n if (existingIdx < 0 && this._isContinuation) {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"assistant\") {\n existingIdx = i;\n break;\n }\n }\n }\n\n if (this._pendingContinuationChunks !== null) {\n const pendingChunks = this._pendingContinuationChunks;\n this._pendingContinuationChunks = null;\n this.parts.splice(\n 0,\n this.parts.length,\n ...(existingIdx >= 0 ? messages[existingIdx].parts : [])\n );\n const currentMetadata =\n existingIdx >= 0\n ? asMetadata(messages[existingIdx].metadata)\n : undefined;\n this.metadata = currentMetadata ? { ...currentMetadata } : undefined;\n if (existingIdx >= 0) {\n this.messageId = messages[existingIdx].id;\n }\n for (const chunk of pendingChunks) {\n this.applyChunk(chunk);\n }\n }\n\n const messageId =\n existingIdx >= 0 ? messages[existingIdx].id : this.messageId;\n\n const partialMessage: UIMessage = {\n id: messageId,\n role: \"assistant\",\n parts: [...this.parts],\n ...(this.metadata != null && { metadata: this.metadata })\n } as UIMessage;\n\n if (existingIdx >= 0) {\n const updated = [...messages];\n updated[existingIdx] = partialMessage;\n return updated;\n }\n return [...messages, partialMessage];\n }\n}\n","/**\n * Wire protocol message type constants for the cf_agent_chat_* protocol.\n *\n * These are the string values used on the wire between agent servers and\n * clients. Both @cloudflare/ai-chat (via its MessageType enum) and\n * @cloudflare/think use these values.\n */\nexport const STREAM_RESUME_NONE_REASONS = {\n /** No active, pending, or terminal stream exists for this agent. */\n IDLE: \"idle\",\n /** An active tool continuation is owned by another live connection. */\n CONTINUATION_OWNED: \"continuation-owned\"\n} as const;\n\nexport type StreamResumeNoneReason =\n (typeof STREAM_RESUME_NONE_REASONS)[keyof typeof STREAM_RESUME_NONE_REASONS];\n\nexport const CHAT_MESSAGE_TYPES = {\n CHAT_MESSAGES: \"cf_agent_chat_messages\",\n USE_CHAT_REQUEST: \"cf_agent_use_chat_request\",\n USE_CHAT_RESPONSE: \"cf_agent_use_chat_response\",\n CHAT_CLEAR: \"cf_agent_chat_clear\",\n CHAT_REQUEST_CANCEL: \"cf_agent_chat_request_cancel\",\n STREAM_RESUMING: \"cf_agent_stream_resuming\",\n STREAM_RESUME_ACK: \"cf_agent_stream_resume_ack\",\n STREAM_RESUME_REQUEST: \"cf_agent_stream_resume_request\",\n STREAM_RESUME_NONE: \"cf_agent_stream_resume_none\",\n // Server→client: a turn has been accepted but its resumable stream has not\n // started yet (queued, debouncing, waiting on MCP setup, or running async\n // work in `onChatMessage`). Sent in response to a resume request (or on\n // connect) so a reconnecting/re-mounting client keeps its expectation instead\n // of resolving its resume probe to \"no stream\" and then false-timing-out the\n // turn. Resolved by a later `STREAM_RESUMING` (stream started) or\n // `STREAM_RESUME_NONE` (turn settled without streaming). Backward-compatible —\n // clients that don't understand it ignore it. See issue #1784.\n STREAM_PENDING: \"cf_agent_stream_pending\",\n TOOL_RESULT: \"cf_agent_tool_result\",\n TOOL_APPROVAL: \"cf_agent_tool_approval\",\n MESSAGE_UPDATED: \"cf_agent_message_updated\",\n // Server→client: a durable chat turn is being recovered (interrupted by a\n // deploy/eviction or a stream-stall watchdog abort and now resuming). Sent\n // when a recovery continuation is scheduled and cleared on every terminal\n // outcome; `@cloudflare/think` also replays it on connect so a client that\n // joins mid-recovery learns it. Purely a progress hint — backward-compatible\n // (clients that don't understand it ignore it). See issue #1620.\n CHAT_RECOVERING: \"cf_agent_chat_recovering\"\n} as const;\n"],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ //#region src/experimental/channels/web/protocol.ts
2
+ /**
3
+ * The header carrying a connection's WebIdentity from the gateway to the
4
+ * agent. The gateway always sets it, so a client cannot supply its own; an
5
+ * agent must not take WebSocket upgrades from any other route.
6
+ */
7
+ const WEB_IDENTITY_HEADER = "x-channels-identity";
8
+ /**
9
+ * Parse a text frame. Returns undefined for anything that is not a Channels
10
+ * frame, so the socket's other protocols keep working.
11
+ */
12
+ function parseClientFrame(text) {
13
+ let frame;
14
+ try {
15
+ frame = JSON.parse(text);
16
+ } catch {
17
+ return;
18
+ }
19
+ if (!isObject(frame) || typeof frame.type !== "string") return void 0;
20
+ if (frame.type === "channels:subscribe") {
21
+ const { responseId, from } = frame;
22
+ if (typeof responseId !== "string") return { invalid: "responseId" };
23
+ if (from !== void 0 && !Number.isInteger(from)) return { invalid: "from" };
24
+ return {
25
+ type: "channels:subscribe",
26
+ responseId,
27
+ ...typeof from === "number" && { from }
28
+ };
29
+ }
30
+ if (frame.type === "channels:list-conversations") return isId(frame.requestId) ? {
31
+ type: "channels:list-conversations",
32
+ requestId: frame.requestId
33
+ } : { invalid: "requestId" };
34
+ if (frame.type !== "channels:event") return void 0;
35
+ const event = frame.event;
36
+ const eventId = isObject(event) ? event.eventId : void 0;
37
+ if (!isObject(event) || !isId(eventId)) return { invalid: "eventId" };
38
+ const parsed = parseEvent(event, eventId);
39
+ return typeof parsed === "string" ? {
40
+ invalid: parsed,
41
+ eventId
42
+ } : {
43
+ type: "channels:event",
44
+ event: parsed
45
+ };
46
+ }
47
+ function isObject(value) {
48
+ return typeof value === "object" && value !== null && !Array.isArray(value);
49
+ }
50
+ function isId(value) {
51
+ return typeof value === "string" && value.length > 0;
52
+ }
53
+ /** The event, or the name of the first invalid field. */
54
+ function parseEvent(event, eventId) {
55
+ switch (event.type) {
56
+ case "message": {
57
+ const message = event.message;
58
+ if (!isObject(message) || !isId(message.id)) return "message.id";
59
+ if (message.role !== "user") return "message.role";
60
+ const parts = message.parts;
61
+ if (!Array.isArray(parts) || !parts.every(isPart)) return "message.parts";
62
+ return {
63
+ type: "message",
64
+ eventId,
65
+ message: {
66
+ id: message.id,
67
+ role: "user",
68
+ parts,
69
+ ...isObject(message.metadata) && { metadata: message.metadata }
70
+ },
71
+ ...clientTools(event.clientTools)
72
+ };
73
+ }
74
+ case "tool-result": {
75
+ const { turnId, toolCallId, result } = event;
76
+ if (!isId(turnId)) return "turnId";
77
+ if (!isId(toolCallId)) return "toolCallId";
78
+ if (!isObject(result) || typeof result.ok !== "boolean") return "result";
79
+ return {
80
+ type: "tool-result",
81
+ eventId,
82
+ turnId,
83
+ toolCallId,
84
+ result: result.ok ? {
85
+ ok: true,
86
+ output: result.output ?? null
87
+ } : {
88
+ ok: false,
89
+ ...typeof result.errorText === "string" && { errorText: result.errorText }
90
+ },
91
+ ...clientTools(event.clientTools)
92
+ };
93
+ }
94
+ case "approval-response": {
95
+ const { turnId, approvalId, approved, reason } = event;
96
+ if (!isId(turnId)) return "turnId";
97
+ if (!isId(approvalId)) return "approvalId";
98
+ if (typeof approved !== "boolean") return "approved";
99
+ return {
100
+ type: "approval-response",
101
+ eventId,
102
+ turnId,
103
+ approvalId,
104
+ approved,
105
+ ...typeof reason === "string" && { reason }
106
+ };
107
+ }
108
+ case "cancel": return isId(event.turnId) ? {
109
+ type: "cancel",
110
+ eventId,
111
+ turnId: event.turnId
112
+ } : "turnId";
113
+ case "conversation-create":
114
+ case "conversation-fork": return {
115
+ type: event.type,
116
+ eventId
117
+ };
118
+ case "conversation-reset":
119
+ if (event.handoff !== void 0 && typeof event.handoff !== "string") return "handoff";
120
+ return {
121
+ type: "conversation-reset",
122
+ eventId,
123
+ ...event.handoff && { handoff: event.handoff }
124
+ };
125
+ default: return "type";
126
+ }
127
+ }
128
+ function isPart(part) {
129
+ return isObject(part) && typeof part.type === "string";
130
+ }
131
+ /** Keeps tools with a name, dropping a schema that is not an object. */
132
+ function clientTools(value) {
133
+ if (!Array.isArray(value)) return {};
134
+ const tools = [];
135
+ for (const tool of value) {
136
+ if (!isObject(tool) || !isId(tool.name)) continue;
137
+ tools.push({
138
+ name: tool.name,
139
+ ...typeof tool.description === "string" && { description: tool.description },
140
+ ...isObject(tool.inputSchema) && { inputSchema: tool.inputSchema }
141
+ });
142
+ }
143
+ return { clientTools: tools };
144
+ }
145
+ //#endregion
146
+ export { parseClientFrame as n, WEB_IDENTITY_HEADER as t };
147
+
148
+ //# sourceMappingURL=protocol-y2sSY584.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-y2sSY584.js","names":[],"sources":["../src/experimental/channels/web/protocol.ts"],"sourcesContent":["import type {\n ClientTool,\n ConversationInfo,\n ConversationOperation,\n ConversationSnapshot,\n InboundEvent,\n Json,\n JsonObject,\n Participant,\n ResponseChunk,\n TranscriptMessage,\n TurnStatus\n} from \"../protocol\";\n\n/** Who a connection is: set by the gateway, read by the Web Channel. */\nexport type WebIdentity = {\n /** The route that picked the agent. */\n route: string;\n /** The conversation to follow. Default: the agent's default for the route. */\n conversationId?: string;\n participant: Participant;\n};\n\n/**\n * The header carrying a connection's WebIdentity from the gateway to the\n * agent. The gateway always sets it, so a client cannot supply its own; an\n * agent must not take WebSocket upgrades from any other route.\n */\nexport const WEB_IDENTITY_HEADER = \"x-channels-identity\";\n\n// Frames between Channels and a connected client. Each connection follows\n// one conversation at a time, and every server frame names it, so a client\n// can drop frames for a conversation it no longer follows. Payloads are the\n// shared protocol types, unchanged.\n\nexport type ClientFrame =\n | { type: \"channels:event\"; event: InboundEvent }\n | { type: \"channels:subscribe\"; responseId: string; from?: number }\n /** Ask for the agent's conversations; answered by `channels:conversations`. */\n | { type: \"channels:list-conversations\"; requestId: string };\n\nexport type ServerFrame = { conversationId: string } &\n /**\n * On connect, after a reset (empty), and when the connection follows\n * another conversation. `you` is this connection's participant;\n * `operations` are the conversation operations it may send.\n */\n (\n | ({\n type: \"channels:snapshot\";\n you: Participant;\n operations: ConversationOperation[];\n } & ConversationSnapshot)\n | { type: \"channels:turn\"; turn: TurnStatus }\n /** Upserts by id; an unknown id appends. */\n | { type: \"channels:messages\"; messages: TranscriptMessage[] }\n | {\n type: \"channels:chunks\";\n responseId: string;\n /** Seq of the first chunk. */\n from: number;\n chunks: ResponseChunk[];\n }\n /** Everything before this was replay; what follows is live. */\n | { type: \"channels:caught-up\"; responseId: string; cursor: number }\n | {\n type: \"channels:end\";\n responseId: string;\n state: \"ended\" | \"interrupted\" | \"not-found\";\n }\n /**\n * The agent's conversations: the answer to a list request, carrying its\n * `requestId`, or pushed when one is created or forked.\n */\n | {\n type: \"channels:conversations\";\n requestId?: string;\n conversations?: ConversationInfo[];\n error?: string;\n }\n /** `conversationId` is the one a create or fork started, when it did. */\n | { type: \"channels:ack\"; eventId: string; error?: string }\n );\n\n/** A frame that names a Channels type but is malformed. */\nexport type InvalidClientFrame = { invalid: string; eventId?: string };\n\n/**\n * Parse a text frame. Returns undefined for anything that is not a Channels\n * frame, so the socket's other protocols keep working.\n */\nexport function parseClientFrame(\n text: string\n): ClientFrame | InvalidClientFrame | undefined {\n let frame: unknown;\n try {\n frame = JSON.parse(text);\n } catch {\n return undefined;\n }\n if (!isObject(frame) || typeof frame.type !== \"string\") return undefined;\n if (frame.type === \"channels:subscribe\") {\n const { responseId, from } = frame;\n if (typeof responseId !== \"string\") return { invalid: \"responseId\" };\n if (from !== undefined && !Number.isInteger(from)) {\n return { invalid: \"from\" };\n }\n return {\n type: \"channels:subscribe\",\n responseId,\n ...(typeof from === \"number\" && { from })\n };\n }\n if (frame.type === \"channels:list-conversations\") {\n return isId(frame.requestId)\n ? { type: \"channels:list-conversations\", requestId: frame.requestId }\n : { invalid: \"requestId\" };\n }\n if (frame.type !== \"channels:event\") return undefined;\n const event = frame.event;\n const eventId = isObject(event) ? event.eventId : undefined;\n if (!isObject(event) || !isId(eventId)) return { invalid: \"eventId\" };\n const parsed = parseEvent(event, eventId);\n return typeof parsed === \"string\"\n ? { invalid: parsed, eventId }\n : { type: \"channels:event\", event: parsed };\n}\n\ntype JsonRecord = { readonly [key: string]: Json | undefined };\n\n// Parsed JSON is JSON, so narrowing to an object is enough to read it.\nfunction isObject(value: unknown): value is JsonRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isId(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/** The event, or the name of the first invalid field. */\nfunction parseEvent(event: JsonRecord, eventId: string): InboundEvent | string {\n switch (event.type) {\n case \"message\": {\n const message = event.message;\n if (!isObject(message) || !isId(message.id)) return \"message.id\";\n if (message.role !== \"user\") return \"message.role\";\n const parts = message.parts;\n if (!Array.isArray(parts) || !parts.every(isPart)) return \"message.parts\";\n return {\n type: \"message\",\n eventId,\n message: {\n id: message.id,\n role: \"user\",\n // SAFETY: each part is an object with a string type; the agent\n // decides which part types it accepts.\n parts: parts as unknown as TranscriptMessage[\"parts\"],\n ...(isObject(message.metadata) && {\n metadata: message.metadata as JsonObject\n })\n },\n ...clientTools(event.clientTools)\n };\n }\n case \"tool-result\": {\n const { turnId, toolCallId, result } = event;\n if (!isId(turnId)) return \"turnId\";\n if (!isId(toolCallId)) return \"toolCallId\";\n if (!isObject(result) || typeof result.ok !== \"boolean\") return \"result\";\n return {\n type: \"tool-result\",\n eventId,\n turnId,\n toolCallId,\n result: result.ok\n ? { ok: true, output: result.output ?? null }\n : {\n ok: false,\n ...(typeof result.errorText === \"string\" && {\n errorText: result.errorText\n })\n },\n ...clientTools(event.clientTools)\n };\n }\n case \"approval-response\": {\n const { turnId, approvalId, approved, reason } = event;\n if (!isId(turnId)) return \"turnId\";\n if (!isId(approvalId)) return \"approvalId\";\n if (typeof approved !== \"boolean\") return \"approved\";\n return {\n type: \"approval-response\",\n eventId,\n turnId,\n approvalId,\n approved,\n ...(typeof reason === \"string\" && { reason })\n };\n }\n case \"cancel\":\n return isId(event.turnId)\n ? { type: \"cancel\", eventId, turnId: event.turnId }\n : \"turnId\";\n case \"conversation-create\":\n case \"conversation-fork\":\n return { type: event.type, eventId };\n case \"conversation-reset\":\n if (event.handoff !== undefined && typeof event.handoff !== \"string\") {\n return \"handoff\";\n }\n return {\n type: \"conversation-reset\",\n eventId,\n ...(event.handoff && { handoff: event.handoff })\n };\n default:\n return \"type\";\n }\n}\n\nfunction isPart(part: Json): boolean {\n return isObject(part) && typeof part.type === \"string\";\n}\n\n/** Keeps tools with a name, dropping a schema that is not an object. */\nfunction clientTools(value: Json | undefined): { clientTools?: ClientTool[] } {\n if (!Array.isArray(value)) return {};\n const tools: ClientTool[] = [];\n for (const tool of value) {\n if (!isObject(tool) || !isId(tool.name)) continue;\n tools.push({\n name: tool.name,\n ...(typeof tool.description === \"string\" && {\n description: tool.description\n }),\n ...(isObject(tool.inputSchema) && {\n inputSchema: tool.inputSchema as JsonObject\n })\n });\n }\n return { clientTools: tools };\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import {
3
3
  d as LifecycleRouteContext,
4
4
  s as LifecycleCapability,
5
5
  v as LifecycleJobOutcome
6
- } from "../capability-runner-DBAnGr6L.js";
6
+ } from "../capability-runner-O5VbQzqg.js";
7
7
  import { t as RetryOptions } from "../retries-CV6AkXmQ.js";
8
8
  import {
9
9
  a as QueuePayload,
package/dist/react.d.ts CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  C as MCPServersState,
3
3
  J as AgentToolRunPart,
4
4
  Y as AgentToolRunState
5
- } from "./agent-routing-0DR0Tk2v.js";
5
+ } from "./agent-routing-Bhdbvf7s.js";
6
6
  import { ClientParameters } from "./serializable.js";
7
7
  import { t as AgentTransport } from "./transport-protocol-ZTew5Wso.js";
8
8
  import {
@@ -15,7 +15,7 @@ import {
15
15
  p as RequiredAgentMethods,
16
16
  s as AgentStub,
17
17
  v as createStubProxy
18
- } from "./client-je3koD9Z.js";
18
+ } from "./client-DS3Dz9l0.js";
19
19
  import { PartySocket } from "partysocket";
20
20
  import { usePartySocket } from "partysocket/react";
21
21
 
@@ -2,7 +2,7 @@ import {
2
2
  r as CapabilityWebSocketUpgradeContext,
3
3
  s as LifecycleCapability,
4
4
  t as CapabilityRequestContext
5
- } from "../capability-runner-DBAnGr6L.js";
5
+ } from "../capability-runner-O5VbQzqg.js";
6
6
  import {
7
7
  a as routeAgentRequest,
8
8
  c as Agent,
@@ -10,7 +10,7 @@ import {
10
10
  n as AgentOptions,
11
11
  r as RoutingRetryOptions,
12
12
  t as AgentGetOptions
13
- } from "../agent-routing-0DR0Tk2v.js";
13
+ } from "../agent-routing-Bhdbvf7s.js";
14
14
 
15
15
  //#region src/routing/routed-agents.d.ts
16
16
  /** A public entry in an {@link RoutedAgents}. */
@@ -3,7 +3,7 @@ import {
3
3
  d as LifecycleRouteContext,
4
4
  s as LifecycleCapability,
5
5
  v as LifecycleJobOutcome
6
- } from "./capability-runner-DBAnGr6L.js";
6
+ } from "./capability-runner-O5VbQzqg.js";
7
7
  import { t as RetryOptions } from "./retries-CV6AkXmQ.js";
8
8
 
9
9
  //#region src/schedules/types.d.ts
@@ -220,4 +220,4 @@ export {
220
220
  SchedulerCallbacks as s,
221
221
  Scheduler as t
222
222
  };
223
- //# sourceMappingURL=scheduler-RdACNXDP.d.ts.map
223
+ //# sourceMappingURL=scheduler-CrFCnv_J.d.ts.map
@@ -8,7 +8,7 @@ import {
8
8
  r as SchedulerOptions,
9
9
  s as SchedulerCallbacks,
10
10
  t as Scheduler
11
- } from "../scheduler-RdACNXDP.js";
11
+ } from "../scheduler-CrFCnv_J.js";
12
12
  export {
13
13
  type Schedule,
14
14
  type ScheduleCriteria,
@@ -1,4 +1,4 @@
1
- import { k as StreamingResponse } from "./agent-routing-0DR0Tk2v.js";
1
+ import { k as StreamingResponse } from "./agent-routing-Bhdbvf7s.js";
2
2
 
3
3
  //#region src/serializable.d.ts
4
4
  type SerializablePrimitive = undefined | null | string | number | boolean;