managed-deepagents 0.9.6-dev.13 → 0.9.6-dev.15

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 (332) hide show
  1. package/README.md +953 -57
  2. package/dist/agent-auth.d.ts +1 -1
  3. package/dist/agent-auth.d.ts.map +1 -1
  4. package/dist/agent-auth.js +36 -12
  5. package/dist/agent-auth.js.map +1 -1
  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 +24 -0
  11. package/dist/channels/assistant-text.d.ts.map +1 -1
  12. package/dist/channels/assistant-text.js +65 -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 +39 -10
  17. package/dist/channels/binding.js.map +1 -1
  18. package/dist/channels/delivery.d.ts +21 -0
  19. package/dist/channels/delivery.d.ts.map +1 -0
  20. package/dist/channels/delivery.js +196 -0
  21. package/dist/channels/delivery.js.map +1 -0
  22. package/dist/channels/github/connections.d.ts +11 -0
  23. package/dist/channels/github/connections.d.ts.map +1 -0
  24. package/dist/channels/github/connections.js +14 -0
  25. package/dist/channels/github/connections.js.map +1 -0
  26. package/dist/channels/github/index.d.ts +8 -0
  27. package/dist/channels/github/index.d.ts.map +1 -0
  28. package/dist/channels/github/index.js +274 -0
  29. package/dist/channels/github/index.js.map +1 -0
  30. package/dist/channels/github/mentions.d.ts +12 -0
  31. package/dist/channels/github/mentions.d.ts.map +1 -0
  32. package/dist/channels/github/mentions.js +185 -0
  33. package/dist/channels/github/mentions.js.map +1 -0
  34. package/dist/channels/github/schema.d.ts +4165 -0
  35. package/dist/channels/github/schema.d.ts.map +1 -0
  36. package/dist/channels/github/schema.js +221 -0
  37. package/dist/channels/github/schema.js.map +1 -0
  38. package/dist/channels/github/types.d.ts +163 -0
  39. package/dist/channels/github/types.d.ts.map +1 -0
  40. package/dist/channels/github/types.js +2 -0
  41. package/dist/channels/github/types.js.map +1 -0
  42. package/dist/channels/http/endpoint.d.ts +95 -0
  43. package/dist/channels/http/endpoint.d.ts.map +1 -0
  44. package/dist/channels/http/endpoint.js +276 -0
  45. package/dist/channels/http/endpoint.js.map +1 -0
  46. package/dist/channels/http/http.d.ts.map +1 -1
  47. package/dist/channels/http/http.js +386 -65
  48. package/dist/channels/http/http.js.map +1 -1
  49. package/dist/channels/http/index.d.ts +2 -1
  50. package/dist/channels/http/index.d.ts.map +1 -1
  51. package/dist/channels/http/index.js +14 -10
  52. package/dist/channels/http/index.js.map +1 -1
  53. package/dist/channels/http/ingress.d.ts +65 -5
  54. package/dist/channels/http/ingress.d.ts.map +1 -1
  55. package/dist/channels/http/ingress.js +149 -33
  56. package/dist/channels/http/ingress.js.map +1 -1
  57. package/dist/channels/http/provider.d.ts +119 -0
  58. package/dist/channels/http/provider.d.ts.map +1 -0
  59. package/dist/channels/http/provider.js +227 -0
  60. package/dist/channels/http/provider.js.map +1 -0
  61. package/dist/channels/http/studio.d.ts +24 -0
  62. package/dist/channels/http/studio.d.ts.map +1 -0
  63. package/dist/channels/http/studio.js +95 -0
  64. package/dist/channels/http/studio.js.map +1 -0
  65. package/dist/channels/http/threads.d.ts +7 -0
  66. package/dist/channels/http/threads.d.ts.map +1 -0
  67. package/dist/channels/http/threads.js +10 -0
  68. package/dist/channels/http/threads.js.map +1 -0
  69. package/dist/channels/http/types.d.ts +143 -2
  70. package/dist/channels/http/types.d.ts.map +1 -1
  71. package/dist/channels/linear/connections.d.ts +11 -0
  72. package/dist/channels/linear/connections.d.ts.map +1 -0
  73. package/dist/channels/linear/connections.js +14 -0
  74. package/dist/channels/linear/connections.js.map +1 -0
  75. package/dist/channels/linear/graphql.d.ts +57 -0
  76. package/dist/channels/linear/graphql.d.ts.map +1 -0
  77. package/dist/channels/linear/graphql.js +167 -0
  78. package/dist/channels/linear/graphql.js.map +1 -0
  79. package/dist/channels/linear/index.d.ts +9 -0
  80. package/dist/channels/linear/index.d.ts.map +1 -0
  81. package/dist/channels/linear/index.js +489 -0
  82. package/dist/channels/linear/index.js.map +1 -0
  83. package/dist/channels/linear/schema.d.ts +1050 -0
  84. package/dist/channels/linear/schema.d.ts.map +1 -0
  85. package/dist/channels/linear/schema.js +255 -0
  86. package/dist/channels/linear/schema.js.map +1 -0
  87. package/dist/channels/linear/types.d.ts +162 -0
  88. package/dist/channels/linear/types.d.ts.map +1 -0
  89. package/dist/channels/linear/types.js +2 -0
  90. package/dist/channels/linear/types.js.map +1 -0
  91. package/dist/channels/message-schema.d.ts +2 -0
  92. package/dist/channels/message-schema.d.ts.map +1 -1
  93. package/dist/channels/message-schema.js +4 -0
  94. package/dist/channels/message-schema.js.map +1 -1
  95. package/dist/channels/messaging-registry.d.ts +16 -0
  96. package/dist/channels/messaging-registry.d.ts.map +1 -1
  97. package/dist/channels/messaging-registry.js +29 -0
  98. package/dist/channels/messaging-registry.js.map +1 -1
  99. package/dist/channels/reserved-connections.d.ts +12 -0
  100. package/dist/channels/reserved-connections.d.ts.map +1 -0
  101. package/dist/channels/reserved-connections.js +55 -0
  102. package/dist/channels/reserved-connections.js.map +1 -0
  103. package/dist/channels/run-input.d.ts +71 -0
  104. package/dist/channels/run-input.d.ts.map +1 -0
  105. package/dist/channels/run-input.js +155 -0
  106. package/dist/channels/run-input.js.map +1 -0
  107. package/dist/channels/runtime.d.ts +1 -1
  108. package/dist/channels/runtime.d.ts.map +1 -1
  109. package/dist/channels/runtime.js +1 -1
  110. package/dist/channels/runtime.js.map +1 -1
  111. package/dist/channels/schedule-delivery.d.ts +1 -1
  112. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  113. package/dist/channels/schedule-delivery.js +12 -23
  114. package/dist/channels/schedule-delivery.js.map +1 -1
  115. package/dist/channels/slack/api.d.ts +2 -0
  116. package/dist/channels/slack/api.d.ts.map +1 -1
  117. package/dist/channels/slack/api.js +6 -0
  118. package/dist/channels/slack/api.js.map +1 -1
  119. package/dist/channels/slack/connections.d.ts +6 -0
  120. package/dist/channels/slack/connections.d.ts.map +1 -0
  121. package/dist/channels/slack/connections.js +6 -0
  122. package/dist/channels/slack/connections.js.map +1 -0
  123. package/dist/channels/slack/events.d.ts +272 -0
  124. package/dist/channels/slack/events.d.ts.map +1 -0
  125. package/dist/channels/slack/events.js +235 -0
  126. package/dist/channels/slack/events.js.map +1 -0
  127. package/dist/channels/slack/files.d.ts.map +1 -1
  128. package/dist/channels/slack/files.js +2 -3
  129. package/dist/channels/slack/files.js.map +1 -1
  130. package/dist/channels/slack/index.d.ts +76 -2
  131. package/dist/channels/slack/index.d.ts.map +1 -1
  132. package/dist/channels/slack/index.js +177 -6
  133. package/dist/channels/slack/index.js.map +1 -1
  134. package/dist/channels/slack/message-content.d.ts.map +1 -1
  135. package/dist/channels/slack/message-content.js +23 -28
  136. package/dist/channels/slack/message-content.js.map +1 -1
  137. package/dist/channels/slack/status.d.ts +76 -0
  138. package/dist/channels/slack/status.d.ts.map +1 -0
  139. package/dist/channels/slack/status.js +427 -0
  140. package/dist/channels/slack/status.js.map +1 -0
  141. package/dist/channels/source-providers.js +1 -1
  142. package/dist/channels/source-providers.js.map +1 -1
  143. package/dist/channels/trigger/client.d.ts.map +1 -1
  144. package/dist/channels/trigger/client.js +6 -15
  145. package/dist/channels/trigger/client.js.map +1 -1
  146. package/dist/channels/trigger/http.d.ts +114 -3
  147. package/dist/channels/trigger/http.d.ts.map +1 -1
  148. package/dist/channels/trigger/http.js +314 -82
  149. package/dist/channels/trigger/http.js.map +1 -1
  150. package/dist/channels/trigger/identity-context.d.ts +1 -1
  151. package/dist/channels/trigger/identity-context.d.ts.map +1 -1
  152. package/dist/channels/trigger/identity-context.js +2 -3
  153. package/dist/channels/trigger/identity-context.js.map +1 -1
  154. package/dist/channels/trigger/ingress.d.ts +38 -1
  155. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  156. package/dist/channels/trigger/ingress.js +47 -19
  157. package/dist/channels/trigger/ingress.js.map +1 -1
  158. package/dist/channels/trigger/types.d.ts +82 -3
  159. package/dist/channels/trigger/types.d.ts.map +1 -1
  160. package/dist/channels/trigger/types.js +36 -0
  161. package/dist/channels/trigger/types.js.map +1 -1
  162. package/dist/channels/types.d.ts +19 -3
  163. package/dist/channels/types.d.ts.map +1 -1
  164. package/dist/channels/types.js +2 -0
  165. package/dist/channels/types.js.map +1 -1
  166. package/dist/connections.d.ts +31 -0
  167. package/dist/connections.d.ts.map +1 -1
  168. package/dist/connections.js +108 -11
  169. package/dist/connections.js.map +1 -1
  170. package/dist/credential-gate.d.ts +2 -0
  171. package/dist/credential-gate.d.ts.map +1 -1
  172. package/dist/credential-gate.js +37 -3
  173. package/dist/credential-gate.js.map +1 -1
  174. package/dist/define-deep-agent.d.ts.map +1 -1
  175. package/dist/define-deep-agent.js +6 -0
  176. package/dist/define-deep-agent.js.map +1 -1
  177. package/dist/identity/loopback.d.ts +1 -6
  178. package/dist/identity/loopback.d.ts.map +1 -1
  179. package/dist/identity/loopback.js +2 -12
  180. package/dist/identity/loopback.js.map +1 -1
  181. package/dist/index.d.ts +15 -4
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +2 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/ingress/index.d.ts +0 -8
  186. package/dist/ingress/index.d.ts.map +1 -1
  187. package/dist/ingress/index.js +2 -32
  188. package/dist/ingress/index.js.map +1 -1
  189. package/dist/ingress/runs.d.ts +74 -1
  190. package/dist/ingress/runs.d.ts.map +1 -1
  191. package/dist/ingress/runs.js +176 -16
  192. package/dist/ingress/runs.js.map +1 -1
  193. package/dist/managed-composition.d.ts.map +1 -1
  194. package/dist/managed-composition.js +8 -13
  195. package/dist/managed-composition.js.map +1 -1
  196. package/dist/memory/instructions-middleware.d.ts.map +1 -1
  197. package/dist/memory/instructions-middleware.js +5 -6
  198. package/dist/memory/instructions-middleware.js.map +1 -1
  199. package/dist/namespaces.d.ts +21 -21
  200. package/dist/namespaces.d.ts.map +1 -1
  201. package/dist/namespaces.js +4 -29
  202. package/dist/namespaces.js.map +1 -1
  203. package/dist/runtime/auth.d.ts.map +1 -1
  204. package/dist/runtime/auth.js +151 -21
  205. package/dist/runtime/auth.js.map +1 -1
  206. package/dist/runtime/channel-icon.d.ts +22 -0
  207. package/dist/runtime/channel-icon.d.ts.map +1 -0
  208. package/dist/runtime/channel-icon.js +70 -0
  209. package/dist/runtime/channel-icon.js.map +1 -0
  210. package/dist/runtime/channel.d.ts +6 -0
  211. package/dist/runtime/channel.d.ts.map +1 -1
  212. package/dist/runtime/channel.js.map +1 -1
  213. package/dist/runtime/http.d.ts +0 -15
  214. package/dist/runtime/http.d.ts.map +1 -1
  215. package/dist/runtime/http.js +0 -37
  216. package/dist/runtime/http.js.map +1 -1
  217. package/dist/runtime/identity-http.d.ts +2 -0
  218. package/dist/runtime/identity-http.d.ts.map +1 -1
  219. package/dist/runtime/identity-http.js +40 -16
  220. package/dist/runtime/identity-http.js.map +1 -1
  221. package/dist/runtime/identity-runtime.d.ts +10 -0
  222. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  223. package/dist/runtime/identity-runtime.js +22 -0
  224. package/dist/runtime/identity-runtime.js.map +1 -1
  225. package/dist/runtime/index.d.ts.map +1 -1
  226. package/dist/runtime/index.js +46 -47
  227. package/dist/runtime/index.js.map +1 -1
  228. package/dist/runtime/log.d.ts +14 -8
  229. package/dist/runtime/log.d.ts.map +1 -1
  230. package/dist/runtime/log.js +7 -16
  231. package/dist/runtime/log.js.map +1 -1
  232. package/dist/runtime/managed-middleware.d.ts.map +1 -1
  233. package/dist/runtime/managed-middleware.js +14 -1
  234. package/dist/runtime/managed-middleware.js.map +1 -1
  235. package/dist/runtime/managed-thread.d.ts +60 -0
  236. package/dist/runtime/managed-thread.d.ts.map +1 -0
  237. package/dist/runtime/managed-thread.js +76 -0
  238. package/dist/runtime/managed-thread.js.map +1 -0
  239. package/dist/runtime/managed-tools.d.ts +10 -10
  240. package/dist/runtime/managed-tools.d.ts.map +1 -1
  241. package/dist/runtime/managed-tools.js +24 -24
  242. package/dist/runtime/managed-tools.js.map +1 -1
  243. package/dist/runtime/memory/mounts.d.ts +11 -82
  244. package/dist/runtime/memory/mounts.d.ts.map +1 -1
  245. package/dist/runtime/memory/mounts.js +34 -173
  246. package/dist/runtime/memory/mounts.js.map +1 -1
  247. package/dist/runtime/memory/policy.d.ts.map +1 -1
  248. package/dist/runtime/memory/policy.js +1 -3
  249. package/dist/runtime/memory/policy.js.map +1 -1
  250. package/dist/runtime/run-input.d.ts +10 -0
  251. package/dist/runtime/run-input.d.ts.map +1 -1
  252. package/dist/runtime/run-input.js +47 -19
  253. package/dist/runtime/run-input.js.map +1 -1
  254. package/dist/runtime/sandbox-manager.d.ts +1 -1
  255. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  256. package/dist/runtime/sandbox-manager.js +9 -7
  257. package/dist/runtime/sandbox-manager.js.map +1 -1
  258. package/dist/runtime/schedule-auth.d.ts +17 -0
  259. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  260. package/dist/runtime/schedule-auth.js +39 -1
  261. package/dist/runtime/schedule-auth.js.map +1 -1
  262. package/dist/runtime/selected-skills-backend.d.ts +3 -3
  263. package/dist/runtime/selected-skills-backend.d.ts.map +1 -1
  264. package/dist/runtime/selected-skills-backend.js +5 -5
  265. package/dist/runtime/selected-skills-backend.js.map +1 -1
  266. package/dist/runtime/thread-record.d.ts +81 -0
  267. package/dist/runtime/thread-record.d.ts.map +1 -0
  268. package/dist/runtime/thread-record.js +205 -0
  269. package/dist/runtime/thread-record.js.map +1 -0
  270. package/dist/runtime/types.d.ts +5 -1
  271. package/dist/runtime/types.d.ts.map +1 -1
  272. package/dist/runtime-schedules.d.ts +13 -0
  273. package/dist/runtime-schedules.d.ts.map +1 -1
  274. package/dist/runtime-schedules.js +86 -22
  275. package/dist/runtime-schedules.js.map +1 -1
  276. package/dist/sandbox.d.ts +0 -6
  277. package/dist/sandbox.d.ts.map +1 -1
  278. package/dist/sandbox.js +3 -7
  279. package/dist/sandbox.js.map +1 -1
  280. package/dist/schedule-channel.d.ts +5 -2
  281. package/dist/schedule-channel.d.ts.map +1 -1
  282. package/dist/schedule-channel.js +13 -12
  283. package/dist/schedule-channel.js.map +1 -1
  284. package/dist/telemetry/run-listener.d.ts +1 -1
  285. package/dist/telemetry/run-listener.d.ts.map +1 -1
  286. package/dist/telemetry/run-listener.js +2 -32
  287. package/dist/telemetry/run-listener.js.map +1 -1
  288. package/dist/telemetry/transport/posthog.d.ts +1 -13
  289. package/dist/telemetry/transport/posthog.d.ts.map +1 -1
  290. package/dist/telemetry/transport/posthog.js +30 -68
  291. package/dist/telemetry/transport/posthog.js.map +1 -1
  292. package/dist/values.d.ts +15 -0
  293. package/dist/values.d.ts.map +1 -0
  294. package/dist/values.js +31 -0
  295. package/dist/values.js.map +1 -0
  296. package/package.json +11 -11
  297. package/dist/concurrency/batch-processor.d.ts +0 -51
  298. package/dist/concurrency/batch-processor.d.ts.map +0 -1
  299. package/dist/concurrency/batch-processor.js +0 -99
  300. package/dist/concurrency/batch-processor.js.map +0 -1
  301. package/dist/resilience/retry.d.ts +0 -21
  302. package/dist/resilience/retry.d.ts.map +0 -1
  303. package/dist/resilience/retry.js +0 -40
  304. package/dist/resilience/retry.js.map +0 -1
  305. package/dist/runtime/graph-build-timing.d.ts +0 -30
  306. package/dist/runtime/graph-build-timing.d.ts.map +0 -1
  307. package/dist/runtime/graph-build-timing.js +0 -50
  308. package/dist/runtime/graph-build-timing.js.map +0 -1
  309. package/dist/telemetry/lifecycle.d.ts +0 -26
  310. package/dist/telemetry/lifecycle.d.ts.map +0 -1
  311. package/dist/telemetry/lifecycle.js +0 -49
  312. package/dist/telemetry/lifecycle.js.map +0 -1
  313. package/dist/telemetry/otel/context.d.ts +0 -57
  314. package/dist/telemetry/otel/context.d.ts.map +0 -1
  315. package/dist/telemetry/otel/context.js +0 -122
  316. package/dist/telemetry/otel/context.js.map +0 -1
  317. package/dist/telemetry/otel/exporter.d.ts +0 -53
  318. package/dist/telemetry/otel/exporter.d.ts.map +0 -1
  319. package/dist/telemetry/otel/exporter.js +0 -190
  320. package/dist/telemetry/otel/exporter.js.map +0 -1
  321. package/dist/telemetry/otel/index.d.ts +0 -6
  322. package/dist/telemetry/otel/index.d.ts.map +0 -1
  323. package/dist/telemetry/otel/index.js +0 -3
  324. package/dist/telemetry/otel/index.js.map +0 -1
  325. package/dist/telemetry/otel/otlp.d.ts +0 -44
  326. package/dist/telemetry/otel/otlp.d.ts.map +0 -1
  327. package/dist/telemetry/otel/otlp.js +0 -7
  328. package/dist/telemetry/otel/otlp.js.map +0 -1
  329. package/dist/telemetry/otel/truncate.d.ts +0 -10
  330. package/dist/telemetry/otel/truncate.d.ts.map +0 -1
  331. package/dist/telemetry/otel/truncate.js +0 -39
  332. package/dist/telemetry/otel/truncate.js.map +0 -1
