managed-deepagents 0.10.0-dev.17 → 0.10.0-dev.18

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 (195) hide show
  1. package/README.md +508 -80
  2. package/dist/channels/actor.d.ts +43 -0
  3. package/dist/channels/actor.d.ts.map +1 -0
  4. package/dist/channels/actor.js +2 -0
  5. package/dist/channels/actor.js.map +1 -0
  6. package/dist/channels/assistant-text.d.ts +29 -0
  7. package/dist/channels/assistant-text.d.ts.map +1 -1
  8. package/dist/channels/assistant-text.js +72 -1
  9. package/dist/channels/assistant-text.js.map +1 -1
  10. package/dist/channels/binding.d.ts +20 -1
  11. package/dist/channels/binding.d.ts.map +1 -1
  12. package/dist/channels/binding.js +39 -10
  13. package/dist/channels/binding.js.map +1 -1
  14. package/dist/channels/delivery.d.ts +21 -0
  15. package/dist/channels/delivery.d.ts.map +1 -0
  16. package/dist/channels/delivery.js +196 -0
  17. package/dist/channels/delivery.js.map +1 -0
  18. package/dist/channels/github/index.d.ts.map +1 -1
  19. package/dist/channels/github/index.js +13 -11
  20. package/dist/channels/github/index.js.map +1 -1
  21. package/dist/channels/github/schema.d.ts +50 -1
  22. package/dist/channels/github/schema.d.ts.map +1 -1
  23. package/dist/channels/github/schema.js +12 -0
  24. package/dist/channels/github/schema.js.map +1 -1
  25. package/dist/channels/http/endpoint.d.ts +6 -4
  26. package/dist/channels/http/endpoint.d.ts.map +1 -1
  27. package/dist/channels/http/endpoint.js.map +1 -1
  28. package/dist/channels/http/http.d.ts.map +1 -1
  29. package/dist/channels/http/http.js +4 -10
  30. package/dist/channels/http/http.js.map +1 -1
  31. package/dist/channels/http/index.d.ts.map +1 -1
  32. package/dist/channels/http/index.js +10 -16
  33. package/dist/channels/http/index.js.map +1 -1
  34. package/dist/channels/http/ingress.d.ts +2 -2
  35. package/dist/channels/http/ingress.d.ts.map +1 -1
  36. package/dist/channels/http/ingress.js +9 -21
  37. package/dist/channels/http/ingress.js.map +1 -1
  38. package/dist/channels/http/provider.d.ts +10 -5
  39. package/dist/channels/http/provider.d.ts.map +1 -1
  40. package/dist/channels/http/provider.js +17 -10
  41. package/dist/channels/http/provider.js.map +1 -1
  42. package/dist/channels/http/studio.d.ts +5 -5
  43. package/dist/channels/http/studio.d.ts.map +1 -1
  44. package/dist/channels/http/studio.js +4 -6
  45. package/dist/channels/http/studio.js.map +1 -1
  46. package/dist/channels/http/types.d.ts +7 -1
  47. package/dist/channels/http/types.d.ts.map +1 -1
  48. package/dist/channels/linear/index.d.ts.map +1 -1
  49. package/dist/channels/linear/index.js +16 -11
  50. package/dist/channels/linear/index.js.map +1 -1
  51. package/dist/channels/linear/schema.d.ts +11 -25
  52. package/dist/channels/linear/schema.d.ts.map +1 -1
  53. package/dist/channels/linear/schema.js +6 -0
  54. package/dist/channels/linear/schema.js.map +1 -1
  55. package/dist/channels/linear/types.d.ts +9 -2
  56. package/dist/channels/linear/types.d.ts.map +1 -1
  57. package/dist/channels/messaging-registry.d.ts +16 -0
  58. package/dist/channels/messaging-registry.d.ts.map +1 -1
  59. package/dist/channels/messaging-registry.js +29 -0
  60. package/dist/channels/messaging-registry.js.map +1 -1
  61. package/dist/channels/reserved-connections.d.ts.map +1 -1
  62. package/dist/channels/reserved-connections.js +10 -0
  63. package/dist/channels/reserved-connections.js.map +1 -1
  64. package/dist/channels/run-input.d.ts +11 -0
  65. package/dist/channels/run-input.d.ts.map +1 -1
  66. package/dist/channels/run-input.js +18 -8
  67. package/dist/channels/run-input.js.map +1 -1
  68. package/dist/channels/runtime.d.ts +1 -1
  69. package/dist/channels/runtime.d.ts.map +1 -1
  70. package/dist/channels/runtime.js +1 -1
  71. package/dist/channels/runtime.js.map +1 -1
  72. package/dist/channels/schedule-delivery.d.ts +1 -1
  73. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  74. package/dist/channels/schedule-delivery.js +9 -20
  75. package/dist/channels/schedule-delivery.js.map +1 -1
  76. package/dist/channels/slack/api.d.ts +2 -0
  77. package/dist/channels/slack/api.d.ts.map +1 -1
  78. package/dist/channels/slack/api.js +6 -0
  79. package/dist/channels/slack/api.js.map +1 -1
  80. package/dist/channels/slack/connections.d.ts +6 -0
  81. package/dist/channels/slack/connections.d.ts.map +1 -0
  82. package/dist/channels/slack/connections.js +6 -0
  83. package/dist/channels/slack/connections.js.map +1 -0
  84. package/dist/channels/slack/events.d.ts +272 -0
  85. package/dist/channels/slack/events.d.ts.map +1 -0
  86. package/dist/channels/slack/events.js +235 -0
  87. package/dist/channels/slack/events.js.map +1 -0
  88. package/dist/channels/slack/files.d.ts.map +1 -1
  89. package/dist/channels/slack/files.js +2 -3
  90. package/dist/channels/slack/files.js.map +1 -1
  91. package/dist/channels/slack/index.d.ts +44 -2
  92. package/dist/channels/slack/index.d.ts.map +1 -1
  93. package/dist/channels/slack/index.js +124 -3
  94. package/dist/channels/slack/index.js.map +1 -1
  95. package/dist/channels/slack/message-content.d.ts.map +1 -1
  96. package/dist/channels/slack/message-content.js +23 -28
  97. package/dist/channels/slack/message-content.js.map +1 -1
  98. package/dist/channels/slack/status.d.ts +76 -0
  99. package/dist/channels/slack/status.d.ts.map +1 -0
  100. package/dist/channels/slack/status.js +427 -0
  101. package/dist/channels/slack/status.js.map +1 -0
  102. package/dist/channels/trigger/client.d.ts.map +1 -1
  103. package/dist/channels/trigger/client.js +4 -9
  104. package/dist/channels/trigger/client.js.map +1 -1
  105. package/dist/channels/trigger/http.d.ts +114 -3
  106. package/dist/channels/trigger/http.d.ts.map +1 -1
  107. package/dist/channels/trigger/http.js +310 -71
  108. package/dist/channels/trigger/http.js.map +1 -1
  109. package/dist/channels/trigger/ingress.d.ts +38 -1
  110. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  111. package/dist/channels/trigger/ingress.js +47 -1
  112. package/dist/channels/trigger/ingress.js.map +1 -1
  113. package/dist/channels/trigger/types.d.ts +82 -3
  114. package/dist/channels/trigger/types.d.ts.map +1 -1
  115. package/dist/channels/trigger/types.js +36 -0
  116. package/dist/channels/trigger/types.js.map +1 -1
  117. package/dist/channels/types.d.ts +19 -3
  118. package/dist/channels/types.d.ts.map +1 -1
  119. package/dist/channels/types.js +2 -0
  120. package/dist/channels/types.js.map +1 -1
  121. package/dist/index.d.ts +6 -3
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -1
  124. package/dist/index.js.map +1 -1
  125. package/dist/ingress/runs.d.ts +22 -0
  126. package/dist/ingress/runs.d.ts.map +1 -1
  127. package/dist/ingress/runs.js +45 -1
  128. package/dist/ingress/runs.js.map +1 -1
  129. package/dist/managed-composition.d.ts.map +1 -1
  130. package/dist/managed-composition.js +8 -13
  131. package/dist/managed-composition.js.map +1 -1
  132. package/dist/namespaces.d.ts +0 -21
  133. package/dist/namespaces.d.ts.map +1 -1
  134. package/dist/namespaces.js +0 -29
  135. package/dist/namespaces.js.map +1 -1
  136. package/dist/runtime/auth.d.ts +1 -2
  137. package/dist/runtime/auth.d.ts.map +1 -1
  138. package/dist/runtime/auth.js +90 -63
  139. package/dist/runtime/auth.js.map +1 -1
  140. package/dist/runtime/identity-runtime.d.ts +4 -9
  141. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  142. package/dist/runtime/identity-runtime.js +12 -25
  143. package/dist/runtime/identity-runtime.js.map +1 -1
  144. package/dist/runtime/index.d.ts.map +1 -1
  145. package/dist/runtime/index.js +32 -23
  146. package/dist/runtime/index.js.map +1 -1
  147. package/dist/runtime/managed-thread.d.ts +60 -0
  148. package/dist/runtime/managed-thread.d.ts.map +1 -0
  149. package/dist/runtime/managed-thread.js +76 -0
  150. package/dist/runtime/managed-thread.js.map +1 -0
  151. package/dist/runtime/managed-tools.d.ts +10 -2
  152. package/dist/runtime/managed-tools.d.ts.map +1 -1
  153. package/dist/runtime/managed-tools.js +10 -8
  154. package/dist/runtime/managed-tools.js.map +1 -1
  155. package/dist/runtime/memory/policy.d.ts.map +1 -1
  156. package/dist/runtime/memory/policy.js +1 -3
  157. package/dist/runtime/memory/policy.js.map +1 -1
  158. package/dist/runtime/run-input.d.ts +10 -0
  159. package/dist/runtime/run-input.d.ts.map +1 -1
  160. package/dist/runtime/run-input.js +48 -2
  161. package/dist/runtime/run-input.js.map +1 -1
  162. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  163. package/dist/runtime/sandbox-manager.js +1 -1
  164. package/dist/runtime/sandbox-manager.js.map +1 -1
  165. package/dist/runtime/schedule-auth.d.ts +17 -0
  166. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  167. package/dist/runtime/schedule-auth.js +39 -1
  168. package/dist/runtime/schedule-auth.js.map +1 -1
  169. package/dist/runtime/thread-record.d.ts +81 -0
  170. package/dist/runtime/thread-record.d.ts.map +1 -0
  171. package/dist/runtime/thread-record.js +205 -0
  172. package/dist/runtime/thread-record.js.map +1 -0
  173. package/dist/runtime/types.d.ts +5 -1
  174. package/dist/runtime/types.d.ts.map +1 -1
  175. package/dist/runtime-schedules.d.ts +13 -0
  176. package/dist/runtime-schedules.d.ts.map +1 -1
  177. package/dist/runtime-schedules.js +83 -20
  178. package/dist/runtime-schedules.js.map +1 -1
  179. package/dist/sandbox.d.ts +0 -6
  180. package/dist/sandbox.d.ts.map +1 -1
  181. package/dist/sandbox.js +3 -7
  182. package/dist/sandbox.js.map +1 -1
  183. package/dist/schedule-channel.d.ts +5 -2
  184. package/dist/schedule-channel.d.ts.map +1 -1
  185. package/dist/schedule-channel.js +13 -12
  186. package/dist/schedule-channel.js.map +1 -1
  187. package/dist/values.d.ts +15 -0
  188. package/dist/values.d.ts.map +1 -0
  189. package/dist/values.js +31 -0
  190. package/dist/values.js.map +1 -0
  191. package/package.json +7 -7
  192. package/dist/channels/http/reply.d.ts +0 -20
  193. package/dist/channels/http/reply.d.ts.map +0 -1
  194. package/dist/channels/http/reply.js +0 -116
  195. package/dist/channels/http/reply.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Who caused a channel event: the signed sender of a GitHub or Linear webhook,
