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

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 (257) hide show
  1. package/README.md +530 -83
  2. package/dist/browser.d.ts +37 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +31 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/channels/actor.d.ts +43 -0
  7. package/dist/channels/actor.d.ts.map +1 -0
  8. package/dist/channels/actor.js +2 -0
  9. package/dist/channels/actor.js.map +1 -0
  10. package/dist/channels/assistant-text.d.ts +29 -0
  11. package/dist/channels/assistant-text.d.ts.map +1 -1
  12. package/dist/channels/assistant-text.js +72 -1
  13. package/dist/channels/assistant-text.js.map +1 -1
  14. package/dist/channels/binding.d.ts +20 -1
  15. package/dist/channels/binding.d.ts.map +1 -1
  16. package/dist/channels/binding.js +44 -11
  17. package/dist/channels/binding.js.map +1 -1
  18. package/dist/channels/delivery.d.ts +36 -0
  19. package/dist/channels/delivery.d.ts.map +1 -0
  20. package/dist/channels/delivery.js +359 -0
  21. package/dist/channels/delivery.js.map +1 -0
  22. package/dist/channels/github/app-setup.d.ts +32 -0
  23. package/dist/channels/github/app-setup.d.ts.map +1 -0
  24. package/dist/channels/github/app-setup.js +146 -0
  25. package/dist/channels/github/app-setup.js.map +1 -0
  26. package/dist/channels/github/index.d.ts.map +1 -1
  27. package/dist/channels/github/index.js +21 -33
  28. package/dist/channels/github/index.js.map +1 -1
  29. package/dist/channels/github/schema.d.ts +50 -1
  30. package/dist/channels/github/schema.d.ts.map +1 -1
  31. package/dist/channels/github/schema.js +12 -0
  32. package/dist/channels/github/schema.js.map +1 -1
  33. package/dist/channels/http/endpoint.d.ts +6 -4
  34. package/dist/channels/http/endpoint.d.ts.map +1 -1
  35. package/dist/channels/http/endpoint.js.map +1 -1
  36. package/dist/channels/http/http.d.ts.map +1 -1
  37. package/dist/channels/http/http.js +4 -10
  38. package/dist/channels/http/http.js.map +1 -1
  39. package/dist/channels/http/index.d.ts +6 -0
  40. package/dist/channels/http/index.d.ts.map +1 -1
  41. package/dist/channels/http/index.js +32 -23
  42. package/dist/channels/http/index.js.map +1 -1
  43. package/dist/channels/http/ingress.d.ts +2 -2
  44. package/dist/channels/http/ingress.d.ts.map +1 -1
  45. package/dist/channels/http/ingress.js +9 -21
  46. package/dist/channels/http/ingress.js.map +1 -1
  47. package/dist/channels/http/provider.d.ts +10 -5
  48. package/dist/channels/http/provider.d.ts.map +1 -1
  49. package/dist/channels/http/provider.js +17 -10
  50. package/dist/channels/http/provider.js.map +1 -1
  51. package/dist/channels/http/studio.d.ts +5 -5
  52. package/dist/channels/http/studio.d.ts.map +1 -1
  53. package/dist/channels/http/studio.js +4 -6
  54. package/dist/channels/http/studio.js.map +1 -1
  55. package/dist/channels/http/types.d.ts +7 -1
  56. package/dist/channels/http/types.d.ts.map +1 -1
  57. package/dist/channels/linear/app-setup.d.ts +29 -0
  58. package/dist/channels/linear/app-setup.d.ts.map +1 -0
  59. package/dist/channels/linear/app-setup.js +102 -0
  60. package/dist/channels/linear/app-setup.js.map +1 -0
  61. package/dist/channels/linear/index.d.ts.map +1 -1
  62. package/dist/channels/linear/index.js +26 -65
  63. package/dist/channels/linear/index.js.map +1 -1
  64. package/dist/channels/linear/schema.d.ts +11 -25
  65. package/dist/channels/linear/schema.d.ts.map +1 -1
  66. package/dist/channels/linear/schema.js +6 -0
  67. package/dist/channels/linear/schema.js.map +1 -1
  68. package/dist/channels/linear/types.d.ts +9 -2
  69. package/dist/channels/linear/types.d.ts.map +1 -1
  70. package/dist/channels/messaging-registry.d.ts +16 -0
  71. package/dist/channels/messaging-registry.d.ts.map +1 -1
  72. package/dist/channels/messaging-registry.js +29 -0
  73. package/dist/channels/messaging-registry.js.map +1 -1
  74. package/dist/channels/reserved-connections.d.ts.map +1 -1
  75. package/dist/channels/reserved-connections.js +10 -0
  76. package/dist/channels/reserved-connections.js.map +1 -1
  77. package/dist/channels/run-input.d.ts +11 -0
  78. package/dist/channels/run-input.d.ts.map +1 -1
  79. package/dist/channels/run-input.js +18 -8
  80. package/dist/channels/run-input.js.map +1 -1
  81. package/dist/channels/runtime.d.ts +5 -2
  82. package/dist/channels/runtime.d.ts.map +1 -1
  83. package/dist/channels/runtime.js +19 -10
  84. package/dist/channels/runtime.js.map +1 -1
  85. package/dist/channels/schedule-delivery.d.ts +2 -13
  86. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  87. package/dist/channels/schedule-delivery.js +6 -73
  88. package/dist/channels/schedule-delivery.js.map +1 -1
  89. package/dist/channels/slack/api.d.ts +2 -0
  90. package/dist/channels/slack/api.d.ts.map +1 -1
  91. package/dist/channels/slack/api.js +6 -0
  92. package/dist/channels/slack/api.js.map +1 -1
  93. package/dist/channels/slack/connections.d.ts +6 -0
  94. package/dist/channels/slack/connections.d.ts.map +1 -0
  95. package/dist/channels/slack/connections.js +6 -0
  96. package/dist/channels/slack/connections.js.map +1 -0
  97. package/dist/channels/slack/events.d.ts +272 -0
  98. package/dist/channels/slack/events.d.ts.map +1 -0
  99. package/dist/channels/slack/events.js +235 -0
  100. package/dist/channels/slack/events.js.map +1 -0
  101. package/dist/channels/slack/files.d.ts.map +1 -1
  102. package/dist/channels/slack/files.js +2 -3
  103. package/dist/channels/slack/files.js.map +1 -1
  104. package/dist/channels/slack/index.d.ts +44 -2
  105. package/dist/channels/slack/index.d.ts.map +1 -1
  106. package/dist/channels/slack/index.js +127 -3
  107. package/dist/channels/slack/index.js.map +1 -1
  108. package/dist/channels/slack/message-content.d.ts.map +1 -1
  109. package/dist/channels/slack/message-content.js +23 -28
  110. package/dist/channels/slack/message-content.js.map +1 -1
  111. package/dist/channels/slack/status.d.ts +76 -0
  112. package/dist/channels/slack/status.d.ts.map +1 -0
  113. package/dist/channels/slack/status.js +427 -0
  114. package/dist/channels/slack/status.js.map +1 -0
  115. package/dist/channels/trigger/client.d.ts.map +1 -1
  116. package/dist/channels/trigger/client.js +6 -9
  117. package/dist/channels/trigger/client.js.map +1 -1
  118. package/dist/channels/trigger/conversation.d.ts +11 -0
  119. package/dist/channels/trigger/conversation.d.ts.map +1 -0
  120. package/dist/channels/trigger/conversation.js +72 -0
  121. package/dist/channels/trigger/conversation.js.map +1 -0
  122. package/dist/channels/trigger/http.d.ts +123 -4
  123. package/dist/channels/trigger/http.d.ts.map +1 -1
  124. package/dist/channels/trigger/http.js +331 -76
  125. package/dist/channels/trigger/http.js.map +1 -1
  126. package/dist/channels/trigger/ingress.d.ts +70 -1
  127. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  128. package/dist/channels/trigger/ingress.js +136 -7
  129. package/dist/channels/trigger/ingress.js.map +1 -1
  130. package/dist/channels/trigger/transport.d.ts +10 -0
  131. package/dist/channels/trigger/transport.d.ts.map +1 -1
  132. package/dist/channels/trigger/transport.js +25 -9
  133. package/dist/channels/trigger/transport.js.map +1 -1
  134. package/dist/channels/trigger/types.d.ts +92 -3
  135. package/dist/channels/trigger/types.d.ts.map +1 -1
  136. package/dist/channels/trigger/types.js +36 -0
  137. package/dist/channels/trigger/types.js.map +1 -1
  138. package/dist/channels/types.d.ts +43 -4
  139. package/dist/channels/types.d.ts.map +1 -1
  140. package/dist/channels/types.js +2 -0
  141. package/dist/channels/types.js.map +1 -1
  142. package/dist/define-deep-agent.d.ts +2 -2
  143. package/dist/define-deep-agent.d.ts.map +1 -1
  144. package/dist/define-deep-agent.js +53 -8
  145. package/dist/define-deep-agent.js.map +1 -1
  146. package/dist/index.d.ts +9 -4
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +2 -1
  149. package/dist/index.js.map +1 -1
  150. package/dist/ingress/runs.d.ts +22 -0
  151. package/dist/ingress/runs.d.ts.map +1 -1
  152. package/dist/ingress/runs.js +45 -1
  153. package/dist/ingress/runs.js.map +1 -1
  154. package/dist/managed-composition.d.ts +3 -0
  155. package/dist/managed-composition.d.ts.map +1 -1
  156. package/dist/managed-composition.js +29 -13
  157. package/dist/managed-composition.js.map +1 -1
  158. package/dist/namespaces.d.ts +0 -21
  159. package/dist/namespaces.d.ts.map +1 -1
  160. package/dist/namespaces.js +0 -29
  161. package/dist/namespaces.js.map +1 -1
  162. package/dist/runtime/async-subagents.d.ts +27 -0
  163. package/dist/runtime/async-subagents.d.ts.map +1 -0
  164. package/dist/runtime/async-subagents.js +139 -0
  165. package/dist/runtime/async-subagents.js.map +1 -0
  166. package/dist/runtime/auth.d.ts +1 -2
  167. package/dist/runtime/auth.d.ts.map +1 -1
  168. package/dist/runtime/auth.js +125 -63
  169. package/dist/runtime/auth.js.map +1 -1
  170. package/dist/runtime/backend.d.ts +7 -0
  171. package/dist/runtime/backend.d.ts.map +1 -1
  172. package/dist/runtime/backend.js +32 -7
  173. package/dist/runtime/backend.js.map +1 -1
  174. package/dist/runtime/browser-facade.d.ts +10 -0
  175. package/dist/runtime/browser-facade.d.ts.map +1 -0
  176. package/dist/runtime/browser-facade.js +23 -0
  177. package/dist/runtime/browser-facade.js.map +1 -0
  178. package/dist/runtime/browser-langsmith.d.ts +108 -0
  179. package/dist/runtime/browser-langsmith.d.ts.map +1 -0
  180. package/dist/runtime/browser-langsmith.js +379 -0
  181. package/dist/runtime/browser-langsmith.js.map +1 -0
  182. package/dist/runtime/browser-selection.d.ts +10 -0
  183. package/dist/runtime/browser-selection.d.ts.map +1 -0
  184. package/dist/runtime/browser-selection.js +21 -0
  185. package/dist/runtime/browser-selection.js.map +1 -0
  186. package/dist/runtime/browser.d.ts +125 -0
  187. package/dist/runtime/browser.d.ts.map +1 -0
  188. package/dist/runtime/browser.js +606 -0
  189. package/dist/runtime/browser.js.map +1 -0
  190. package/dist/runtime/identity-runtime.d.ts +4 -9
  191. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  192. package/dist/runtime/identity-runtime.js +12 -25
  193. package/dist/runtime/identity-runtime.js.map +1 -1
  194. package/dist/runtime/index.d.ts +38 -1
  195. package/dist/runtime/index.d.ts.map +1 -1
  196. package/dist/runtime/index.js +74 -34
  197. package/dist/runtime/index.js.map +1 -1
  198. package/dist/runtime/managed-thread.d.ts +61 -0
  199. package/dist/runtime/managed-thread.d.ts.map +1 -0
  200. package/dist/runtime/managed-thread.js +76 -0
  201. package/dist/runtime/managed-thread.js.map +1 -0
  202. package/dist/runtime/managed-tools.d.ts +10 -2
  203. package/dist/runtime/managed-tools.d.ts.map +1 -1
  204. package/dist/runtime/managed-tools.js +10 -8
  205. package/dist/runtime/managed-tools.js.map +1 -1
  206. package/dist/runtime/memory/policy.d.ts.map +1 -1
  207. package/dist/runtime/memory/policy.js +1 -3
  208. package/dist/runtime/memory/policy.js.map +1 -1
  209. package/dist/runtime/parent-run.d.ts +33 -0
  210. package/dist/runtime/parent-run.d.ts.map +1 -0
  211. package/dist/runtime/parent-run.js +114 -0
  212. package/dist/runtime/parent-run.js.map +1 -0
  213. package/dist/runtime/run-input.d.ts +14 -1
  214. package/dist/runtime/run-input.d.ts.map +1 -1
  215. package/dist/runtime/run-input.js +75 -6
  216. package/dist/runtime/run-input.js.map +1 -1
  217. package/dist/runtime/sandbox-manager.d.ts +14 -1
  218. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  219. package/dist/runtime/sandbox-manager.js +34 -9
  220. package/dist/runtime/sandbox-manager.js.map +1 -1
  221. package/dist/runtime/schedule-auth.d.ts +79 -0
  222. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  223. package/dist/runtime/schedule-auth.js +163 -6
  224. package/dist/runtime/schedule-auth.js.map +1 -1
  225. package/dist/runtime/static-entry.d.ts.map +1 -1
  226. package/dist/runtime/static-entry.js +1 -0
  227. package/dist/runtime/static-entry.js.map +1 -1
  228. package/dist/runtime/thread-record.d.ts +88 -0
  229. package/dist/runtime/thread-record.d.ts.map +1 -0
  230. package/dist/runtime/thread-record.js +213 -0
  231. package/dist/runtime/thread-record.js.map +1 -0
  232. package/dist/runtime/types.d.ts +12 -1
  233. package/dist/runtime/types.d.ts.map +1 -1
  234. package/dist/runtime-schedules.d.ts +13 -0
  235. package/dist/runtime-schedules.d.ts.map +1 -1
  236. package/dist/runtime-schedules.js +83 -20
  237. package/dist/runtime-schedules.js.map +1 -1
  238. package/dist/sandbox.d.ts +0 -6
  239. package/dist/sandbox.d.ts.map +1 -1
  240. package/dist/sandbox.js +3 -7
  241. package/dist/sandbox.js.map +1 -1
  242. package/dist/schedule-channel.d.ts +5 -2
  243. package/dist/schedule-channel.d.ts.map +1 -1
  244. package/dist/schedule-channel.js +13 -12
  245. package/dist/schedule-channel.js.map +1 -1
  246. package/dist/types.d.ts +19 -2
  247. package/dist/types.d.ts.map +1 -1
  248. package/dist/types.js.map +1 -1
  249. package/dist/values.d.ts +15 -0
  250. package/dist/values.d.ts.map +1 -0
  251. package/dist/values.js +31 -0
  252. package/dist/values.js.map +1 -0
  253. package/package.json +22 -8
  254. package/dist/channels/http/reply.d.ts +0 -20
  255. package/dist/channels/http/reply.d.ts.map +0 -1
  256. package/dist/channels/http/reply.js +0 -116
  257. package/dist/channels/http/reply.js.map +0 -1