@@ -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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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reserved agent connection for the deployment's GitHub App: reading it
3
+ * returns an installation token for the App `mda deploy` set up.
4
+ */
5
+ export declare const GITHUB_TOKEN_SLUG = "mda/github-token";
6
+ /**
7
+ * The deployment's GitHub App connection, or one of the App values stored
8
+ * beside it (`webhook-secret`, `bot-id`) when `suffix` is given.
9
+ */
10
+ export declare function githubAppConnectionSlug(deploymentId: string, suffix?: string): string;
11
+ //# sourceMappingURL=connections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/channels/github/connections.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAER"}
@@ -0,0 +1,14 @@
1
+ import { appConnectionSlug } from "../http/provider.js";
2
+ /**
3
+ * Reserved agent connection for the deployment's GitHub App: reading it
4
+ * returns an installation token for the App `mda deploy` set up.
5
+ */
6
+ export const GITHUB_TOKEN_SLUG = "mda/github-token";
7
+ /**
8
+ * The deployment's GitHub App connection, or one of the App values stored
9
+ * beside it (`webhook-secret`, `bot-id`) when `suffix` is given.
10
+ */
11
+ export function githubAppConnectionSlug(deploymentId, suffix) {
12
+ return appConnectionSlug("github", deploymentId, suffix);
13
+ }
14
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/channels/github/connections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,MAAe;IAEf,OAAO,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type HttpChannel } from "../http/index.js";
2
+ import type { GitHubChannelOptions } from "./types.js";
3
+ export type { GitHubAppOptions, GitHubChannelOptions, GitHubChannelThread, GitHubEvent, GitHubEventCallback, GitHubEventResult, PayloadFor, SupportedEventKey, } from "./types.js";
4
+ /** Adapt verified GitHub events into HTTP channel messages or skips. */
5
+ export declare function githubChannel(options?: GitHubChannelOptions): HttpChannel;
6
+ /** Forget values read from Agent Auth; for tests. */
7
+ export declare function resetGitHubAppValues(): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;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"}
@@ -0,0 +1,274 @@
1
+ import { channelThreadId, httpChannel, } from "../http/index.js";
2
+ import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, eventThread, finishEvents, receiveEvents, verifyHmacSha256, } from "../http/provider.js";
3
+ import { isEndpointCallback } from "../http/endpoint.js";
4
+ import { interruptedNotice, pendingDecision } from "../http/studio.js";
5
+ import { withPausedNotice } from "../messaging-registry.js";
6
+ import { logger } from "../../runtime/log.js";
7
+ import { connections } from "../../connections.js";
8
+ import { ConnectionsNotConfiguredError } from "../../agent-auth.js";
9
+ import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug } from "./connections.js";
10
+ import { ENDPOINT_EVENT_FIELDS, SUPPORTED_EVENT_KEYS, githubReceiptSchema, githubIdentifierSchema, githubEventSchema, } from "./schema.js";
11
+ const EVENT_KEYS = new Set(SUPPORTED_EVENT_KEYS);
12
+ /** Adapt verified GitHub events into HTTP channel messages or skips. */
13
+ export function githubChannel(options = {}) {
14
+ const handlers = resolveEndpoints("GitHub", options.onEvent, ENDPOINT_EVENT_FIELDS);
15
+ checkEventKeys("GitHub", handlers, EVENT_KEYS);
16
+ // A misspelled option would silently widen what the agent's token reaches.
17
+ const unknown = Object.keys(options.app ?? {}).filter((key) => key !== "permissions" && key !== "repositories");
18
+ if (unknown.length)
19
+ throw new TypeError(`unknown GitHub app option ${unknown.join(", ")}; use permissions or repositories`);
20
+ // GitHub names are case-insensitive; deploy validates the rest.
21
+ const repositories = options.app?.repositories?.map((repository) => repository.trim().toLowerCase());
22
+ if (repositories?.length === 0)
23
+ throw new TypeError("GitHub app.repositories must list at least one repository; omit it to allow every repository");
24
+ const channel = httpChannel({
25
+ provider: "github",
26
+ ...(options.multitaskStrategy && {
27
+ multitaskStrategy: options.multitaskStrategy,
28
+ }),
29
+ providerConfig: {
30
+ // Deploy subscribes the GitHub App to the handled events.
31
+ events: handledEventKeys(handlers),
32
+ ...(options.app && { app: appConfig(options.app) }),
33
+ },
34
+ verify: verifyGitHubRequest,
35
+ parse: (context) => parseGitHubRequest(context, handlers, channelName(channel), repositories),
36
+ input: (message, rawEvent) => handlerInput(handlers, rawEvent, {
37
+ id: message.threadId,
38
+ channel: { name: channelName(channel) },
39
+ }),
40
+ onReceived: receiveEvents(options.onReceived, githubEvent, () => channelName(channel)),
41
+ onFinish: finishEvents((target, delivery) => notifyWaiting(handlers, target, delivery, channelName(channel)), options.onFinish, githubEvent, (delivery) => eventThread(delivery, channelName(channel))),
42
+ });
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);
46
+ }
47
+ /**
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.
52
+ */
53
+ async function notifyWaiting(handlers, target, delivery, name) {
54
+ if (pendingDecision(delivery) !== "waiting")
55
+ return;
56
+ if ((await handlerInput(handlers, delivery.rawEvent, {
57
+ id: delivery.threadId,
58
+ channel: { name },
59
+ interrupted: true,
60
+ })) === undefined)
61
+ return;
62
+ await postInterruptedNotice(target, delivery, "waiting");
63
+ }
64
+ /** The App options deploy reads, without unset fields. */
65
+ function appConfig(app) {
66
+ return definedFields({
67
+ permissions: app.permissions && { ...app.permissions },
68
+ repositories: app.repositories && [...app.repositories],
69
+ });
70
+ }
71
+ /**
72
+ * The App's webhook secret or bot ID: the `GH_*` env override when set,
73
+ * otherwise the agent secret Agent Auth stored when `mda deploy` created the
74
+ * App, at `mda/github-app/{deployment}/{suffix}`. Only a missing connection
75
+ * reads as `undefined`; credential store failures propagate.
76
+ */
77
+ function gitHubAppValue(envKey, suffix) {
78
+ return readDeploymentSecret(envKey, (deploymentId) => githubAppConnectionSlug(deploymentId, suffix), `GitHub App ${suffix}`);
79
+ }
80
+ /** Forget values read from Agent Auth; for tests. */
81
+ export function resetGitHubAppValues() {
82
+ resetDeploymentSecrets();
83
+ }
84
+ /** GitHub's delivery ID for a log line, or `unknown` when it is not one. */
85
+ function deliveryLabel(deliveryId) {
86
+ return deliveryId && /^[0-9a-fA-F-]{1,64}$/.test(deliveryId)
87
+ ? deliveryId
88
+ : "unknown";
89
+ }
90
+ async function verifyGitHubRequest({ request, rawBody, }) {
91
+ // GitHub pings a new App before Agent Auth has its webhook secret, and a
92
+ // ping starts nothing, so it needs no secret. Reading it here would also
93
+ // remember the secret as missing and reject the first real events.
94
+ if (request.headers.get("x-github-event") === "ping")
95
+ return true;
96
+ // Reject unsigned deliveries before reading the secret from Agent Auth.
97
+ const signature = request.headers.get("x-hub-signature-256") ?? "";
98
+ if (!/^sha256=[a-fA-F0-9]{64}$/.test(signature))
99
+ return false;
100
+ let secret;
101
+ try {
102
+ secret = await gitHubAppValue("GH_WEBHOOK_SECRET", "webhook-secret");
103
+ }
104
+ catch (error) {
105
+ if (error instanceof ConnectionsNotConfiguredError) {
106
+ // The message names only the missing setting, so it is safe to log.
107
+ logger.error(`GitHub delivery ${deliveryLabel(request.headers.get("x-github-delivery"))} ` +
108
+ `cannot be verified: ${error.message}`);
109
+ }
110
+ throw error;
111
+ }
112
+ if (!secret)
113
+ return false;
114
+ return verifyHmacSha256(secret, rawBody, signature.slice(7));
115
+ }
116
+ async function parseGitHubRequest({ request }, handlers, channelName, repositories) {
117
+ const envelope = githubReceiptSchema.parse({
118
+ event: request.headers.get("x-github-event"),
119
+ deliveryId: request.headers.get("x-github-delivery"),
120
+ payload: await request.json(),
121
+ });
122
+ const { event, deliveryId, payload } = envelope;
123
+ logReceipt(envelope);
124
+ const response = Response.json({ status: "received" }, { status: event === "ping" ? 200 : 202 });
125
+ // Events nothing handles stop here, before run creation.
126
+ // Events without an action, such as `push`, are keyed by their name.
127
+ const key = (payload.action === undefined ? event : `${event}.${payload.action}`);
128
+ if (!Object.hasOwn(handlers, key) || handlers[key] === undefined)
129
+ return { type: "ignore", response };
130
+ const parsedEvent = githubEventSchema.parse({ key, payload, deliveryId });
131
+ // Events from repositories the channel is not limited to start nothing.
132
+ if (repositories &&
133
+ !repositories.includes(parsedEvent.repository.fullName.toLowerCase()))
134
+ return { type: "ignore", response };
135
+ // Ignore the App's own activity to avoid triggering ourselves.
136
+ const configuredBotId = (await gitHubAppValue("GH_APP_BOT_ID", "bot-id")) ?? "";
137
+ if (!/^[1-9][0-9]*$/.test(configuredBotId))
138
+ throw new TypeError("GitHub App bot ID is unavailable; run `mda deploy` to store it or set GH_APP_BOT_ID");
139
+ const botId = githubIdentifierSchema.parse(Number(configuredBotId));
140
+ if (parsedEvent.sender.id === botId)
141
+ return { type: "ignore", response };
142
+ // Preserve the original event even if a callback modifies its argument.
143
+ const snapshot = eventSnapshot(parsedEvent, "GitHub");
144
+ // One thread per issue or pull request, so the agent keeps the
145
+ // conversation. Other events get their own thread, keyed by the delivery so
146
+ // a redelivery still finds the run it started.
147
+ const number = conversationNumber(parsedEvent);
148
+ const threadId = channelThreadId(channelName, number === undefined
149
+ ? `delivery/${deliveryId}`
150
+ : `${parsedEvent.repository.id}/${number}`);
151
+ const target = number === undefined
152
+ ? null
153
+ : { repository: parsedEvent.repository.fullName, number };
154
+ // What the run starts with is decided once MDA knows the thread takes a
155
+ // new turn.
156
+ return {
157
+ type: "message",
158
+ message: {
159
+ threadId,
160
+ userId: senderUserId(parsedEvent.sender),
161
+ target,
162
+ deliveryKey: deliveryId,
163
+ // An endpoint may take longer to answer than GitHub waits.
164
+ ...(isEndpointCallback(handlers[key]) && { background: true }),
165
+ },
166
+ rawEvent: snapshot,
167
+ response,
168
+ };
169
+ }
170
+ /**
171
+ * Who the run acts for. GitHub signs each delivery, so its sender is verified:
172
+ * a person acts as `github:<id>`, by the numeric ID that outlives login
173
+ * renames, and gets their own user memory where the agent allows it. Bots and
174
+ * organizations run as the channel.
175
+ */
176
+ function senderUserId(sender) {
177
+ return sender.type === "User" ? `github:${sender.id}` : "mda:channel";
178
+ }
179
+ /** What the event's handler starts a run with; `undefined` when it skips or fails. */
180
+ async function handlerInput(handlers, rawEvent, thread) {
181
+ const event = githubEvent(rawEvent);
182
+ const handler = event && Object.hasOwn(handlers, event.key)
183
+ ? handlers[event.key]
184
+ : undefined;
185
+ if (!event || !handler)
186
+ return undefined;
187
+ const outcome = await runEventHandler("GitHub", event, () => handler(event, thread));
188
+ return outcome.type === "input" ? outcome.input : undefined;
189
+ }
190
+ /** The parsed event a delivery carries, as handlers may change it. */
191
+ function githubEvent(rawEvent) {
192
+ if (!rawEvent || typeof rawEvent !== "object" || Array.isArray(rawEvent))
193
+ return undefined;
194
+ const event = structuredClone(rawEvent);
195
+ return EVENT_KEYS.has(event.key) ? event : undefined;
196
+ }
197
+ /** The issue or pull request an event is about, if any. */
198
+ function conversationNumber(event) {
199
+ const payload = event.payload;
200
+ for (const subject of ["issue", "pull_request"]) {
201
+ const number = payload[subject]
202
+ ?.number;
203
+ if (isIssueNumber(number))
204
+ return number;
205
+ }
206
+ // A CI run belongs to a pull request only when it ran for exactly one.
207
+ for (const run of ["workflow_run", "check_run", "check_suite"]) {
208
+ const pullRequests = payload[run]?.pull_requests;
209
+ if (Array.isArray(pullRequests) && pullRequests.length === 1) {
210
+ const number = pullRequests[0]?.number;
211
+ if (isIssueNumber(number))
212
+ return number;
213
+ }
214
+ }
215
+ return undefined;
216
+ }
217
+ function isIssueNumber(value) {
218
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
219
+ }
220
+ const REPOSITORY_PATTERN = /^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/;
221
+ const GITHUB_API_TIMEOUT_MS = 10_000;
222
+ /**
223
+ * The thread waits on an interrupt, so tell the issue or pull request where
224
+ * to continue it. Posts as the App; the notice is fixed text.
225
+ */
226
+ async function postInterruptedNotice(target, delivery, outcome) {
227
+ if (!isGitHubTarget(target))
228
+ return;
229
+ const [owner, name] = target.repository.split("/");
230
+ const token = await connections.resolveDeploymentSecret(GITHUB_TOKEN_SLUG);
231
+ const response = await fetch(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues/${target.number}/comments`, {
232
+ method: "POST",
233
+ headers: {
234
+ Accept: "application/vnd.github+json",
235
+ Authorization: `Bearer ${token}`,
236
+ "Content-Type": "application/json",
237
+ "X-GitHub-Api-Version": "2022-11-28",
238
+ },
239
+ body: JSON.stringify({
240
+ body: interruptedNotice(outcome, delivery, "comment again"),
241
+ }),
242
+ signal: AbortSignal.timeout(GITHUB_API_TIMEOUT_MS),
243
+ });
244
+ if (!response.ok)
245
+ throw new Error(`GitHub refused the interrupted notice (HTTP ${response.status})`);
246
+ }
247
+ function isGitHubTarget(value) {
248
+ if (!value || typeof value !== "object" || Array.isArray(value))
249
+ return false;
250
+ const { repository, number } = value;
251
+ return (typeof repository === "string" &&
252
+ REPOSITORY_PATTERN.test(repository) &&
253
+ isIssueNumber(number));
254
+ }
255
+ function logReceipt({ event, deliveryId, payload, }) {
256
+ const receipt = {
257
+ event: logger.logIdentifier(event),
258
+ deliveryId: logger.logIdentifier(deliveryId),
259
+ };
260
+ if (payload.action !== undefined)
261
+ receipt.action = logger.logIdentifier(payload.action);
262
+ for (const [key, field] of [
263
+ ["repository", "id"],
264
+ ["issue", "number"],
265
+ ["pull_request", "number"],
266
+ ]) {
267
+ const id = payload[key]?.[field];
268
+ if (typeof id === "number")
269
+ receipt[key] = id;
270
+ }
271
+ logger.info(`github receipt ${JSON.stringify(receipt)}`);
272
+ return receipt;
273
+ }
274
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** The handles an event's text mentions: GitHub sends no event for a mention. */
2
+ import type { z } from "zod";
3
+ import type { githubDispatchSchema } from "./schema.js";
4
+ type DispatchEvent = z.output<typeof githubDispatchSchema>;
5
+ /**
6
+ * The handles, such as `@octocat`, the text the event wrote mentions:
7
+ * lowercased, each once, in order. As on GitHub, code, quotes and HTML
8
+ * comments mention no one. An edit lists only the handles it added.
9
+ */
10
+ export declare function eventMentions(event: DispatchEvent): string[];
11
+ export {};
12
+ //# sourceMappingURL=mentions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/channels/github/mentions.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,KAAK,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAyD3D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CA0B5D"}