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
@@ -1,101 +0,0 @@
1
- import {
2
- D as ChannelInboundMessage,
3
- F as ChannelMessageSurface,
4
- U as UserIdentity,
5
- V as ChannelIdentity,
6
- a as ChannelApprovalRequestOptions,
7
- d as ChannelRoute,
8
- h as DeliveryResult,
9
- j as ChannelIngressEvent,
10
- l as ChannelDeliveryOptions,
11
- n as Channel,
12
- p as ChannelStreamOptions,
13
- s as ChannelChunkSource,
14
- u as ChannelMessage,
15
- w as ChannelEmailInput,
16
- y as ChannelApprovalResponse
17
- } from "./channel-Bnm4S7T2.js";
18
-
19
- //#region src/channels/host/index.d.ts
20
- type ChannelMessageEvent = {
21
- channelKey: string;
22
- route: string /** Stable identity derived only from the configured Channel and eventId. */;
23
- dispatchId: string;
24
- message: ChannelInboundMessage;
25
- };
26
- type ChannelApprovalResponseEvent = {
27
- channelKey: string;
28
- route: string /** Stable identity derived only from the configured Channel and eventId. */;
29
- dispatchId: string;
30
- response: ChannelApprovalResponse;
31
- };
32
- type ChannelRouteEvent = {
33
- channelKey: string;
34
- event: ChannelIngressEvent;
35
- route:
36
- | string
37
- | null /** Stable identity derived only from the configured Channel and eventId. */;
38
- dispatchId: string;
39
- };
40
- type ChannelHostOptions = {
41
- channels: Record<
42
- string,
43
- Channel
44
- > /** Used when a Channel does not provide a route. Default: event thread id. */;
45
- defaultRoute?: ChannelRoute /** Resolve an existing, explicitly linked application user. */;
46
- findUser?(
47
- identity: ChannelIdentity
48
- ): Promise<UserIdentity | null> /** Observes every valid route outcome before application dispatch. */;
49
- onRoute?(event: ChannelRouteEvent): void | Promise<void>;
50
- onMessage?(event: ChannelMessageEvent): void | Promise<void>;
51
- onApprovalResponse?(
52
- event: ChannelApprovalResponseEvent
53
- ): void | Promise<void>;
54
- };
55
- /**
56
- * Authenticates and normalizes ingress through configured Channel adapters,
57
- * resolves outbound surfaces, and awaits the application's durable handoff.
58
- */
59
- declare class ChannelHost {
60
- #private;
61
- constructor(options: ChannelHostOptions);
62
- handleRequest(request: Request): Promise<Response | undefined>;
63
- handleEmail(email: ChannelEmailInput): Promise<boolean>;
64
- /** Deliver through the configured Channel or composite named by the surface. */
65
- deliver(
66
- surface: ChannelMessageSurface,
67
- message: ChannelMessage,
68
- options?: ChannelDeliveryOptions
69
- ): Promise<DeliveryResult>;
70
- /**
71
- * Deliver a progressively generated answer to the Channel or composite
72
- * named by the surface.
73
- *
74
- * A Channel that can stream consumes the stream itself. A Channel that
75
- * cannot never learns it was a stream, because the Host collects the answer
76
- * and calls `deliver` once.
77
- */
78
- stream(
79
- surface: ChannelMessageSurface,
80
- chunks: ChannelChunkSource,
81
- options?: ChannelStreamOptions
82
- ): Promise<DeliveryResult>;
83
- /** Request approval through the Channel or composite named by the surface. */
84
- requestApproval(
85
- surface: ChannelMessageSurface,
86
- options: ChannelApprovalRequestOptions
87
- ): Promise<DeliveryResult>;
88
- /** Return the identity's configured Channel destination, when supported. */
89
- contactSurface(identity: ChannelIdentity): ChannelMessageSurface | null;
90
- /** Resolve whether a surface can currently be selected without delivery. */
91
- isAvailable(surface: ChannelMessageSurface): Promise<boolean>;
92
- }
93
- //#endregion
94
- export {
95
- ChannelRouteEvent as a,
96
- ChannelMessageEvent as i,
97
- ChannelHost as n,
98
- ChannelHostOptions as r,
99
- ChannelApprovalResponseEvent as t
100
- };
101
- //# sourceMappingURL=index-BB0kqhIz.d.ts.map
@@ -1,83 +0,0 @@
1
- import { t as TextSegmentJoiner } from "./text-segment-joiner-BtAFQSA_.js";
2
- //#region src/channels/stream.ts
3
- /**
4
- * Read a stream to completion, then finalize exactly once.
5
- *
6
- * `onFinish` runs whether the stream closed normally, errored because the
7
- * generation failed, or stopped because `onChunk` threw. A Channel that
8
- * finalizes here cannot lose a terminal provider call to an early ending.
9
- */
10
- async function consumeChunks(chunks, consumer) {
11
- const reader = chunks.getReader();
12
- let outcome = { interrupted: false };
13
- let cancellation;
14
- try {
15
- while (true) {
16
- const { done, value } = await reader.read();
17
- if (done) break;
18
- await consumer.onChunk(value);
19
- }
20
- } catch (error) {
21
- outcome = {
22
- interrupted: true,
23
- error
24
- };
25
- cancellation = reader.cancel().catch(() => {});
26
- } finally {
27
- reader.releaseLock();
28
- }
29
- try {
30
- return await consumer.onFinish(outcome);
31
- } finally {
32
- await cancellation;
33
- }
34
- }
35
- /**
36
- * Collect every `text` chunk into one Markdown answer.
37
- *
38
- * The result reports interruption instead of throwing, because a Channel that
39
- * has partial text still has to decide what to deliver.
40
- */
41
- function collectText(chunks) {
42
- let text = "";
43
- const joiner = new TextSegmentJoiner();
44
- return consumeChunks(chunks, {
45
- onChunk(chunk) {
46
- for (const event of joiner.pushChunk(chunk.type === "text" ? {
47
- type: "text-delta",
48
- text: chunk.text
49
- } : { type: chunk.type })) if (event.type === "text") text += event.text;
50
- },
51
- onFinish: (outcome) => ({
52
- text,
53
- interrupted: outcome.interrupted
54
- })
55
- });
56
- }
57
- /**
58
- * Pace repeated provider calls without dropping anything.
59
- *
60
- * A Channel accumulates into its own buffer and asks whether enough time has
61
- * passed to flush. Keeping the buffer in the Channel means an interrupted
62
- * stream leaves its tail in hand, ready for the terminal provider call, rather
63
- * than stranded inside a transform.
64
- */
65
- function createPacer(intervalMs) {
66
- let lastFlushAt = Number.NEGATIVE_INFINITY;
67
- return () => {
68
- const now = Date.now();
69
- if (now - lastFlushAt < intervalMs) return false;
70
- lastFlushAt = now;
71
- return true;
72
- };
73
- }
74
- //#endregion
75
- //#region src/channels/ingress.ts
76
- /** Match an HTTP request to one exact URL pathname. */
77
- function matchesPath(request, path) {
78
- return new URL(request.url).pathname === path;
79
- }
80
- //#endregion
81
- export { createPacer as i, collectText as n, consumeChunks as r, matchesPath as t };
82
-
83
- //# sourceMappingURL=ingress-BfetZbMO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingress-BfetZbMO.js","names":[],"sources":["../src/channels/stream.ts","../src/channels/ingress.ts"],"sourcesContent":["import { TextSegmentJoiner } from \"../chat/text-segment-joiner\";\nimport type { Awaitable, ChannelChunk } from \"./channel\";\n\n/** Why a consumption loop stopped reading. */\nexport type StreamOutcome =\n | { interrupted: false }\n | { interrupted: true; error: unknown };\n\nexport type ChunkConsumer<TChunk, TResult> = {\n onChunk(chunk: TChunk): Awaitable<void>;\n /** Runs exactly once, whether the stream closed or ended abnormally. */\n onFinish(outcome: StreamOutcome): Awaitable<TResult>;\n};\n\n/** The complete text of a stream, and whether it ended before its answer did. */\nexport type CollectedText = {\n text: string;\n interrupted: boolean;\n};\n\n/**\n * Read a stream to completion, then finalize exactly once.\n *\n * `onFinish` runs whether the stream closed normally, errored because the\n * generation failed, or stopped because `onChunk` threw. A Channel that\n * finalizes here cannot lose a terminal provider call to an early ending.\n */\nexport async function consumeChunks<TChunk, TResult>(\n chunks: ReadableStream<TChunk>,\n consumer: ChunkConsumer<TChunk, TResult>\n): Promise<TResult> {\n const reader = chunks.getReader();\n let outcome: StreamOutcome = { interrupted: false };\n let cancellation: Promise<void> | undefined;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n await consumer.onChunk(value);\n }\n } catch (error) {\n outcome = { interrupted: true, error };\n // Start cancellation before finalizing, but do not block the terminal\n // provider call on sibling tee branches. Await cleanup only afterward.\n cancellation = reader.cancel().catch(() => {});\n } finally {\n reader.releaseLock();\n }\n try {\n return await consumer.onFinish(outcome);\n } finally {\n await cancellation;\n }\n}\n\n/**\n * Collect every `text` chunk into one Markdown answer.\n *\n * The result reports interruption instead of throwing, because a Channel that\n * has partial text still has to decide what to deliver.\n */\nexport function collectText(\n chunks: ReadableStream<ChannelChunk>\n): Promise<CollectedText> {\n let text = \"\";\n const joiner = new TextSegmentJoiner();\n return consumeChunks(chunks, {\n onChunk(chunk) {\n for (const event of joiner.pushChunk(\n chunk.type === \"text\"\n ? { type: \"text-delta\", text: chunk.text }\n : { type: chunk.type }\n )) {\n if (event.type === \"text\") text += event.text;\n }\n },\n onFinish: (outcome) => ({ text, interrupted: outcome.interrupted })\n });\n}\n\n/**\n * Pace repeated provider calls without dropping anything.\n *\n * A Channel accumulates into its own buffer and asks whether enough time has\n * passed to flush. Keeping the buffer in the Channel means an interrupted\n * stream leaves its tail in hand, ready for the terminal provider call, rather\n * than stranded inside a transform.\n */\nexport function createPacer(intervalMs: number): () => boolean {\n let lastFlushAt = Number.NEGATIVE_INFINITY;\n return () => {\n const now = Date.now();\n if (now - lastFlushAt < intervalMs) return false;\n lastFlushAt = now;\n return true;\n };\n}\n","import type { ChannelIdentity, ChannelIdentityInput } from \"./identity\";\nimport type {\n ChannelMessageSurface,\n ChannelMessageSurfaceInput\n} from \"./surface\";\n\n/** Serializable provider attachment facts available after ingress returns. */\nexport type ChannelAttachment = {\n id?: string;\n mediaType?: string;\n name?: string;\n size?: number;\n text?: string;\n url?: string;\n};\n\nexport type ChannelActor = {\n readonly id: string;\n /** Stable Channel identity suitable for explicit application linking. */\n readonly identity?: ChannelIdentity;\n readonly username?: string;\n readonly fullName?: string;\n readonly isBot?: boolean | \"unknown\";\n readonly isSelf?: boolean;\n};\n\n/** An actor before the Host stamps its configured Channel key. */\nexport type ChannelActorInput = Omit<ChannelActor, \"identity\"> & {\n readonly identity?: ChannelIdentityInput;\n};\n\nexport type ChannelEventContext = {\n /** Immutable Channel-scoped identity, independent of application routing. */\n readonly eventId: string;\n readonly thread: {\n readonly id: string;\n readonly isDirectMessage: boolean | \"unknown\";\n };\n /** Exact provider destination for responding to this inbound event. */\n readonly replySurface?: ChannelMessageSurface;\n readonly actor?: ChannelActor;\n};\n\n/** A normalized inbound message from a Channel adapter. */\nexport type ChannelInboundMessage = ChannelEventContext & {\n readonly type: \"message\";\n readonly message: {\n readonly id: string;\n readonly text: string;\n readonly title?: string;\n readonly markdown?: string;\n readonly attachments?: readonly ChannelAttachment[];\n readonly isMention?: boolean;\n readonly reply?: {\n readonly id: string;\n readonly text?: string;\n };\n readonly metadata?: {\n /** ISO 8601 timestamp supplied by the provider. */\n readonly sentAt?: string;\n readonly edited?: boolean;\n /** ISO 8601 timestamp supplied by the provider. */\n readonly editedAt?: string;\n readonly autoReply?: boolean;\n };\n };\n};\n\n/** A provider-normalized response to an external approval request. */\nexport type ChannelApprovalResponse = ChannelEventContext & {\n readonly type: \"approval-response\";\n readonly interactionId: string;\n readonly decision: \"approve\" | \"reject\";\n /** Provider reference for this inbound response. */\n readonly reference: string;\n};\n\nexport type ChannelIngressEvent =\n | ChannelInboundMessage\n | ChannelApprovalResponse;\n\n/** A normalized message before the Host stamps its configured Channel key. */\nexport type ChannelEventContextInput = Omit<\n ChannelEventContext,\n \"replySurface\" | \"actor\"\n> & {\n readonly replySurface?: ChannelMessageSurfaceInput;\n readonly actor?: ChannelActorInput;\n};\n\nexport type ChannelInboundMessageInput = Omit<\n ChannelInboundMessage,\n \"replySurface\" | \"actor\"\n> & {\n readonly replySurface?: ChannelMessageSurfaceInput;\n readonly actor?: ChannelActorInput;\n};\n\n/** A normalized approval before the Host stamps its configured Channel key. */\nexport type ChannelApprovalResponseInput = Omit<\n ChannelApprovalResponse,\n \"replySurface\" | \"actor\"\n> & {\n readonly replySurface?: ChannelMessageSurfaceInput;\n readonly actor?: ChannelActorInput;\n};\n\n/** Authenticated event produced by a Channel before Host dispatch. */\nexport type ChannelIngressEventInput =\n | ChannelInboundMessageInput\n | ChannelApprovalResponseInput;\n\n/** Authenticated adapter output retained only until Host routing completes. */\nexport type ChannelIngressEnvelope<TRaw = unknown> = {\n event: ChannelIngressEventInput;\n raw: TRaw;\n};\n\n/** The normalized envelopes and provider acknowledgement produced by ingress. */\nexport type ChannelIngressResult<TRaw = unknown> = {\n events: readonly ChannelIngressEnvelope<TRaw>[];\n response: Response;\n};\n\n/** Match an HTTP request to one exact URL pathname. */\nexport function matchesPath(request: Request, path: string): boolean {\n return new URL(request.url).pathname === path;\n}\n\n/** Webhook-shaped inbound support owned by a Channel. */\nexport interface ChannelIngress<TRaw = unknown> {\n /** Return null when this Channel does not own the request. */\n receive(request: Request): Promise<ChannelIngressResult<TRaw> | null>;\n}\n\n/** Structural input supported by Workers Email and Agent email handlers. */\nexport type ChannelEmailInput = {\n from: string;\n to: string;\n headers: Headers;\n raw?: ReadableStream<Uint8Array>;\n getRaw?: () => Promise<Uint8Array>;\n};\n\nexport type ChannelEmailIngressResult<TRaw = unknown> = {\n events: readonly ChannelIngressEnvelope<TRaw>[];\n};\n\n/** Non-HTTP ingress for a Workers Email event. */\nexport interface ChannelEmailIngress<TRaw = unknown> {\n /** Return null when this Channel does not own the email. */\n receive(\n email: ChannelEmailInput\n ): Promise<ChannelEmailIngressResult<TRaw> | null>;\n}\n"],"mappings":";;;;;;;;;AA2BA,eAAsB,cACpB,QACA,UACkB;CAClB,MAAM,SAAS,OAAO,UAAU;CAChC,IAAI,UAAyB,EAAE,aAAa,MAAM;CAClD,IAAI;CACJ,IAAI;EACF,OAAO,MAAM;GACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,IAAI,MAAM;GACV,MAAM,SAAS,QAAQ,KAAK;EAC9B;CACF,SAAS,OAAO;EACd,UAAU;GAAE,aAAa;GAAM;EAAM;EAGrC,eAAe,OAAO,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;CAC/C,UAAU;EACR,OAAO,YAAY;CACrB;CACA,IAAI;EACF,OAAO,MAAM,SAAS,SAAS,OAAO;CACxC,UAAU;EACR,MAAM;CACR;AACF;;;;;;;AAQA,SAAgB,YACd,QACwB;CACxB,IAAI,OAAO;CACX,MAAM,SAAS,IAAI,kBAAkB;CACrC,OAAO,cAAc,QAAQ;EAC3B,QAAQ,OAAO;GACb,KAAK,MAAM,SAAS,OAAO,UACzB,MAAM,SAAS,SACX;IAAE,MAAM;IAAc,MAAM,MAAM;GAAK,IACvC,EAAE,MAAM,MAAM,KAAK,CACzB,GACE,IAAI,MAAM,SAAS,QAAQ,QAAQ,MAAM;EAE7C;EACA,WAAW,aAAa;GAAE;GAAM,aAAa,QAAQ;EAAY;CACnE,CAAC;AACH;;;;;;;;;AAUA,SAAgB,YAAY,YAAmC;CAC7D,IAAI,cAAc,OAAO;CACzB,aAAa;EACX,MAAM,MAAM,KAAK,IAAI;EACrB,IAAI,MAAM,cAAc,YAAY,OAAO;EAC3C,cAAc;EACd,OAAO;CACT;AACF;;;;AC6BA,SAAgB,YAAY,SAAkB,MAAuB;CACnE,OAAO,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,aAAa;AAC3C"}
@@ -1,59 +0,0 @@
1
- import { t as isChannelMessageSurface } from "./surface-bZZJqBka.js";
2
- //#region src/channels/internal.ts
3
- const textEncoder = new TextEncoder();
4
- function encodeUtf8(value) {
5
- return textEncoder.encode(value);
6
- }
7
- function utf8ByteLength(value) {
8
- return encodeUtf8(value).byteLength;
9
- }
10
- function isRecord(value) {
11
- return value !== null && typeof value === "object" && !Array.isArray(value);
12
- }
13
- function defaultText(message) {
14
- return message.title ? `${message.title}\n\n${message.markdown}` : message.markdown;
15
- }
16
- function renderInput(input) {
17
- if (typeof input === "string") return input;
18
- try {
19
- return JSON.stringify(input, null, 2) ?? String(input);
20
- } catch {
21
- return String(input);
22
- }
23
- }
24
- function uncertain(code, message, reference) {
25
- return {
26
- status: "uncertain",
27
- ...reference !== void 0 && { reference },
28
- error: {
29
- code,
30
- message
31
- }
32
- };
33
- }
34
- function emptyIngressResponse(status = 200) {
35
- return {
36
- events: [],
37
- response: new Response(null, { status })
38
- };
39
- }
40
- function compositeDestinations(surface) {
41
- if (surface.address === null || typeof surface.address !== "object" || Array.isArray(surface.address)) return;
42
- const destinations = surface.address.surfaces;
43
- if (!Array.isArray(destinations) || destinations.length === 0 || !destinations.every(isChannelMessageSurface)) return;
44
- return destinations;
45
- }
46
- function unsupported(code, message) {
47
- return {
48
- status: "failed",
49
- retryable: false,
50
- error: {
51
- code,
52
- message
53
- }
54
- };
55
- }
56
- //#endregion
57
- export { isRecord as a, unsupported as c, encodeUtf8 as i, utf8ByteLength as l, defaultText as n, renderInput as o, emptyIngressResponse as r, uncertain as s, compositeDestinations as t };
58
-
59
- //# sourceMappingURL=internal-CYlgHl1l.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal-CYlgHl1l.js","names":[],"sources":["../src/channels/internal.ts"],"sourcesContent":["import type { ChannelMessage, DeliveryResult } from \"./channel\";\nimport type { ChannelIngressResult } from \"./ingress\";\nimport { isChannelMessageSurface, type ChannelMessageSurface } from \"./surface\";\n\nconst textEncoder = new TextEncoder();\n\nexport function encodeUtf8(value: string): Uint8Array<ArrayBuffer> {\n return textEncoder.encode(value);\n}\n\nexport function utf8ByteLength(value: string): number {\n return encodeUtf8(value).byteLength;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function defaultText(message: ChannelMessage): string {\n return message.title\n ? `${message.title}\\n\\n${message.markdown}`\n : message.markdown;\n}\n\nexport function renderInput(input: unknown): string {\n if (typeof input === \"string\") return input;\n try {\n return JSON.stringify(input, null, 2) ?? String(input);\n } catch {\n return String(input);\n }\n}\n\nexport function uncertain(\n code: string,\n message: string,\n reference?: string\n): Extract<DeliveryResult, { status: \"uncertain\" }> {\n return {\n status: \"uncertain\",\n ...(reference !== undefined && { reference }),\n error: { code, message }\n };\n}\n\nexport function emptyIngressResponse<TRaw>(\n status = 200\n): ChannelIngressResult<TRaw> {\n return { events: [], response: new Response(null, { status }) };\n}\n\nexport function compositeDestinations(\n surface: ChannelMessageSurface\n): readonly ChannelMessageSurface[] | undefined {\n if (\n surface.address === null ||\n typeof surface.address !== \"object\" ||\n Array.isArray(surface.address)\n ) {\n return undefined;\n }\n const destinations = (surface.address as Record<string, unknown>).surfaces;\n if (\n !Array.isArray(destinations) ||\n destinations.length === 0 ||\n !destinations.every(isChannelMessageSurface)\n ) {\n return undefined;\n }\n return destinations;\n}\n\nexport function unsupported(\n code: string,\n message: string\n): Extract<DeliveryResult, { status: \"failed\" }> {\n return {\n status: \"failed\",\n retryable: false,\n error: { code, message }\n };\n}\n"],"mappings":";;AAIA,MAAM,cAAc,IAAI,YAAY;AAEpC,SAAgB,WAAW,OAAwC;CACjE,OAAO,YAAY,OAAO,KAAK;AACjC;AAEA,SAAgB,eAAe,OAAuB;CACpD,OAAO,WAAW,KAAK,CAAC,CAAC;AAC3B;AAEA,SAAgB,SAAS,OAAkD;CACzE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAgB,YAAY,SAAiC;CAC3D,OAAO,QAAQ,QACX,GAAG,QAAQ,MAAM,MAAM,QAAQ,aAC/B,QAAQ;AACd;AAEA,SAAgB,YAAY,OAAwB;CAClD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI;EACF,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;CACvD,QAAQ;EACN,OAAO,OAAO,KAAK;CACrB;AACF;AAEA,SAAgB,UACd,MACA,SACA,WACkD;CAClD,OAAO;EACL,QAAQ;EACR,GAAI,cAAc,KAAA,KAAa,EAAE,UAAU;EAC3C,OAAO;GAAE;GAAM;EAAQ;CACzB;AACF;AAEA,SAAgB,qBACd,SAAS,KACmB;CAC5B,OAAO;EAAE,QAAQ,CAAC;EAAG,UAAU,IAAI,SAAS,MAAM,EAAE,OAAO,CAAC;CAAE;AAChE;AAEA,SAAgB,sBACd,SAC8C;CAC9C,IACE,QAAQ,YAAY,QACpB,OAAO,QAAQ,YAAY,YAC3B,MAAM,QAAQ,QAAQ,OAAO,GAE7B;CAEF,MAAM,eAAgB,QAAQ,QAAoC;CAClE,IACE,CAAC,MAAM,QAAQ,YAAY,KAC3B,aAAa,WAAW,KACxB,CAAC,aAAa,MAAM,uBAAuB,GAE3C;CAEF,OAAO;AACT;AAEA,SAAgB,YACd,MACA,SAC+C;CAC/C,OAAO;EACL,QAAQ;EACR,WAAW;EACX,OAAO;GAAE;GAAM;EAAQ;CACzB;AACF"}