@@ -0,0 +1,359 @@
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
+ * A scheduled run that starts a new Trigger thread, with its answer or with a
10
+ * notice that it waits on a decision, hands its own thread to that thread's
11
+ * conversation, so replies and decisions there continue the run.
12
+ */
13
+ import { randomUUID } from "node:crypto";
14
+ import { v5 as uuidv5 } from "uuid";
15
+ import { z } from "zod";
16
+ import { THREAD_CONVERSATION_METADATA, originFromBinding, threadRecordMetadata, triggerTargetSchema, } from "../runtime/thread-record.js";
17
+ import { handOffScheduledThread, scheduleExecution, } from "../runtime/schedule-auth.js";
18
+ import { logger } from "../runtime/log.js";
19
+ import { QUIET_REPLY, extractReplyContent, extractReplyText, } from "./assistant-text.js";
20
+ import { channelAutoRepliesForName, channelProviderForName, messagingTransportForName, pausedNoticeForName, } from "./messaging-registry.js";
21
+ import { deliverScheduleResult, getDeploymentId, isTrustedScheduleDeliveryRun, readScheduleDeliverTo, } from "./schedule-delivery.js";
22
+ import { createTriggerClient } from "./trigger/client.js";
23
+ import { resolveTracerSessionId } from "./trigger/tracing-project.js";
24
+ import { createTriggerTransport, startTriggerThread, } from "./trigger/transport.js";
25
+ /** What a new Trigger thread posted when a scheduled run pauses says. */
26
+ export const PAUSED_NOTICE = "This scheduled run is waiting for a decision.";
27
+ /**
28
+ * Deliver a finished top-level run's result to its thread's origin, or to a
29
+ * scheduled run's `deliverTo`. A thread with neither gets nothing. The Agent
30
+ * Server runs every TypeScript graph run on a thread with a checkpointer, a
31
+ * cron fire without a `thread_id` included, so its state can always be read.
32
+ *
33
+ * Failures follow what each channel did before: a Trigger post and any
34
+ * scheduled delivery fail the run; a direct channel's post is logged and the
35
+ * run still succeeds.
36
+ */
37
+ export async function deliverRunResult(graph, run, delivered = {}) {
38
+ const { thread, origin } = run;
39
+ if (!thread)
40
+ return;
41
+ const delivery = origin ? undefined : scheduledDelivery(delivered);
42
+ if (!origin && !delivery)
43
+ return;
44
+ const deliverTo = delivery?.deliverTo;
45
+ const opening = openingOf(origin, delivery, delivered);
46
+ const { runId, subagent } = delivered;
47
+ const threadId = delivered.runThreadId ?? thread.id;
48
+ const config = { configurable: { thread_id: threadId } };
49
+ const state = await graph.getState(config);
50
+ const interrupts = pendingInterrupts(state);
51
+ if (interrupts.length) {
52
+ if (opening) {
53
+ const opened = await openThread(opening, run, delivered, {
54
+ text: PAUSED_NOTICE,
55
+ actionId: runId ? pausedActionId(runId) : randomUUID(),
56
+ });
57
+ if (opened)
58
+ await reportInterrupted(opened, threadId, runId, interrupts);
59
+ }
60
+ else if (origin?.transport === "trigger_server")
61
+ await reportInterrupted(origin, threadId, runId, interrupts);
62
+ else if (origin)
63
+ await noticePaused(origin, threadId, delivered.assistantId);
64
+ return;
65
+ }
66
+ // A static breakpoint stopped the run before it finished: no answer yet.
67
+ if (state.next.length > 0 || subagent)
68
+ return;
69
+ // A channel declared with `reply: "none"` leaves replying to the agent.
70
+ if (origin && !channelAutoRepliesForName(origin.name))
71
+ return;
72
+ const values = { messages: messagesOf(state.values) };
73
+ const boundary = await replyBoundary(graph, config, values.messages);
74
+ const text = extractReplyText(values, boundary);
75
+ if (text.trim() === QUIET_REPLY)
76
+ return;
77
+ if (opening) {
78
+ if (text)
79
+ await openThread(opening, run, delivered, {
80
+ text,
81
+ actionId: runId ? replyActionId(runId) : randomUUID(),
82
+ });
83
+ return;
84
+ }
85
+ if (!origin) {
86
+ if (deliverTo && text)
87
+ await deliverToTarget(deliverTo, text);
88
+ return;
89
+ }
90
+ const content = origin.transport === "trigger_server"
91
+ ? text || null
92
+ : extractReplyContent(values, boundary);
93
+ if (content === null)
94
+ return;
95
+ const scheduled = origin.event?.type === "schedule";
96
+ try {
97
+ await post(origin, content, runId);
98
+ }
99
+ catch (error) {
100
+ if (scheduled || origin.transport === "trigger_server")
101
+ throw error;
102
+ // The answer stays in the thread; the run itself succeeded.
103
+ logger.error(`channel reply failed (${logger.safeErrorLabel(error)})`);
104
+ }
105
+ }
106
+ /** A compiled schedule's routing: where it delivers, and whether each fire has its own thread. */
107
+ const scheduleRoutingSchema = z.object({
108
+ deliver_to: z.unknown().optional(),
109
+ new_thread: z.boolean().optional(),
110
+ });
111
+ /** A trusted cron fire's schedule routing, when it posts its result to `deliverTo`. */
112
+ function scheduledDelivery(delivered) {
113
+ if (!isTrustedScheduleDeliveryRun(delivered.configurable, delivered.metadata))
114
+ return undefined;
115
+ const schedule = scheduleRoutingSchema.safeParse(delivered.routing?.mda_schedule);
116
+ if (!schedule.success)
117
+ return undefined;
118
+ const deliverTo = readScheduleDeliverTo(schedule.data.deliver_to);
119
+ return deliverTo?.autoPost
120
+ ? { deliverTo, newThread: schedule.data.new_thread === true }
121
+ : undefined;
122
+ }
123
+ /**
124
+ * Where a scheduled run starts a new Trigger thread: a new-thread schedule on
125
+ * a Trigger channel, or a new-thread `deliverTo` conversation Trigger delivers
126
+ * to. A schedule with a fixed thread keeps it.
127
+ */
128
+ function openingOf(origin, delivery, delivered) {
129
+ if (scheduleExecution(delivered.configurable) === undefined)
130
+ return undefined;
131
+ if (origin)
132
+ return origin.transport === "trigger_server" &&
133
+ origin.event?.type === "schedule" &&
134
+ origin.event.new_thread
135
+ ? { via: "channel", origin }
136
+ : undefined;
137
+ return delivery?.newThread === true &&
138
+ delivery.deliverTo.to.type === "provider_conversation" &&
139
+ getDeploymentId() !== undefined &&
140
+ hasTriggerClient()
141
+ ? { via: "deployment", deliverTo: delivery.deliverTo }
142
+ : undefined;
143
+ }
144
+ /** Whether Trigger is configured; a malformed setting leaves `deliverTo` its own fallback. */
145
+ function hasTriggerClient() {
146
+ try {
147
+ return createTriggerClient() !== undefined;
148
+ }
149
+ catch {
150
+ return false;
151
+ }
152
+ }
153
+ /**
154
+ * Post the first message of a new Trigger thread, then hand the run's thread
155
+ * to that thread's conversation. Returns the conversation, unless Trigger
156
+ * could not name the thread it started.
157
+ */
158
+ async function openThread(opening, run, delivered, { text, actionId }) {
159
+ const client = createTriggerClient();
160
+ if (!client)
161
+ throw new Error("channel delivery is not configured");
162
+ let started;
163
+ let name;
164
+ if (opening.via === "channel") {
165
+ name = opening.origin.name;
166
+ started = await startTriggerThread(client, {
167
+ target: opening.origin.target,
168
+ text,
169
+ actionId,
170
+ });
171
+ }
172
+ else {
173
+ name = opening.deliverTo.channel;
174
+ const deploymentId = getDeploymentId();
175
+ if (!deploymentId)
176
+ throw new Error("channel delivery is not configured");
177
+ const result = await client.postDeploymentAction(deploymentId, name, {
178
+ type: "post",
179
+ action_id: actionId,
180
+ address: { conversation_id: opening.deliverTo.to.conversationId },
181
+ follow_thread: true,
182
+ message: { text },
183
+ });
184
+ started = result.thread;
185
+ }
186
+ if (!started) {
187
+ logger.warn("scheduled post started a thread Trigger did not name");
188
+ return undefined;
189
+ }
190
+ const provider = opening.via === "channel"
191
+ ? opening.origin.provider
192
+ : (channelProviderForName(name) ?? name);
193
+ const conversation = {
194
+ name,
195
+ provider,
196
+ transport: "trigger_server",
197
+ sourceThreadKey: started.source_thread_key,
198
+ deliveryId: actionId,
199
+ target: started,
200
+ };
201
+ await handOff(run, delivered, conversation);
202
+ return { ...conversation, event: null };
203
+ }
204
+ /** Make the run's thread the conversation's, keeping its participants. */
205
+ async function handOff(run, delivered, conversation) {
206
+ const execution = scheduleExecution(delivered.configurable);
207
+ if (!execution || !run.thread)
208
+ throw new Error("scheduled thread handoff is unavailable");
209
+ const record = threadRecordMetadata({
210
+ origin: originFromBinding(conversation, null),
211
+ participants: run.thread.participants.map(({ id, role }) => ({ id, role })),
212
+ });
213
+ await handOffScheduledThread({
214
+ thread: run.thread.id,
215
+ execution,
216
+ conversation: {
217
+ provider: conversation.provider,
218
+ source_thread_key: conversation.sourceThreadKey,
219
+ },
220
+ }, { ...record, [THREAD_CONVERSATION_METADATA]: conversation.sourceThreadKey });
221
+ }
222
+ /** Post a `deliverTo` result into an existing conversation; a failure fails the run. */
223
+ async function deliverToTarget(deliverTo, text) {
224
+ const outcome = await deliverScheduleResult({ deliverTo, replyText: text });
225
+ if (outcome === "failed")
226
+ throw new Error("Scheduled channel delivery failed");
227
+ }
228
+ async function post(origin, content, runId) {
229
+ const newThread = origin.event?.type === "schedule" ? origin.event.new_thread : undefined;
230
+ const message = { type: "content", content };
231
+ if (origin.transport === "trigger_server") {
232
+ const client = createTriggerClient();
233
+ if (!client)
234
+ throw new Error("channel delivery is not configured");
235
+ // A retried run posts its answer once.
236
+ await createTriggerTransport(client, {
237
+ actionId: runId ? replyActionId(runId) : randomUUID(),
238
+ }).post({ message, target: origin.target, newThread });
239
+ return;
240
+ }
241
+ const transport = messagingTransportForName(origin.name);
242
+ if (!transport)
243
+ throw new Error(`channel delivery is unavailable: no channel ${JSON.stringify(logger.logIdentifier(origin.name))}`);
244
+ await transport.post({
245
+ message,
246
+ target: origin.target,
247
+ ...(newThread !== undefined && { newThread }),
248
+ });
249
+ }
250
+ /** The Trigger post id of a paused run's notice, stable across retries. */
251
+ function pausedActionId(runId) {
252
+ return uuidv5(`mda-paused:${runId}`, uuidv5.URL);
253
+ }
254
+ /** The Trigger post id for a run's answer, stable across retries. */
255
+ export function replyActionId(runId) {
256
+ return uuidv5(`mda-reply:${runId}`, uuidv5.URL);
257
+ }
258
+ /**
259
+ * Where the run's messages start: after the last message of the latest
260
+ * checkpoint the run's input made. A resume makes none, so it counts from the
261
+ * paused run's input. Without one, the reply falls back to the answers since
262
+ * the last user message.
263
+ */
264
+ async function replyBoundary(graph, config, messages) {
265
+ let input;
266
+ for await (const snapshot of graph.getStateHistory(config, {
267
+ filter: { source: "input" },
268
+ limit: 1,
269
+ })) {
270
+ input = snapshot;
271
+ break;
272
+ }
273
+ // A checkpointer may ignore the filter.
274
+ if (input?.metadata?.source !== "input")
275
+ return {};
276
+ const before = messagesOf(input.values);
277
+ const afterId = Array.isArray(before) ? messageId(before.at(-1)) : undefined;
278
+ const final = Array.isArray(messages) ? messages : [];
279
+ return afterId !== undefined &&
280
+ final.some((message) => messageId(message) === afterId)
281
+ ? { afterId }
282
+ : {};
283
+ }
284
+ /** The `messages` of graph state values, when they are an object. */
285
+ function messagesOf(values) {
286
+ return isObject(values) ? values.messages : undefined;
287
+ }
288
+ function messageId(message) {
289
+ const id = isObject(message) ? message.id : undefined;
290
+ return typeof id === "string" && id ? id : undefined;
291
+ }
292
+ function isObject(value) {
293
+ return typeof value === "object" && value !== null;
294
+ }
295
+ /** An interrupt Trigger can resume: a non-blank id, with its value. */
296
+ const interruptSchema = z.object({
297
+ id: z.string().refine((id) => id.trim().length > 0),
298
+ value: z.unknown(),
299
+ response_schema: z.unknown().optional(),
300
+ });
301
+ /** The interrupts the run stopped on, as Trigger forwards them. */
302
+ function pendingInterrupts(state) {
303
+ return state.tasks.flatMap((task) => (task.interrupts ?? []).flatMap((entry) => {
304
+ const parsed = interruptSchema.safeParse(entry);
305
+ if (!parsed.success)
306
+ return [];
307
+ const { id, value, response_schema: schema } = parsed.data;
308
+ return [
309
+ { id, value, ...(isObject(schema) && { response_schema: schema }) },
310
+ ];
311
+ }));
312
+ }
313
+ /**
314
+ * Tell a direct channel's conversation the run waits on a decision, with a
315
+ * Studio link to this thread, when the channel has such a notice. Best
316
+ * effort: it never fails the run.
317
+ */
318
+ async function noticePaused(origin, threadId, assistantId) {
319
+ const notice = pausedNoticeForName(origin.name);
320
+ if (!notice)
321
+ return;
322
+ try {
323
+ await notice(origin.target, { threadId, ...(assistantId && { assistantId }) }, "interrupted");
324
+ }
325
+ catch (error) {
326
+ logger.error(`channel paused notice failed (${logger.safeErrorLabel(error)})`);
327
+ }
328
+ }
329
+ /** Tell Trigger the run waits on a decision. Best effort: it never fails the run. */
330
+ async function reportInterrupted(origin, threadId, runId, interrupts) {
331
+ const target = triggerTargetSchema.safeParse(origin.target);
332
+ try {
333
+ if (!target.success) {
334
+ logger.warn("channel interrupt was not reported: invalid Trigger target");
335
+ return;
336
+ }
337
+ const client = createTriggerClient();
338
+ if (!client || !runId) {
339
+ logger.warn("channel interrupt was not reported: no run or transport");
340
+ return;
341
+ }
342
+ const tracerSessionId = await resolveTracerSessionId();
343
+ await client.postRuntimeEvent(target.data.channel_id, {
344
+ id: randomUUID(),
345
+ type: "run.interrupted",
346
+ delivery_id: origin.deliveryId,
347
+ source_thread_key: origin.sourceThreadKey,
348
+ address: target.data.address,
349
+ run_thread_id: threadId,
350
+ run_id: runId,
351
+ interrupts,
352
+ ...(tracerSessionId ? { tracer_session_id: tracerSessionId } : {}),
353
+ });
354
+ }
355
+ catch (error) {
356
+ logger.warn(`channel interrupt was not reported (${logger.safeErrorLabel(error)})`);
357
+ }
358
+ }
359
+ //# 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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"}
@@ -0,0 +1,32 @@
1
+ import type { GitHubAppOptions } from "./types.js";
2
+ type PermissionLevel = "read" | "write";
3
+ /** A permission the App asks for, with the handled events that need it. */
4
+ export type AppPermission = {
5
+ name: string;
6
+ level: PermissionLevel;
7
+ /** Empty when the level comes from `app.permissions` or is `metadata`. */
8
+ events: string[];
9
+ };
10
+ /** What `mda deploy` needs to set up the GitHub App. */
11
+ export type GitHubAppSetup = {
12
+ /** The handled event keys, such as `issues.opened`. */
13
+ events: string[];
14
+ /** The webhook events the App subscribes to, such as `issues`. */
15
+ webhookEvents: string[];
16
+ permissions: AppPermission[];
17
+ /** `owner/name`, lowercased and sorted; absent for every repository. */
18
+ repositories?: string[];
19
+ };
20
+ /**
21
+ * The App the channel's handlers and `app` options need. The CLI reads it
22
+ * from the channel's manifest instead of working it out; the Python runtime
23
+ * mirrors these rules in `github_app_setup.py`.
24
+ */
25
+ export declare function githubAppSetup(handlers: object, app: GitHubAppOptions | undefined): GitHubAppSetup;
26
+ /**
27
+ * The repositories the channel is limited to, lowercased since GitHub names
28
+ * are case-insensitive. One installation covers them, so they share an owner.
29
+ */
30
+ export declare function repositoryAllowlist(repositories: readonly string[] | undefined): string[] | undefined;
31
+ export {};
32
+ //# sourceMappingURL=app-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-setup.d.ts","sourceRoot":"","sources":["../../../src/channels/github/app-setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AAEtE,KAAK,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAgExC,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG;IAC3B,uDAAuD;IACvD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kEAAkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAChC,cAAc,CAiBhB;AAoDD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAC1C,MAAM,EAAE,GAAG,SAAS,CAiCtB"}
@@ -0,0 +1,146 @@
1
+ import { handledEventKeys } from "../http/provider.js";
2
+ /**
3
+ * The App permission each event needs: read to receive it, write to also
4
+ * reply where it happened.
5
+ */
6
+ const EVENT_PERMISSIONS = {
7
+ "issue_comment.created": { permission: "issues", level: "write" },
8
+ "issue_comment.edited": { permission: "issues", level: "write" },
9
+ "issues.edited": { permission: "issues", level: "write" },
10
+ "issues.labeled": { permission: "issues", level: "write" },
11
+ "issues.opened": { permission: "issues", level: "write" },
12
+ "issues.reopened": { permission: "issues", level: "write" },
13
+ "pull_request.closed": { permission: "pull_requests", level: "write" },
14
+ "pull_request.converted_to_draft": {
15
+ permission: "pull_requests",
16
+ level: "write",
17
+ },
18
+ "pull_request.edited": { permission: "pull_requests", level: "write" },
19
+ "pull_request.labeled": { permission: "pull_requests", level: "write" },
20
+ "pull_request.opened": { permission: "pull_requests", level: "write" },
21
+ "pull_request.ready_for_review": {
22
+ permission: "pull_requests",
23
+ level: "write",
24
+ },
25
+ "pull_request.reopened": { permission: "pull_requests", level: "write" },
26
+ "pull_request.synchronize": { permission: "pull_requests", level: "write" },
27
+ "pull_request_review.dismissed": {
28
+ permission: "pull_requests",
29
+ level: "write",
30
+ },
31
+ "pull_request_review.edited": {
32
+ permission: "pull_requests",
33
+ level: "write",
34
+ },
35
+ "pull_request_review.submitted": {
36
+ permission: "pull_requests",
37
+ level: "write",
38
+ },
39
+ "pull_request_review_comment.created": {
40
+ permission: "pull_requests",
41
+ level: "write",
42
+ },
43
+ "pull_request_review_comment.edited": {
44
+ permission: "pull_requests",
45
+ level: "write",
46
+ },
47
+ "check_run.completed": { permission: "checks", level: "read" },
48
+ "check_suite.completed": { permission: "checks", level: "read" },
49
+ push: { permission: "contents", level: "read" },
50
+ status: { permission: "statuses", level: "read" },
51
+ "workflow_run.completed": { permission: "actions", level: "read" },
52
+ };
53
+ const MAX_PERMISSIONS = 50;
54
+ /** Keeps the App manifest and the deploy report readable. */
55
+ const MAX_REPOSITORIES = 500;
56
+ const PERMISSION_NAME = /^[a-z][a-z_]{0,63}$/;
57
+ const GITHUB_LOGIN = /^(?!-)(?!.*--)[A-Za-z0-9-]{1,39}(?<!-)$/;
58
+ const REPOSITORY_NAME = /^[A-Za-z0-9._-]{1,100}$/;
59
+ /**
60
+ * The App the channel's handlers and `app` options need. The CLI reads it
61
+ * from the channel's manifest instead of working it out; the Python runtime
62
+ * mirrors these rules in `github_app_setup.py`.
63
+ */
64
+ export function githubAppSetup(handlers, app) {
65
+ const events = handledEventKeys(handlers).filter(isSupportedEventKey);
66
+ // A misspelled option would silently widen what the agent's token reaches.
67
+ const unknown = Object.keys(app ?? {}).filter((key) => key !== "permissions" && key !== "repositories");
68
+ if (unknown.length)
69
+ throw new TypeError(`unknown GitHub app option ${unknown.join(", ")}; use permissions or repositories`);
70
+ const repositories = repositoryAllowlist(app?.repositories);
71
+ return {
72
+ events,
73
+ webhookEvents: [...new Set(events.map((key) => key.split(".")[0]))].sort(),
74
+ permissions: appPermissions(events, app?.permissions ?? {}),
75
+ ...(repositories && { repositories }),
76
+ };
77
+ }
78
+ function isSupportedEventKey(key) {
79
+ return Object.hasOwn(EVENT_PERMISSIONS, key);
80
+ }
81
+ /**
82
+ * Every App gets `metadata: read`; each handled event raises its permission
83
+ * to the level it needs, and `app.permissions` can raise it further.
84
+ */
85
+ function appPermissions(events, extra) {
86
+ checkPermissions(extra);
87
+ const permissions = new Map([
88
+ ["metadata", { name: "metadata", level: "read", events: [] }],
89
+ ]);
90
+ for (const key of events) {
91
+ const { permission, level } = EVENT_PERMISSIONS[key];
92
+ const current = permissions.get(permission);
93
+ if (!current || (current.level === "read" && level === "write"))
94
+ permissions.set(permission, { name: permission, level, events: [key] });
95
+ else if (current.level === level)
96
+ current.events.push(key);
97
+ }
98
+ for (const [name, level] of Object.entries(extra)) {
99
+ const current = permissions.get(name);
100
+ if (!current || (current.level === "read" && level === "write"))
101
+ permissions.set(name, { name, level, events: [] });
102
+ }
103
+ return [...permissions.values()].sort((a, b) => a.name.localeCompare(b.name));
104
+ }
105
+ /** JavaScript callers can pass anything, so check what types promise. */
106
+ function checkPermissions(permissions) {
107
+ const names = Object.keys(permissions).sort();
108
+ if (names.length > MAX_PERMISSIONS)
109
+ throw new TypeError(`GitHub app.permissions must list at most ${MAX_PERMISSIONS} permissions`);
110
+ for (const name of names) {
111
+ if (!PERMISSION_NAME.test(name))
112
+ throw new TypeError(`GitHub app.permissions has an invalid permission name '${name}'; use GitHub's names, such as contents`);
113
+ if (permissions[name] !== "read" && permissions[name] !== "write")
114
+ throw new TypeError(`GitHub app.permissions.${name} must be read or write`);
115
+ }
116
+ }
117
+ /**
118
+ * The repositories the channel is limited to, lowercased since GitHub names
119
+ * are case-insensitive. One installation covers them, so they share an owner.
120
+ */
121
+ export function repositoryAllowlist(repositories) {
122
+ if (repositories === undefined)
123
+ return undefined;
124
+ // An empty list could mean "none" or "all"; neither should be silent.
125
+ if (repositories.length === 0)
126
+ throw new TypeError("GitHub app.repositories must list at least one repository; omit it to allow every repository");
127
+ const valid = new Set();
128
+ for (const entry of repositories) {
129
+ const repository = entry.trim();
130
+ const [owner = "", name = "", ...rest] = repository.split("/");
131
+ if (rest.length > 0 ||
132
+ !GITHUB_LOGIN.test(owner) ||
133
+ !REPOSITORY_NAME.test(name) ||
134
+ name === "." ||
135
+ name === "..")
136
+ throw new TypeError(`GitHub app.repositories entry '${repository}' must be owner/name`);
137
+ valid.add(repository.toLowerCase());
138
+ }
139
+ if (valid.size > MAX_REPOSITORIES)
140
+ throw new TypeError(`GitHub app.repositories must list at most ${MAX_REPOSITORIES} repositories`);
141
+ const owners = [...new Set([...valid].map((r) => r.split("/")[0]))].sort();
142
+ if (owners.length > 1)
143
+ throw new TypeError(`GitHub app.repositories must all belong to one owner, because one installation covers them (found: ${owners.join(", ")})`);
144
+ return [...valid].sort();
145
+ }
146
+ //# sourceMappingURL=app-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-setup.js","sourceRoot":"","sources":["../../../src/channels/github/app-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD;;;GAGG;AACH,MAAM,iBAAiB,GAAG;IACxB,uBAAuB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IACjE,sBAAsB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IAChE,eAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IACzD,gBAAgB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IAC1D,eAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IACzD,iBAAiB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IAC3D,qBAAqB,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IACtE,iCAAiC,EAAE;QACjC,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,qBAAqB,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IACtE,sBAAsB,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IACvE,qBAAqB,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IACtE,+BAA+B,EAAE;QAC/B,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,uBAAuB,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IACxE,0BAA0B,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;IAC3E,+BAA+B,EAAE;QAC/B,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,4BAA4B,EAAE;QAC5B,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,+BAA+B,EAAE;QAC/B,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,qCAAqC,EAAE;QACrC,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,oCAAoC,EAAE;QACpC,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,OAAO;KACf;IACD,qBAAqB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IAC9D,uBAAuB,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IAChE,IAAI,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/C,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACjD,wBAAwB,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;CAInE,CAAC;AAEF,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,6DAA6D;AAC7D,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAC9C,MAAM,YAAY,GAAG,yCAAyC,CAAC;AAC/D,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAqBlD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,GAAiC;IAEjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACtE,2EAA2E;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,CAC3C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,cAAc,CACzD,CAAC;IACF,IAAI,OAAO,CAAC,MAAM;QAChB,MAAM,IAAI,SAAS,CACjB,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CACnF,CAAC;IACJ,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC5D,OAAO;QACL,MAAM;QACN,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAC3E,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,IAAI,EAAE,CAAC;QAC3D,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,MAAoC,EACpC,KAAgD;IAEhD,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAwB;QACjD,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;KAC9D,CAAC,CAAC;IACH,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;YAC7D,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACrE,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;YAC7D,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,yEAAyE;AACzE,SAAS,gBAAgB,CAAC,WAA6C;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe;QAChC,MAAM,IAAI,SAAS,CACjB,4CAA4C,eAAe,cAAc,CAC1E,CAAC;IACJ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,MAAM,IAAI,SAAS,CACjB,0DAA0D,IAAI,yCAAyC,CACxG,CAAC;QACJ,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,OAAO;YAC/D,MAAM,IAAI,SAAS,CACjB,0BAA0B,IAAI,wBAAwB,CACvD,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,YAA2C;IAE3C,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,sEAAsE;IACtE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAC3B,MAAM,IAAI,SAAS,CACjB,8FAA8F,CAC/F,CAAC;IACJ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/D,IACE,IAAI,CAAC,MAAM,GAAG,CAAC;YACf,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,IAAI,KAAK,GAAG;YACZ,IAAI,KAAK,IAAI;YAEb,MAAM,IAAI,SAAS,CACjB,kCAAkC,UAAU,sBAAsB,CACnE,CAAC;QACJ,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,gBAAgB;QAC/B,MAAM,IAAI,SAAS,CACjB,6CAA6C,gBAAgB,eAAe,CAC7E,CAAC;IACJ,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QACnB,MAAM,IAAI,SAAS,CACjB,sGAAsG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC3H,CAAC;IACJ,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -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,EAIL,KAAK,WAAW,EAKjB,MAAM,kBAAkB,CAAC;AA+B1B,OAAO,KAAK,EACV,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,CA+C7E;AA2CD,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}