3
+ * or the Slack user Trigger Server names on a delivery, which MDA can't verify
4
+ * yet. It is personal data: MDA neither logs it nor adds it to a run's
5
+ * metadata.
6
+ */
7
+ interface ActorBase<P extends string> {
8
+ provider: P;
9
+ /** The provider's ID for them. */
10
+ id: string;
11
+ }
12
+ /** An actor whose provider may name them. */
13
+ interface NamedActorBase<P extends string> extends ActorBase<P> {
14
+ /** Their name or handle, when the provider sends one. */
15
+ name?: string;
16
+ /** Their email, when the provider sends one. */
17
+ email?: string;
18
+ }
19
+ /**
20
+ * A Slack user, as Trigger Server read them from Slack's signed request.
21
+ * Trigger Server's delivery names no name or email. MDA doesn't yet verify
22
+ * the delivery's service key, so this is no identity check.
23
+ */
24
+ export interface SlackActor extends ActorBase<"slack"> {
25
+ /**
26
+ * Their own Slack workspace (team). In a Slack Connect channel, someone
27
+ * from another organization keeps theirs rather than your app's.
28
+ */
29
+ teamId: string;
30
+ }
31
+ /** A GitHub account, as the signed webhook's `sender` names it; `name` is its login. */
32
+ export interface GitHubActor extends NamedActorBase<"github"> {
33
+ type: "User" | "Bot" | "Organization";
34
+ }
35
+ /** A Linear user or app, as the signed webhook names it. */
36
+ export interface LinearActor extends NamedActorBase<"linear"> {
37
+ /** Linear's kind of actor, such as `user`, when it sends one. */
38
+ type?: string;
39
+ }
40
+ /** Who caused an event, on any channel; switch on `provider`. */
41
+ export type ChannelActor = SlackActor | GitHubActor | LinearActor;
42
+ export {};
43
+ //# sourceMappingURL=actor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/channels/actor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,UAAU,SAAS,CAAC,CAAC,SAAS,MAAM;IAClC,QAAQ,EAAE,CAAC,CAAC;IACZ,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,6CAA6C;AAC7C,UAAU,cAAc,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC7D,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAW,SAAQ,SAAS,CAAC,OAAO,CAAC;IACpD;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC3D,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,cAAc,CAAC;CACvC;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC3D,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=actor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/channels/actor.ts"],"names":[],"mappings":""}
@@ -8,4 +8,33 @@ export declare function extractAssistantText(input: {
8
8
  export declare function extractAssistantContent(input: {
9
9
  messages?: unknown;
10
10
  }): MessageContent | null;
11
+ /** A reply that means "nothing to tell the channel". */
12
+ export declare const QUIET_REPLY = "[quiet]";
13
+ /** Where a run's messages start in a thread's messages. */
14
+ export interface ReplyBoundary {
15
+ /**
16
+ * The thread's last message before the run. Without it the run starts at
17
+ * the last user message.
18
+ */
19
+ afterId?: string;
20
+ }
21
+ /**
22
+ * What a run says to the channel: each of its answers, oldest first, without
23
+ * `[quiet]` ones. A run with a known start never repeats an earlier run's
24
+ * answer.
25
+ */
26
+ export declare function extractReplyText(input: {
27
+ messages?: unknown;
28
+ }, boundary?: ReplyBoundary): string;
29
+ /** {@link extractReplyText} as content; several answers are joined as text. */
30
+ export declare function extractReplyContent(input: {
31
+ messages?: unknown;
32
+ }, boundary?: ReplyBoundary): MessageContent | null;
33
+ /** `additional_kwargs` key deepagents marks a task notification with. */
34
+ export declare const NOTIFICATION_KEY = "deepagents_notification";
35
+ /**
36
+ * `additional_kwargs` key MDA marks its own notifications with, such as a browser
37
+ * handoff ending (Python only for now), the same way.
38
+ */
39
+ export declare const MDA_NOTIFICATION_KEY = "mda_notification";
11
40
  //# sourceMappingURL=assistant-text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-text.d.ts","sourceRoot":"","sources":["../../src/channels/assistant-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAGlC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAM1E;AAsBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,cAAc,GAAG,IAAI,CAaxB"}
1
+ {"version":3,"file":"assistant-text.d.ts","sourceRoot":"","sources":["../../src/channels/assistant-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAGlC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAM1E;AAsBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,cAAc,GAAG,IAAI,CAaxB;AAED,wDAAwD;AACxD,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7B,QAAQ,GAAE,aAAkB,GAC3B,MAAM,CAQR;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7B,QAAQ,GAAE,aAAkB,GAC3B,cAAc,GAAG,IAAI,CAOvB;AAsCD,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAC1D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Extract the latest usable assistant output from a run or agent state.
3
3
  */
4
4
  import { coerceMessageLikeToMessage, } from "@langchain/core/messages";
5
- import { BaseMessage } from "langchain";
5
+ import { AIMessage, BaseMessage } from "langchain";
6
6
  export function extractAssistantText(input) {
7
7
  for (const message of assistantMessages(input)) {
8
8
  const text = message.text.trim();
@@ -44,4 +44,75 @@ export function extractAssistantContent(input) {
44
44
  }
45
45
  return null;
46
46
  }
47
+ /** A reply that means "nothing to tell the channel". */
48
+ export const QUIET_REPLY = "[quiet]";
49
+ /**
50
+ * What a run says to the channel: each of its answers, oldest first, without
51
+ * `[quiet]` ones. A run with a known start never repeats an earlier run's
52
+ * answer.
53
+ */
54
+ export function extractReplyText(input, boundary = {}) {
55
+ const answers = runAnswers(input, boundary.afterId);
56
+ if (boundary.afterId === undefined && answers.length <= 1)
57
+ return extractAssistantText(input);
58
+ return answers
59
+ .map((answer) => answer.text.trim())
60
+ .filter((text) => text && text !== QUIET_REPLY)
61
+ .join("\n\n");
62
+ }
63
+ /** {@link extractReplyText} as content; several answers are joined as text. */
64
+ export function extractReplyContent(input, boundary = {}) {
65
+ const answers = runAnswers(input, boundary.afterId);
66
+ if (answers.length > 1)
67
+ return extractReplyText(input, boundary) || null;
68
+ if (boundary.afterId === undefined)
69
+ return extractAssistantContent(input);
70
+ const [answer] = answers;
71
+ if (!answer || answer.text.trim() === QUIET_REPLY)
72
+ return null;
73
+ return extractAssistantContent({ messages: [answer] });
74
+ }
75
+ /** The run's answers: assistant messages with text or media and no tool calls. */
76
+ function runAnswers(input, afterId) {
77
+ const messages = (Array.isArray(input.messages) ? input.messages : [])
78
+ .map(asBaseMessage)
79
+ .filter((message) => message !== undefined);
80
+ return messages
81
+ .slice(runStart(messages, afterId))
82
+ .filter((message) => AIMessage.isInstance(message) &&
83
+ !message.tool_calls?.length &&
84
+ (message.text.trim() || hasMedia(message)));
85
+ }
86
+ /** Index of the run's first message; past the end when it can't be found. */
87
+ function runStart(messages, afterId) {
88
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
89
+ const message = messages[index];
90
+ if (afterId !== undefined && message.id === afterId)
91
+ return index + 1;
92
+ if (afterId === undefined &&
93
+ message.type === "human" &&
94
+ !isTaskNotification(message))
95
+ return index;
96
+ }
97
+ return messages.length;
98
+ }
99
+ /** `additional_kwargs` key deepagents marks a task notification with. */
100
+ export const NOTIFICATION_KEY = "deepagents_notification";
101
+ /**
102
+ * `additional_kwargs` key MDA marks its own notifications with, such as a browser
103
+ * handoff ending (Python only for now), the same way.
104
+ */
105
+ export const MDA_NOTIFICATION_KEY = "mda_notification";
106
+ /** A user-role message deepagents or MDA sent with news, not the user's. */
107
+ function isTaskNotification(message) {
108
+ const extra = message.additional_kwargs ?? {};
109
+ return (Object.hasOwn(extra, NOTIFICATION_KEY) ||
110
+ Object.hasOwn(extra, MDA_NOTIFICATION_KEY));
111
+ }
112
+ /** Content block types that make a reply on their own, without text. */
113
+ const MEDIA_BLOCKS = new Set(["image", "image_url", "file", "audio", "video"]);
114
+ function hasMedia(message) {
115
+ return (Array.isArray(message.content) &&
116
+ message.content.some((block) => typeof block === "object" && MEDIA_BLOCKS.has(block.type)));
117
+ }
47
118
  //# sourceMappingURL=assistant-text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-text.js","sourceRoot":"","sources":["../../src/channels/assistant-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,0BAA0B,GAG3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,KAA6B;IAChE,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,iFAAiF;AACjF,QAAQ,CAAC,CAAC,iBAAiB,CAAC,KAE3B;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI;YAAE,MAAM,OAAO,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB;IACrC,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,0BAA0B,CAAC,OAA0B,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAEvC;IACC,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,IAAI,EAAE;gBAAE,OAAO,OAAO,CAAC;YACnC,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"assistant-text.js","sourceRoot":"","sources":["../../src/channels/assistant-text.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,40 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import type { ChannelMessagingAdapter } from "./runtime.js";
3
- import type { ChannelInfo, RuntimeChannel } from "./types.js";
3
+ import type { ChannelEvent, ChannelInfo, JsonValue, RuntimeChannel } from "./types.js";
4
4
  import { type ChannelContext } from "../run-context.js";
5
+ import { type OriginBinding, type StoredOrigin } from "../runtime/thread-record.js";
6
+ import type { RunThread } from "../runtime/managed-thread.js";
5
7
  export declare const SLACK_BOT_TOKEN_ENV = "SLACK_BOT_TOKEN";
6
8
  /** The serializable channel data sent by managed ingress. */
7
9
  export type ChannelBinding = ChannelContext;
10
+ /**
11
+ * The binding whose message event holds a run's own input, in place of the
12
+ * delivery's messages, such as a handler's.
13
+ */
14
+ export declare function bindingWithMessages(binding: ChannelBinding, messages: readonly Readonly<Record<string, JsonValue>>[]): ChannelBinding;
8
15
  export declare const currentChannelBinding: AsyncLocalStorage<{
9
16
  binding?: ChannelBinding;
10
17
  channelRun: boolean;
11
18
  /** Cron routing split out of a managed run's context, and what remains. */
12
19
  routing?: Record<string, unknown>;
13
20
  context?: unknown;
21
+ /** The run's thread, built once when the run starts. */
22
+ thread?: RunThread;
14
23
  }>;
15
24
  /** Validate delivery context against the authenticated source and declared channel. */
16
25
  export declare function resolveChannelBinding(context: unknown, configurable: Record<string, unknown> | undefined): ChannelBinding | undefined;
26
+ /**
27
+ * The binding a thread record's origin names, when this deployment declares
28
+ * its channel. The record is trusted as it is: the auth handler lets only
29
+ * managed ingress write one.
30
+ */
31
+ export declare function resolveOriginBinding(origin: StoredOrigin): OriginBinding | undefined;
17
32
  export declare function resolveChannelInfo(context: unknown, configurable: Record<string, unknown> | undefined): ChannelInfo | undefined;
18
33
  export declare function resolveRuntimeChannel(context: unknown, configurable: Record<string, unknown> | undefined, transportFactory?: (provider: string) => ChannelMessagingAdapter | undefined): RuntimeChannel | undefined;
34
+ /** A runtime channel that posts to a binding's target. */
35
+ export declare function runtimeChannelFor(binding: OriginBinding & {
36
+ rawEvent?: JsonValue;
37
+ }, event: ChannelEvent | null, transportFactory?: (provider: string) => ChannelMessagingAdapter | undefined): RuntimeChannel;
19
38
  /** Trusted ingress source for telemetry; direct HTTP callers have no channel stamp. */
20
39
  export declare function resolveChannelProvider(configurable: Record<string, unknown> | undefined): string | undefined;
21
40
  //# sourceMappingURL=binding.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/channels/binding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAO5D,OAAO,KAAK,EAAE,WAAW,EAAa,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9E,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,6DAA6D;AAC7D,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC;AAE5C,eAAO,MAAM,qBAAqB;cACtB,cAAc;gBACZ,OAAO;IACnB,2EAA2E;cACjE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;cACvB,OAAO;EACf,CAAC;AAiBL,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,cAAc,GAAG,SAAS,CAwB5B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,WAAW,GAAG,SAAS,CAGzB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,uBAAuB,GAAG,SAAS,GAC3E,cAAc,GAAG,SAAS,CAa5B;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,MAAM,GAAG,SAAS,CAYpB"}
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/channels/binding.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAO5D,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,6DAA6D;AAC7D,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,GACvD,cAAc,CAWhB;AAED,eAAO,MAAM,qBAAqB;cACtB,cAAc;gBACZ,OAAO;IACnB,2EAA2E;cACjE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;cACvB,OAAO;IACjB,wDAAwD;aAC/C,SAAS;EAChB,CAAC;AAiBL,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,cAAc,GAAG,SAAS,CAe5B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GACnB,aAAa,GAAG,SAAS,CAG3B;AAYD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,WAAW,GAAG,SAAS,CAGzB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,uBAAuB,GAAG,SAAS,GAC3E,cAAc,GAAG,SAAS,CAI5B;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EACjD,KAAK,EAAE,YAAY,GAAG,IAAI,EAC1B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,uBAAuB,GAAG,SAAS,GAC3E,cAAc,CAWhB;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAChD,MAAM,GAAG,SAAS,CAYpB"}
@@ -7,7 +7,21 @@ import { channelProviderForName, messagingTransportForName, } from "./messaging-
7
7
  import { createTriggerClient } from "./trigger/client.js";
8
8
  import { createTriggerTransport } from "./trigger/transport.js";
9
9
  import { channelContextSchema } from "../run-context.js";
10
+ import { bindingFromOrigin, } from "../runtime/thread-record.js";
10
11
  export const SLACK_BOT_TOKEN_ENV = "SLACK_BOT_TOKEN";
12
+ /**
13
+ * The binding whose message event holds a run's own input, in place of the
14
+ * delivery's messages, such as a handler's.
15
+ */
16
+ export function bindingWithMessages(binding, messages) {
17
+ return {
18
+ ...binding,
19
+ event: {
20
+ type: "message",
21
+ messages: messages,
22
+ },
23
+ };
24
+ }
11
25
  export const currentChannelBinding = new AsyncLocalStorage();
12
26
  function record(value) {
13
27
  return value !== null && typeof value === "object" && !Array.isArray(value);
@@ -30,16 +44,27 @@ export function resolveChannelBinding(context, configurable) {
30
44
  const user = configurable?.langgraph_auth_user;
31
45
  if (!record(user) ||
32
46
  user.mda_source_provider !== binding.provider ||
33
- user.mda_source_thread_id !== binding.sourceThreadKey ||
34
- channelProviderForName(binding.name) !== binding.provider)
47
+ user.mda_source_thread_id !== binding.sourceThreadKey)
35
48
  return undefined;
36
- if (binding.transport === "trigger_server") {
37
- const target = triggerTargetSchema.safeParse(binding.target);
38
- if (!target.success ||
39
- target.data.source_thread_key !== binding.sourceThreadKey)
40
- return undefined;
41
- }
42
- return binding;
49
+ return isDeclaredBinding(binding) ? binding : undefined;
50
+ }
51
+ /**
52
+ * The binding a thread record's origin names, when this deployment declares
53
+ * its channel. The record is trusted as it is: the auth handler lets only
54
+ * managed ingress write one.
55
+ */
56
+ export function resolveOriginBinding(origin) {
57
+ const binding = bindingFromOrigin(origin);
58
+ return binding && isDeclaredBinding(binding) ? binding : undefined;
59
+ }
60
+ /** Whether a declared channel of the binding's provider can reach its target. */
61
+ function isDeclaredBinding(binding) {
62
+ if (channelProviderForName(binding.name) !== binding.provider)
63
+ return false;
64
+ if (binding.transport !== "trigger_server")
65
+ return true;
66
+ const target = triggerTargetSchema.safeParse(binding.target);
67
+ return (target.success && target.data.source_thread_key === binding.sourceThreadKey);
43
68
  }
44
69
  export function resolveChannelInfo(context, configurable) {
45
70
  const binding = resolveChannelBinding(context, configurable);
@@ -49,6 +74,10 @@ export function resolveRuntimeChannel(context, configurable, transportFactory) {
49
74
  const binding = resolveChannelBinding(context, configurable);
50
75
  if (!binding)
51
76
  return undefined;
77
+ return runtimeChannelFor(binding, binding.event, transportFactory);
78
+ }
79
+ /** A runtime channel that posts to a binding's target. */
80
+ export function runtimeChannelFor(binding, event, transportFactory) {
52
81
  let transport;
53
82
  if (binding.transport === "trigger_server") {
54
83
  const client = createTriggerClient();
@@ -60,7 +89,7 @@ export function resolveRuntimeChannel(context, configurable, transportFactory) {
60
89
  messagingTransportForName(binding.name) ??
61
90
  transportFactory?.(binding.provider);
62
91
  }
63
- return createRuntimeChannel({ ...binding, transport });
92
+ return createRuntimeChannel({ ...binding, event, transport });
64
93
  }
65
94
  /** Trusted ingress source for telemetry; direct HTTP callers have no channel stamp. */
66
95
  export function resolveChannelProvider(configurable) {
@@ -1 +1 @@
1
- {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/channels/binding.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,oBAAoB,EAAuB,MAAM,mBAAmB,CAAC;AAE9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAIrD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,iBAAiB,EAMtD,CAAC;AAEL,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7E,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,EAC9C,uBAAuB,CACxB,CAAC;AACF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,gBAAgB;IACzB,iBAAiB,EAAE,cAAc;CAClC,CAAC,CAAC;AAEH,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,YAAiD;IAEjD,MAAM,GAAG,GACP,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACnD,qBAAqB,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;IAC5C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,YAAY,EAAE,mBAAmB,CAAC;IAC/C,IACE,CAAC,MAAM,CAAC,IAAI,CAAC;QACb,IAAI,CAAC,mBAAmB,KAAK,OAAO,CAAC,QAAQ;QAC7C,IAAI,CAAC,oBAAoB,KAAK,OAAO,CAAC,eAAe;QACrD,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ;QAEzD,OAAO,SAAS,CAAC;IACnB,IAAI,OAAO,CAAC,SAAS,KAAK,gBAAgB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,IACE,CAAC,MAAM,CAAC,OAAO;YACf,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,OAAO,CAAC,eAAe;YAEzD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAgB,EAChB,YAAiD;IAEjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,YAAiD,EACjD,gBAA4E;IAE5E,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,SAA8C,CAAC;IACnD,IAAI,OAAO,CAAC,SAAS,KAAK,gBAAgB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,IAAI,MAAM;YAAE,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,SAAS;YACP,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC;gBACvC,gBAAgB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,oBAAoB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,sBAAsB,CACpC,YAAiD;IAEjD,MAAM,IAAI,GAAG,YAAY,EAAE,mBAAmB,CAAC;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAI,IAA0C;SACzD,mBAAmB,CAAC;IACvB,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,QAAQ,KAAK,QAAQ;YAC5B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/channels/binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CompiledStateGraph } from "@langchain/langgraph";
2
+ import type { RunThread } from "../runtime/managed-thread.js";
3
+ type Graph = Pick<CompiledStateGraph<unknown, unknown>, "getState" | "getStateHistory">;
4
+ /**
5
+ * Deliver a finished top-level run's result to its thread's origin. A thread
6
+ * without an origin gets nothing.
7
+ *
8
+ * Failures follow what each channel did before: a Trigger post and any
9
+ * scheduled delivery fail the run; a direct channel's post is logged and the
10
+ * run still succeeds.
11
+ */
12
+ export declare function deliverRunResult(graph: Graph, run: RunThread,
13
+ /** The Agent Server run and its assistant, for notices and their links. */
14
+ { runId, assistantId }?: {
15
+ runId?: string;
16
+ assistantId?: string;
17
+ }): Promise<void>;
18
+ /** The Trigger post id for a run's answer, stable across retries. */
19
+ export declare function replyActionId(runId: string): string;
20
+ export {};
21
+ //# sourceMappingURL=delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/channels/delivery.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAiB,MAAM,sBAAsB,CAAC;AAI9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAmB9D,KAAK,KAAK,GAAG,IAAI,CACf,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EACpC,UAAU,GAAG,iBAAiB,CAC/B,CAAC;AAGF;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,SAAS;AACd,2EAA2E;AAC3E,EAAE,KAAK,EAAE,WAAW,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACpE,OAAO,CAAC,IAAI,CAAC,CAgCf;AA+BD,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * The run's one delivery step: when the run ends, its answer goes to the
3
+ * thread's origin, and a paused Trigger run reports what it waits on.
4
+ *
5
+ * The run does it, not the process that received the event, so a restart of
6
+ * that process loses nothing, and a run LangSmith Studio resumes answers the
7
+ * conversation the paused run came from.
8
+ */
9
+ import { randomUUID } from "node:crypto";
10
+ import { v5 as uuidv5 } from "uuid";
11
+ import { z } from "zod";
12
+ import { triggerTargetSchema } from "../runtime/thread-record.js";
13
+ import { logger } from "../runtime/log.js";
14
+ import { QUIET_REPLY, extractReplyContent, extractReplyText, } from "./assistant-text.js";
15
+ import { channelAutoRepliesForName, messagingTransportForName, pausedNoticeForName, } from "./messaging-registry.js";
16
+ import { createTriggerClient } from "./trigger/client.js";
17
+ import { resolveTracerSessionId } from "./trigger/tracing-project.js";
18
+ import { createTriggerTransport } from "./trigger/transport.js";
19
+ /**
20
+ * Deliver a finished top-level run's result to its thread's origin. A thread
21
+ * without an origin gets nothing.
22
+ *
23
+ * Failures follow what each channel did before: a Trigger post and any
24
+ * scheduled delivery fail the run; a direct channel's post is logged and the
25
+ * run still succeeds.
26
+ */
27
+ export async function deliverRunResult(graph, run,
28
+ /** The Agent Server run and its assistant, for notices and their links. */
29
+ { runId, assistantId } = {}) {
30
+ const { thread, origin } = run;
31
+ if (!thread || !origin)
32
+ return;
33
+ const config = { configurable: { thread_id: thread.id } };
34
+ const state = await graph.getState(config);
35
+ const interrupts = pendingInterrupts(state);
36
+ if (interrupts.length) {
37
+ if (origin.transport === "trigger_server")
38
+ await reportInterrupted(origin, thread.id, runId, interrupts);
39
+ else
40
+ await noticePaused(origin, thread.id, assistantId);
41
+ return;
42
+ }
43
+ // A static breakpoint stopped the run before it finished: no answer yet.
44
+ if (state.next.length > 0)
45
+ return;
46
+ // A channel declared with `reply: "none"` leaves replying to the agent.
47
+ if (!channelAutoRepliesForName(origin.name))
48
+ return;
49
+ const values = { messages: messagesOf(state.values) };
50
+ const boundary = await replyBoundary(graph, config, values.messages);
51
+ if (extractReplyText(values, boundary).trim() === QUIET_REPLY)
52
+ return;
53
+ const content = origin.transport === "trigger_server"
54
+ ? extractReplyText(values, boundary) || null
55
+ : extractReplyContent(values, boundary);
56
+ if (content === null)
57
+ return;
58
+ const scheduled = origin.event?.type === "schedule";
59
+ try {
60
+ await post(origin, content, runId);
61
+ }
62
+ catch (error) {
63
+ if (scheduled || origin.transport === "trigger_server")
64
+ throw error;
65
+ // The answer stays in the thread; the run itself succeeded.
66
+ logger.error(`channel reply failed (${logger.safeErrorLabel(error)})`);
67
+ }
68
+ }
69
+ async function post(origin, content, runId) {
70
+ const newThread = origin.event?.type === "schedule" ? origin.event.new_thread : undefined;
71
+ const message = { type: "content", content };
72
+ if (origin.transport === "trigger_server") {
73
+ const client = createTriggerClient();
74
+ if (!client)
75
+ throw new Error("channel delivery is not configured");
76
+ // A retried run posts its answer once.
77
+ await createTriggerTransport(client, {
78
+ actionId: runId ? replyActionId(runId) : randomUUID(),
79
+ }).post({ message, target: origin.target, newThread });
80
+ return;
81
+ }
82
+ const transport = messagingTransportForName(origin.name);
83
+ if (!transport)
84
+ throw new Error(`channel delivery is unavailable: no channel ${JSON.stringify(logger.logIdentifier(origin.name))}`);
85
+ await transport.post({
86
+ message,
87
+ target: origin.target,
88
+ ...(newThread !== undefined && { newThread }),
89
+ });
90
+ }
91
+ /** The Trigger post id for a run's answer, stable across retries. */
92
+ export function replyActionId(runId) {
93
+ return uuidv5(`mda-reply:${runId}`, uuidv5.URL);
94
+ }
95
+ /**
96
+ * Where the run's messages start: after the last message of the latest
97
+ * checkpoint the run's input made. A resume makes none, so it counts from the
98
+ * paused run's input. Without one, the reply falls back to the answers since
99
+ * the last user message.
100
+ */
101
+ async function replyBoundary(graph, config, messages) {
102
+ let input;
103
+ for await (const snapshot of graph.getStateHistory(config, {
104
+ filter: { source: "input" },
105
+ limit: 1,
106
+ })) {
107
+ input = snapshot;
108
+ break;
109
+ }
110
+ // A checkpointer may ignore the filter.
111
+ if (input?.metadata?.source !== "input")
112
+ return {};
113
+ const before = messagesOf(input.values);
114
+ const afterId = Array.isArray(before) ? messageId(before.at(-1)) : undefined;
115
+ const final = Array.isArray(messages) ? messages : [];
116
+ return afterId !== undefined &&
117
+ final.some((message) => messageId(message) === afterId)
118
+ ? { afterId }
119
+ : {};
120
+ }
121
+ /** The `messages` of graph state values, when they are an object. */
122
+ function messagesOf(values) {
123
+ return isObject(values) ? values.messages : undefined;
124
+ }
125
+ function messageId(message) {
126
+ const id = isObject(message) ? message.id : undefined;
127
+ return typeof id === "string" && id ? id : undefined;
128
+ }
129
+ function isObject(value) {
130
+ return typeof value === "object" && value !== null;
131
+ }
132
+ /** An interrupt Trigger can resume: a non-blank id, with its value. */
133
+ const interruptSchema = z.object({
134
+ id: z.string().refine((id) => id.trim().length > 0),
135
+ value: z.unknown(),
136
+ response_schema: z.unknown().optional(),
137
+ });
138
+ /** The interrupts the run stopped on, as Trigger forwards them. */
139
+ function pendingInterrupts(state) {
140
+ return state.tasks.flatMap((task) => (task.interrupts ?? []).flatMap((entry) => {
141
+ const parsed = interruptSchema.safeParse(entry);
142
+ if (!parsed.success)
143
+ return [];
144
+ const { id, value, response_schema: schema } = parsed.data;
145
+ return [
146
+ { id, value, ...(isObject(schema) && { response_schema: schema }) },
147
+ ];
148
+ }));
149
+ }
150
+ /**
151
+ * Tell a direct channel's conversation the run waits on a decision, with a
152
+ * Studio link to this thread, when the channel has such a notice. Best
153
+ * effort: it never fails the run.
154
+ */
155
+ async function noticePaused(origin, threadId, assistantId) {
156
+ const notice = pausedNoticeForName(origin.name);
157
+ if (!notice)
158
+ return;
159
+ try {
160
+ await notice(origin.target, { threadId, ...(assistantId && { assistantId }) }, "interrupted");
161
+ }
162
+ catch (error) {
163
+ logger.error(`channel paused notice failed (${logger.safeErrorLabel(error)})`);
164
+ }
165
+ }
166
+ /** Tell Trigger the run waits on a decision. Best effort: it never fails the run. */
167
+ async function reportInterrupted(origin, threadId, runId, interrupts) {
168
+ const target = triggerTargetSchema.safeParse(origin.target);
169
+ try {
170
+ if (!target.success) {
171
+ logger.warn("channel interrupt was not reported: invalid Trigger target");
172
+ return;
173
+ }
174
+ const client = createTriggerClient();
175
+ if (!client || !runId) {
176
+ logger.warn("channel interrupt was not reported: no run or transport");
177
+ return;
178
+ }
179
+ const tracerSessionId = await resolveTracerSessionId();
180
+ await client.postRuntimeEvent(target.data.channel_id, {
181
+ id: randomUUID(),
182
+ type: "run.interrupted",
183
+ delivery_id: origin.deliveryId,
184
+ source_thread_key: origin.sourceThreadKey,
185
+ address: target.data.address,
186
+ run_thread_id: threadId,
187
+ run_id: runId,
188
+ interrupts,
189
+ ...(tracerSessionId ? { tracer_session_id: tracerSessionId } : {}),
190
+ });
191
+ }
192
+ catch (error) {
193
+ logger.warn(`channel interrupt was not reported (${logger.safeErrorLabel(error)})`);
194
+ }
195
+ }
196
+ //# sourceMappingURL=delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/channels/delivery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAKjB,MAAM,kBAAkB,CAAC;AA+B1B,OAAO,KAAK,EAEV,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAWpB,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CAwD7E;AAoDD,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAKjB,MAAM,kBAAkB,CAAC;AAiC1B,OAAO,KAAK,EAEV,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAWpB,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CA0D7E;AAmDD,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -1,7 +1,8 @@
1
1
  import { channelThreadId, httpChannel, } from "../http/index.js";
2
- import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, finishEvents, receiveEvents, verifyHmacSha256, } from "../http/provider.js";
2
+ import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, eventThread, finishEvents, receiveEvents, verifyHmacSha256, } from "../http/provider.js";
3
3
  import { isEndpointCallback } from "../http/endpoint.js";
4
4
  import { interruptedNotice, pendingDecision } from "../http/studio.js";
5
+ import { withPausedNotice } from "../messaging-registry.js";
5
6
  import { logger } from "../../runtime/log.js";
6
7
  import { connections } from "../../connections.js";
7
8
  import { ConnectionsNotConfiguredError } from "../../agent-auth.js";
@@ -37,19 +38,20 @@ export function githubChannel(options = {}) {
37
38
  channel: { name: channelName(channel) },
38
39
  }),
39
40
  onReceived: receiveEvents(options.onReceived, githubEvent, () => channelName(channel)),
40
- onFinish: finishEvents((target, delivery) => notifyInterrupted(handlers, target, delivery, channelName(channel)), options.onFinish, githubEvent, () => channelName(channel)),
41
+ onFinish: finishEvents((target, delivery) => notifyWaiting(handlers, target, delivery, channelName(channel)), options.onFinish, githubEvent, (delivery) => eventThread(delivery, channelName(channel))),
41
42
  });
42
- return channel;
43
+ // A run that stops on interrupts says so itself (../delivery.ts): the
44
+ // handler accepted the event that started it.
45
+ return withPausedNotice(channel, postInterruptedNotice);
43
46
  }
44
47
  /**
45
- * Tell the issue or pull request when its thread waits on a decision. Only
46
- * for an event its handler would act on, so the handler's filters, such as
47
- * trusted senders or mentions, decide who gets a notice. The handler knows it
48
- * is only asked, so it can skip side effects.
48
+ * Tell the issue or pull request that a new event found its thread waiting
49
+ * on a decision. Only for an event its handler would act on, so the handler's
50
+ * filters, such as trusted senders or mentions, decide who gets a notice. The
51
+ * handler knows it is only asked, so it can skip side effects.
49
52
  */
50
- async function notifyInterrupted(handlers, target, delivery, name) {
51
- const pending = pendingDecision(delivery);
52
- if (!pending)
53
+ async function notifyWaiting(handlers, target, delivery, name) {
54
+ if (pendingDecision(delivery) !== "waiting")
53
55
  return;
54
56
  if ((await handlerInput(handlers, delivery.rawEvent, {
55
57
  id: delivery.threadId,
@@ -57,7 +59,7 @@ async function notifyInterrupted(handlers, target, delivery, name) {
57
59
  interrupted: true,
58
60
  })) === undefined)
59
61
  return;
60
- await postInterruptedNotice(target, delivery, pending);
62
+ await postInterruptedNotice(target, delivery, "waiting");
61
63
  }
62
64
  /** The App options deploy reads, without unset fields. */
63
65
  function appConfig(app) {