managed-deepagents 0.4.0-dev.72 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/README.md +2 -1
  2. package/dist/channels/binding.d.ts +3 -5
  3. package/dist/channels/binding.d.ts.map +1 -1
  4. package/dist/channels/binding.js +3 -9
  5. package/dist/channels/binding.js.map +1 -1
  6. package/dist/channels/collect.d.ts +23 -0
  7. package/dist/channels/collect.d.ts.map +1 -0
  8. package/dist/channels/collect.js +46 -0
  9. package/dist/channels/collect.js.map +1 -0
  10. package/dist/channels/github/adapter-core.d.ts +6 -0
  11. package/dist/channels/github/adapter-core.d.ts.map +1 -0
  12. package/dist/channels/github/adapter-core.js +27 -0
  13. package/dist/channels/github/adapter-core.js.map +1 -0
  14. package/dist/channels/github/adapter.d.ts +16 -0
  15. package/dist/channels/github/adapter.d.ts.map +1 -0
  16. package/dist/channels/github/adapter.js +52 -0
  17. package/dist/channels/github/adapter.js.map +1 -0
  18. package/dist/channels/github/define.d.ts +198 -0
  19. package/dist/channels/github/define.d.ts.map +1 -0
  20. package/dist/channels/github/define.js +166 -0
  21. package/dist/channels/github/define.js.map +1 -0
  22. package/dist/channels/github/http.d.ts +25 -0
  23. package/dist/channels/github/http.d.ts.map +1 -0
  24. package/dist/channels/github/http.js +147 -0
  25. package/dist/channels/github/http.js.map +1 -0
  26. package/dist/channels/github/index.d.ts +12 -0
  27. package/dist/channels/github/index.d.ts.map +1 -0
  28. package/dist/channels/github/index.js +10 -0
  29. package/dist/channels/github/index.js.map +1 -0
  30. package/dist/channels/github/normalize.d.ts +32 -0
  31. package/dist/channels/github/normalize.d.ts.map +1 -0
  32. package/dist/channels/github/normalize.js +152 -0
  33. package/dist/channels/github/normalize.js.map +1 -0
  34. package/dist/channels/github/source-thread.d.ts +24 -0
  35. package/dist/channels/github/source-thread.d.ts.map +1 -0
  36. package/dist/channels/github/source-thread.js +54 -0
  37. package/dist/channels/github/source-thread.js.map +1 -0
  38. package/dist/channels/github/transport.d.ts +19 -0
  39. package/dist/channels/github/transport.d.ts.map +1 -0
  40. package/dist/channels/github/transport.js +92 -0
  41. package/dist/channels/github/transport.js.map +1 -0
  42. package/dist/channels/index.d.ts +10 -3
  43. package/dist/channels/index.d.ts.map +1 -1
  44. package/dist/channels/index.js +5 -2
  45. package/dist/channels/index.js.map +1 -1
  46. package/dist/channels/manifest.d.ts +34 -0
  47. package/dist/channels/manifest.d.ts.map +1 -0
  48. package/dist/channels/manifest.js +8 -0
  49. package/dist/channels/manifest.js.map +1 -0
  50. package/dist/channels/plugin.d.ts +61 -0
  51. package/dist/channels/plugin.d.ts.map +1 -0
  52. package/dist/channels/plugin.js +80 -0
  53. package/dist/channels/plugin.js.map +1 -0
  54. package/dist/channels/registry-store.d.ts +12 -0
  55. package/dist/channels/registry-store.d.ts.map +1 -0
  56. package/dist/channels/registry-store.js +18 -0
  57. package/dist/channels/registry-store.js.map +1 -0
  58. package/dist/channels/registry-types.d.ts +32 -0
  59. package/dist/channels/registry-types.d.ts.map +1 -0
  60. package/dist/channels/registry-types.js +5 -0
  61. package/dist/channels/registry-types.js.map +1 -0
  62. package/dist/channels/registry.d.ts +14 -0
  63. package/dist/channels/registry.d.ts.map +1 -0
  64. package/dist/channels/registry.js +25 -0
  65. package/dist/channels/registry.js.map +1 -0
  66. package/dist/channels/runtime.d.ts +2 -4
  67. package/dist/channels/runtime.d.ts.map +1 -1
  68. package/dist/channels/runtime.js +0 -4
  69. package/dist/channels/runtime.js.map +1 -1
  70. package/dist/channels/schedule-delivery.d.ts +4 -0
  71. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  72. package/dist/channels/schedule-delivery.js +6 -5
  73. package/dist/channels/schedule-delivery.js.map +1 -1
  74. package/dist/channels/slack/adapter-core.d.ts +6 -0
  75. package/dist/channels/slack/adapter-core.d.ts.map +1 -0
  76. package/dist/channels/slack/adapter-core.js +24 -0
  77. package/dist/channels/slack/adapter-core.js.map +1 -0
  78. package/dist/channels/slack/adapter.d.ts +10 -0
  79. package/dist/channels/slack/adapter.d.ts.map +1 -0
  80. package/dist/channels/slack/adapter.js +22 -0
  81. package/dist/channels/slack/adapter.js.map +1 -0
  82. package/dist/channels/slack/define.d.ts +7 -20
  83. package/dist/channels/slack/define.d.ts.map +1 -1
  84. package/dist/channels/slack/define.js +29 -10
  85. package/dist/channels/slack/define.js.map +1 -1
  86. package/dist/channels/slack/http.d.ts +12 -1
  87. package/dist/channels/slack/http.d.ts.map +1 -1
  88. package/dist/channels/slack/http.js +103 -47
  89. package/dist/channels/slack/http.js.map +1 -1
  90. package/dist/channels/store.d.ts +4 -4
  91. package/dist/channels/store.d.ts.map +1 -1
  92. package/dist/channels/store.js.map +1 -1
  93. package/dist/channels/types.d.ts +4 -4
  94. package/dist/channels/types.d.ts.map +1 -1
  95. package/dist/channels/types.js.map +1 -1
  96. package/dist/connectors/github/index.d.ts +80 -0
  97. package/dist/connectors/github/index.d.ts.map +1 -0
  98. package/dist/connectors/github/index.js +118 -0
  99. package/dist/connectors/github/index.js.map +1 -0
  100. package/dist/connectors/github/sandbox.d.ts +54 -0
  101. package/dist/connectors/github/sandbox.d.ts.map +1 -0
  102. package/dist/connectors/github/sandbox.js +519 -0
  103. package/dist/connectors/github/sandbox.js.map +1 -0
  104. package/dist/connectors/{langsmith.d.ts → langsmith/index.d.ts} +3 -3
  105. package/dist/connectors/langsmith/index.d.ts.map +1 -0
  106. package/dist/connectors/{langsmith.js → langsmith/index.js} +4 -4
  107. package/dist/connectors/langsmith/index.js.map +1 -0
  108. package/dist/{runtime/langsmith-connector.d.ts → connectors/langsmith/routes.d.ts} +4 -4
  109. package/dist/connectors/langsmith/routes.d.ts.map +1 -0
  110. package/dist/{runtime/langsmith-connector.js → connectors/langsmith/routes.js} +12 -6
  111. package/dist/connectors/langsmith/routes.js.map +1 -0
  112. package/dist/{connectors.d.ts → connectors/mcp/index.d.ts} +2 -2
  113. package/dist/connectors/mcp/index.d.ts.map +1 -0
  114. package/dist/{connectors.js → connectors/mcp/index.js} +3 -3
  115. package/dist/connectors/mcp/index.js.map +1 -0
  116. package/dist/{runtime/connectors-manager.d.ts → connectors/mcp/load.d.ts} +2 -2
  117. package/dist/connectors/mcp/load.d.ts.map +1 -0
  118. package/dist/{runtime/connectors-manager.js → connectors/mcp/load.js} +1 -1
  119. package/dist/connectors/mcp/load.js.map +1 -0
  120. package/dist/define-deep-agent.d.ts +1 -0
  121. package/dist/define-deep-agent.d.ts.map +1 -1
  122. package/dist/define-deep-agent.js +6 -0
  123. package/dist/define-deep-agent.js.map +1 -1
  124. package/dist/identity/connect-paths.d.ts +8 -0
  125. package/dist/identity/connect-paths.d.ts.map +1 -0
  126. package/dist/identity/connect-paths.js +11 -0
  127. package/dist/identity/connect-paths.js.map +1 -0
  128. package/dist/identity/connect-provider-types.d.ts +68 -0
  129. package/dist/identity/connect-provider-types.d.ts.map +1 -0
  130. package/dist/identity/connect-provider-types.js +8 -0
  131. package/dist/identity/connect-provider-types.js.map +1 -0
  132. package/dist/identity/connect-provider.d.ts +30 -0
  133. package/dist/identity/connect-provider.d.ts.map +1 -0
  134. package/dist/identity/connect-provider.js +122 -0
  135. package/dist/identity/connect-provider.js.map +1 -0
  136. package/dist/identity/github/connect-http.d.ts +33 -0
  137. package/dist/identity/github/connect-http.d.ts.map +1 -0
  138. package/dist/identity/github/connect-http.js +111 -0
  139. package/dist/identity/github/connect-http.js.map +1 -0
  140. package/dist/identity/github/credentials-store.d.ts +76 -0
  141. package/dist/identity/github/credentials-store.d.ts.map +1 -0
  142. package/dist/identity/github/credentials-store.js +257 -0
  143. package/dist/identity/github/credentials-store.js.map +1 -0
  144. package/dist/identity/github/credentials.d.ts +82 -0
  145. package/dist/identity/github/credentials.d.ts.map +1 -0
  146. package/dist/identity/github/credentials.js +171 -0
  147. package/dist/identity/github/credentials.js.map +1 -0
  148. package/dist/identity/github/index.d.ts +10 -0
  149. package/dist/identity/github/index.d.ts.map +1 -0
  150. package/dist/identity/github/index.js +9 -0
  151. package/dist/identity/github/index.js.map +1 -0
  152. package/dist/identity/github/oauth.d.ts +49 -0
  153. package/dist/identity/github/oauth.d.ts.map +1 -0
  154. package/dist/identity/github/oauth.js +143 -0
  155. package/dist/identity/github/oauth.js.map +1 -0
  156. package/dist/identity/index.d.ts +2 -3
  157. package/dist/identity/index.d.ts.map +1 -1
  158. package/dist/identity/index.js +30 -1
  159. package/dist/identity/index.js.map +1 -1
  160. package/dist/identity/loopback.d.ts +8 -0
  161. package/dist/identity/loopback.d.ts.map +1 -0
  162. package/dist/identity/loopback.js +18 -0
  163. package/dist/identity/loopback.js.map +1 -0
  164. package/dist/identity/slack/connect-http.d.ts +33 -0
  165. package/dist/identity/slack/connect-http.d.ts.map +1 -0
  166. package/dist/identity/slack/connect-http.js +105 -0
  167. package/dist/identity/slack/connect-http.js.map +1 -0
  168. package/dist/identity/slack/index.d.ts +9 -0
  169. package/dist/identity/slack/index.d.ts.map +1 -0
  170. package/dist/identity/slack/index.js +8 -0
  171. package/dist/identity/slack/index.js.map +1 -0
  172. package/dist/identity/slack/links.d.ts.map +1 -0
  173. package/dist/identity/{links.js → slack/links.js} +2 -12
  174. package/dist/identity/slack/links.js.map +1 -0
  175. package/dist/identity/{slack-oauth.d.ts → slack/oauth.d.ts} +1 -1
  176. package/dist/identity/slack/oauth.d.ts.map +1 -0
  177. package/dist/identity/{slack-oauth.js → slack/oauth.js} +1 -1
  178. package/dist/identity/slack/oauth.js.map +1 -0
  179. package/dist/identity/types.d.ts +12 -1
  180. package/dist/identity/types.d.ts.map +1 -1
  181. package/dist/index.d.ts +14 -7
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +8 -3
  184. package/dist/index.js.map +1 -1
  185. package/dist/runtime/auth.d.ts +6 -0
  186. package/dist/runtime/auth.d.ts.map +1 -1
  187. package/dist/runtime/auth.js +19 -8
  188. package/dist/runtime/auth.js.map +1 -1
  189. package/dist/runtime/backend.d.ts +52 -0
  190. package/dist/runtime/backend.d.ts.map +1 -0
  191. package/dist/runtime/backend.js +165 -0
  192. package/dist/runtime/backend.js.map +1 -0
  193. package/dist/runtime/connector.d.ts +43 -12
  194. package/dist/runtime/connector.d.ts.map +1 -1
  195. package/dist/runtime/connector.js +25 -10
  196. package/dist/runtime/connector.js.map +1 -1
  197. package/dist/runtime/cors.js +1 -1
  198. package/dist/runtime/identity-http.d.ts +9 -3
  199. package/dist/runtime/identity-http.d.ts.map +1 -1
  200. package/dist/runtime/identity-http.js +24 -34
  201. package/dist/runtime/identity-http.js.map +1 -1
  202. package/dist/runtime/identity-runtime.d.ts +9 -28
  203. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  204. package/dist/runtime/identity-runtime.js +30 -65
  205. package/dist/runtime/identity-runtime.js.map +1 -1
  206. package/dist/runtime/index.d.ts +11 -5
  207. package/dist/runtime/index.d.ts.map +1 -1
  208. package/dist/runtime/index.js +27 -69
  209. package/dist/runtime/index.js.map +1 -1
  210. package/dist/runtime/memory/index.d.ts +3 -6
  211. package/dist/runtime/memory/index.d.ts.map +1 -1
  212. package/dist/runtime/memory/index.js +3 -4
  213. package/dist/runtime/memory/index.js.map +1 -1
  214. package/dist/runtime/memory/mounts.d.ts +15 -1
  215. package/dist/runtime/memory/mounts.d.ts.map +1 -1
  216. package/dist/runtime/memory/mounts.js +31 -7
  217. package/dist/runtime/memory/mounts.js.map +1 -1
  218. package/dist/runtime/memory/paths.d.ts +0 -5
  219. package/dist/runtime/memory/paths.d.ts.map +1 -1
  220. package/dist/runtime/memory/paths.js +0 -24
  221. package/dist/runtime/memory/paths.js.map +1 -1
  222. package/dist/runtime/memory/seed.d.ts +0 -16
  223. package/dist/runtime/memory/seed.d.ts.map +1 -1
  224. package/dist/runtime/memory/seed.js +0 -43
  225. package/dist/runtime/memory/seed.js.map +1 -1
  226. package/dist/runtime/sandbox-manager.d.ts +20 -2
  227. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  228. package/dist/runtime/sandbox-manager.js +102 -9
  229. package/dist/runtime/sandbox-manager.js.map +1 -1
  230. package/dist/runtime/types.d.ts +0 -6
  231. package/dist/runtime/types.d.ts.map +1 -1
  232. package/dist/types.d.ts +6 -0
  233. package/dist/types.d.ts.map +1 -1
  234. package/dist/types.js.map +1 -1
  235. package/package.json +11 -7
  236. package/dist/connectors/langsmith.d.ts.map +0 -1
  237. package/dist/connectors/langsmith.js.map +0 -1
  238. package/dist/connectors.d.ts.map +0 -1
  239. package/dist/connectors.js.map +0 -1
  240. package/dist/identity/links.d.ts.map +0 -1
  241. package/dist/identity/links.js.map +0 -1
  242. package/dist/identity/slack-connect-http.d.ts +0 -21
  243. package/dist/identity/slack-connect-http.d.ts.map +0 -1
  244. package/dist/identity/slack-connect-http.js +0 -129
  245. package/dist/identity/slack-connect-http.js.map +0 -1
  246. package/dist/identity/slack-oauth.d.ts.map +0 -1
  247. package/dist/identity/slack-oauth.js.map +0 -1
  248. package/dist/runtime/connectors-manager.d.ts.map +0 -1
  249. package/dist/runtime/connectors-manager.js.map +0 -1
  250. package/dist/runtime/langsmith-connector.d.ts.map +0 -1
  251. package/dist/runtime/langsmith-connector.js.map +0 -1
  252. /package/dist/identity/{links.d.ts → slack/links.d.ts} +0 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * `defineGitHubChannel` — declarative GitHub App webhook channel authoring.
3
+ *
4
+ * Authors declare **handlers** (event filter + optional repo scope + `prompt`).
5
+ * `instructions.md` remains the agent system prompt; each handler's `prompt`
6
+ * builds the human message for that webhook turn.
7
+ *
8
+ * MDA does **not** ship copies of GitHub webhook payload types. Prefer
9
+ * [`@octokit/webhooks-types`](https://www.npmjs.com/package/@octokit/webhooks-types)
10
+ * in the agent project and narrow {@link GitHubWebhookPromptEvent.payload}:
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import type { PullRequestOpenedEvent } from "@octokit/webhooks-types";
15
+ *
16
+ * prompt(event) {
17
+ * const pr = event.payload as PullRequestOpenedEvent;
18
+ * return `Review ${pr.pull_request.title}`;
19
+ * }
20
+ * ```
21
+ */
22
+ import { defineChannel, } from "../plugin.js";
23
+ import { githubChannelAdapter } from "./adapter-core.js";
24
+ /** Env vars for Phase 1 single-install GitHub App webhooks. */
25
+ export const GITHUB_CHANNEL_REQUIRED_ENV = [
26
+ "GITHUB_WEBHOOK_SECRET",
27
+ "GITHUB_APP_ID",
28
+ "GITHUB_APP_PRIVATE_KEY",
29
+ "GITHUB_INSTALLATION_ID",
30
+ ];
31
+ /**
32
+ * Declare a managed GitHub channel. Files under `channels/*.ts` export a named
33
+ * `channel` created with this helper.
34
+ *
35
+ * @param config - Handlers that map webhook events to agent turns.
36
+ */
37
+ export function defineGitHubChannel(config) {
38
+ const normalized = validateAndNormalize(config);
39
+ return defineChannel({
40
+ provider: "github",
41
+ adapter: githubChannelAdapter,
42
+ config: normalized,
43
+ toManifest: () => toGitHubChannelManifest(normalized),
44
+ });
45
+ }
46
+ /**
47
+ * GitHub App permissions implied by handlers.
48
+ *
49
+ * Auto-reply comments need `issues:write`. Contents/metadata reads are declared
50
+ * broadly so arbitrary webhook handlers can inspect payloads; tighten App
51
+ * permissions in GitHub settings to match what you actually use.
52
+ */
53
+ export function requiredGitHubPermissions(config) {
54
+ const perms = new Set(["metadata:read"]);
55
+ for (const handler of config.handlers) {
56
+ if (handler.autoReply) {
57
+ perms.add("issues:write");
58
+ perms.add("pull_requests:read");
59
+ }
60
+ }
61
+ return [...perms].sort();
62
+ }
63
+ /**
64
+ * Build author-supplied deploy fields for a GitHub channel.
65
+ *
66
+ * `name` and `provider` are stamped by {@link defineChannel} / `toManifest(name)`.
67
+ */
68
+ export function toGitHubChannelManifest(definition) {
69
+ const config = "config" in definition && definition.config
70
+ ? definition.config
71
+ : definition;
72
+ const handlers = config.handlers.map((handler) => ({
73
+ on: handler.on,
74
+ repositories: handler.repositories,
75
+ autoReply: handler.autoReply,
76
+ }));
77
+ const triggers = [...new Set(handlers.map((h) => h.on))];
78
+ const anyAutoReply = handlers.some((h) => h.autoReply);
79
+ return {
80
+ autoReply: anyAutoReply,
81
+ requiredPermissions: requiredGitHubPermissions(config),
82
+ requiredEnv: [...GITHUB_CHANNEL_REQUIRED_ENV],
83
+ providerConfig: {
84
+ triggers,
85
+ handlers: handlers,
86
+ },
87
+ };
88
+ }
89
+ /**
90
+ * Whether a handler `on` filter matches a delivery.
91
+ *
92
+ * @param on - `"*"`, `"pull_request"`, or `"pull_request.opened"`
93
+ * @param eventName - `X-GitHub-Event`
94
+ * @param action - `payload.action` when present
95
+ */
96
+ export function githubTriggerMatches(on, eventName, action) {
97
+ if (!on || !eventName)
98
+ return false;
99
+ if (on === "*")
100
+ return true;
101
+ if (on === eventName)
102
+ return true;
103
+ if (action !== undefined && on === `${eventName}.${action}`)
104
+ return true;
105
+ return false;
106
+ }
107
+ /**
108
+ * Find the first handler that matches event/action + repository.
109
+ *
110
+ * @returns The handler, or `undefined` when no handler matches (event ignored).
111
+ */
112
+ export function matchGitHubHandler(config, eventName, repository, action) {
113
+ for (const handler of config.handlers) {
114
+ if (!githubTriggerMatches(handler.on, eventName, action))
115
+ continue;
116
+ const repos = handler.repositories;
117
+ if (repos && repos.length > 0) {
118
+ if (!repository || !repos.includes(repository))
119
+ continue;
120
+ }
121
+ return handler;
122
+ }
123
+ return undefined;
124
+ }
125
+ function validateAndNormalize(config) {
126
+ if (config === null || typeof config !== "object") {
127
+ throw new Error("defineGitHubChannel(...) requires a configuration object.");
128
+ }
129
+ if (!Array.isArray(config.handlers) || config.handlers.length === 0) {
130
+ throw new Error("defineGitHubChannel(...) requires a non-empty `handlers` array.");
131
+ }
132
+ const handlers = [];
133
+ for (let i = 0; i < config.handlers.length; i++) {
134
+ const raw = config.handlers[i];
135
+ if (raw === null || typeof raw !== "object") {
136
+ throw new Error(`defineGitHubChannel(...) handlers[${i}] must be an object.`);
137
+ }
138
+ if (typeof raw.on !== "string" || raw.on.trim().length === 0) {
139
+ throw new Error(`defineGitHubChannel(...) handlers[${i}].on must be a non-empty string ` +
140
+ '(e.g. "pull_request", "pull_request.opened", or "*").');
141
+ }
142
+ if (typeof raw.prompt !== "function") {
143
+ throw new Error(`defineGitHubChannel(...) handlers[${i}] requires a \`prompt\` function.`);
144
+ }
145
+ const autoReply = raw.autoReply ?? true;
146
+ if (typeof autoReply !== "boolean") {
147
+ throw new Error(`defineGitHubChannel(...) handlers[${i}].autoReply must be a boolean.`);
148
+ }
149
+ let repositories;
150
+ if (raw.repositories !== undefined) {
151
+ if (!Array.isArray(raw.repositories) ||
152
+ raw.repositories.some((v) => typeof v !== "string")) {
153
+ throw new Error(`defineGitHubChannel(...) handlers[${i}].repositories must be an array of strings.`);
154
+ }
155
+ repositories = [...raw.repositories];
156
+ }
157
+ handlers.push({
158
+ on: raw.on.trim(),
159
+ repositories,
160
+ autoReply,
161
+ prompt: raw.prompt,
162
+ });
163
+ }
164
+ return { handlers };
165
+ }
166
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/channels/github/define.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Managed GitHub App webhook HTTP handler + agent runner.
3
+ */
4
+ import { InMemoryChannelStore } from "../store.js";
5
+ import { invokeChannelAgent } from "../slack/http.js";
6
+ import type { GitHubChannelDefinition, RequiredGitHubChannelConfig } from "./define.js";
7
+ export interface GitHubChannelHttpConfig {
8
+ name: string;
9
+ config: RequiredGitHubChannelConfig;
10
+ /** Live channel definition (preferred); supplies handlers with `prompt`. */
11
+ definition?: GitHubChannelDefinition;
12
+ store?: InMemoryChannelStore;
13
+ schedule?: (work: () => Promise<void>) => void;
14
+ invokeAgent?: typeof invokeChannelAgent;
15
+ rawBody?: string | Uint8Array;
16
+ webhookSecret?: string;
17
+ installationId?: string;
18
+ assistantId?: string;
19
+ deploymentId?: string;
20
+ }
21
+ /**
22
+ * Handle `POST /channels/{name}/events` for a GitHub App webhook.
23
+ */
24
+ export declare function handleGitHubEventsRequest(request: Request, channel: GitHubChannelHttpConfig): Promise<Response>;
25
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/channels/github/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC5B,MAAM,aAAa,CAAC;AAgBrB,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,2BAA2B,CAAC;IACpC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,QAAQ,CAAC,CAqJnB"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Managed GitHub App webhook HTTP handler + agent runner.
3
+ */
4
+ import { ChannelError } from "../errors.js";
5
+ import { InMemoryChannelStore } from "../store.js";
6
+ import { clearFinalPosted, wasDeliveryFinalPosted, } from "../binding.js";
7
+ import { createRuntimeChannel } from "../runtime.js";
8
+ import { invokeChannelAgent } from "../slack/http.js";
9
+ import { GITHUB_WEBHOOK_SECRET_ENV, normalizeGitHubEvent, verifyGitHubWebhookSignature, } from "./normalize.js";
10
+ import { createGitHubAppTransport, GITHUB_APP_ID_ENV, GITHUB_APP_PRIVATE_KEY_ENV, GITHUB_INSTALLATION_ID_ENV, } from "./transport.js";
11
+ const DEFAULT_ASSISTANT_ID = "agent";
12
+ const defaultStore = new InMemoryChannelStore();
13
+ /**
14
+ * Handle `POST /channels/{name}/events` for a GitHub App webhook.
15
+ */
16
+ export async function handleGitHubEventsRequest(request, channel) {
17
+ const secret = channel.webhookSecret ?? process.env[GITHUB_WEBHOOK_SECRET_ENV] ?? "";
18
+ const rawBody = channel.rawBody ?? (await request.text());
19
+ const signature = request.headers.get("x-hub-signature-256") ?? "";
20
+ try {
21
+ verifyGitHubWebhookSignature(rawBody, signature, secret);
22
+ }
23
+ catch (error) {
24
+ if (error instanceof ChannelError) {
25
+ return jsonError(401, error.message);
26
+ }
27
+ throw error;
28
+ }
29
+ let body;
30
+ try {
31
+ const text = typeof rawBody === "string" ? rawBody : new TextDecoder().decode(rawBody);
32
+ body = JSON.parse(text);
33
+ }
34
+ catch {
35
+ return jsonError(400, "invalid JSON body");
36
+ }
37
+ const eventName = request.headers.get("x-github-event") ?? "";
38
+ const deliveryHeader = request.headers.get("x-github-delivery") ?? "";
39
+ const installationId = channel.installationId ?? process.env[GITHUB_INSTALLATION_ID_ENV] ?? "";
40
+ const config = channel.definition?.config ?? channel.config;
41
+ const normalized = normalizeGitHubEvent(body, { eventName, deliveryId: deliveryHeader || cryptoRandom() }, config, installationId);
42
+ const store = channel.store ?? defaultStore;
43
+ const deploymentId = channel.deploymentId ?? "local";
44
+ if (normalized.ignored) {
45
+ store.acceptDelivery({
46
+ deploymentId,
47
+ channelDefinitionId: channel.name,
48
+ provider: "github",
49
+ apiAppId: installationId,
50
+ eventId: normalized.event.eventId,
51
+ sourceThreadKey: normalized.sourceThreadKey || "ignored",
52
+ status: "filtered",
53
+ filterReason: "event_filtered",
54
+ event: normalized.event,
55
+ });
56
+ return new Response("", { status: 202 });
57
+ }
58
+ const { delivery, duplicate } = store.acceptDelivery({
59
+ deploymentId,
60
+ channelDefinitionId: channel.name,
61
+ provider: "github",
62
+ apiAppId: installationId,
63
+ eventId: normalized.event.eventId,
64
+ sourceThreadKey: normalized.sourceThreadKey,
65
+ status: "accepted",
66
+ event: normalized.event,
67
+ });
68
+ if (duplicate) {
69
+ return new Response("", { status: 202 });
70
+ }
71
+ const schedule = channel.schedule ??
72
+ ((work) => {
73
+ work().catch((error) => {
74
+ console.error(`[mda] channel "${channel.name}" delivery ${delivery.deliveryId} failed:`, error);
75
+ });
76
+ });
77
+ const invoke = channel.invokeAgent ?? invokeChannelAgent;
78
+ const actorId = `github-app:${installationId || "unknown"}`;
79
+ // Auto-reply needs owner/repo#N for the installation comment transport.
80
+ const conversationId = normalized.event.address.conversationId ?? "";
81
+ const canComment = /^[^/]+\/[^#]+#\d+$/.test(conversationId);
82
+ const autoReply = (normalized.handler?.autoReply ?? true) && canComment;
83
+ schedule(async () => {
84
+ clearFinalPosted(delivery.deliveryId);
85
+ delivery.status = "running";
86
+ delivery.updatedAt = new Date().toISOString();
87
+ const binding = {
88
+ name: channel.name,
89
+ provider: "github",
90
+ event: normalized.event,
91
+ address: normalized.event.address,
92
+ autoReply,
93
+ deliveryId: delivery.deliveryId,
94
+ };
95
+ const text = normalized.event.message?.text?.trim() ?? "";
96
+ if (!text) {
97
+ delivery.status = "delivered";
98
+ delivery.updatedAt = new Date().toISOString();
99
+ return;
100
+ }
101
+ const result = await invoke({
102
+ actorId,
103
+ sourceThreadKey: normalized.sourceThreadKey,
104
+ binding,
105
+ text,
106
+ assistantId: channel.assistantId ?? DEFAULT_ASSISTANT_ID,
107
+ sourceProvider: "github",
108
+ });
109
+ if (autoReply &&
110
+ !wasDeliveryFinalPosted(delivery.deliveryId) &&
111
+ result.replyText.trim().length > 0) {
112
+ const transport = transportFromEnv();
113
+ if (!transport) {
114
+ throw new ChannelError("channel_run_failed", "auto-reply requires GitHub App credentials (GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEY, GITHUB_INSTALLATION_ID)");
115
+ }
116
+ const runtimeChannel = createRuntimeChannel({
117
+ name: channel.name,
118
+ provider: "github",
119
+ event: normalized.event,
120
+ address: normalized.event.address,
121
+ capabilities: { update: false },
122
+ transport,
123
+ onFinalPosted: () => undefined,
124
+ });
125
+ const posted = await runtimeChannel.post({ text: result.replyText }, { final: true });
126
+ delivery.outboundMessageIds.push(posted.id);
127
+ }
128
+ delivery.status = "delivered";
129
+ delivery.updatedAt = new Date().toISOString();
130
+ });
131
+ return new Response("", { status: 202 });
132
+ }
133
+ function transportFromEnv() {
134
+ const appId = process.env[GITHUB_APP_ID_ENV] ?? "";
135
+ const privateKey = process.env[GITHUB_APP_PRIVATE_KEY_ENV] ?? "";
136
+ const installationId = process.env[GITHUB_INSTALLATION_ID_ENV] ?? "";
137
+ if (!appId || !privateKey || !installationId)
138
+ return undefined;
139
+ return createGitHubAppTransport({ appId, privateKey, installationId });
140
+ }
141
+ function jsonError(status, message) {
142
+ return Response.json({ error: message }, { status });
143
+ }
144
+ function cryptoRandom() {
145
+ return globalThis.crypto?.randomUUID?.() ?? `delivery-${Date.now()}`;
146
+ }
147
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/channels/github/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * GitHub App webhook channel integration.
3
+ */
4
+ export { defineGitHubChannel, githubTriggerMatches, matchGitHubHandler, requiredGitHubPermissions, toGitHubChannelManifest, GITHUB_CHANNEL_REQUIRED_ENV, } from "./define.js";
5
+ export type { GitHubChannelConfig, GitHubChannelDefinition, GitHubChannelHandler, GitHubChannelHandlerManifest, GitHubChannelTrigger, GitHubWebhookPromptEvent, RequiredGitHubChannelConfig, RequiredGitHubChannelHandler, } from "./define.js";
6
+ export { verifyGitHubWebhookSignature, normalizeGitHubEvent, extractIssueOrPullNumber, GITHUB_WEBHOOK_SECRET_ENV, } from "./normalize.js";
7
+ export { createGitHubAppTransport, GITHUB_APP_ID_ENV, GITHUB_APP_PRIVATE_KEY_ENV, GITHUB_INSTALLATION_ID_ENV, } from "./transport.js";
8
+ export { encodeGitHubSourceThreadKey, decodeGitHubSourceThreadKey, } from "./source-thread.js";
9
+ export { handleGitHubEventsRequest } from "./http.js";
10
+ export type { GitHubChannelHttpConfig } from "./http.js";
11
+ export { githubChannelAdapter, githubConfigFromManifest } from "./adapter.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * GitHub App webhook channel integration.
3
+ */
4
+ export { defineGitHubChannel, githubTriggerMatches, matchGitHubHandler, requiredGitHubPermissions, toGitHubChannelManifest, GITHUB_CHANNEL_REQUIRED_ENV, } from "./define.js";
5
+ export { verifyGitHubWebhookSignature, normalizeGitHubEvent, extractIssueOrPullNumber, GITHUB_WEBHOOK_SECRET_ENV, } from "./normalize.js";
6
+ export { createGitHubAppTransport, GITHUB_APP_ID_ENV, GITHUB_APP_PRIVATE_KEY_ENV, GITHUB_INSTALLATION_ID_ENV, } from "./transport.js";
7
+ export { encodeGitHubSourceThreadKey, decodeGitHubSourceThreadKey, } from "./source-thread.js";
8
+ export { handleGitHubEventsRequest } from "./http.js";
9
+ export { githubChannelAdapter, githubConfigFromManifest } from "./adapter.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAYrB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GitHub App webhook verify + normalize into {@link ChannelEvent}.
3
+ */
4
+ import type { ChannelEvent } from "../types.js";
5
+ import type { GitHubWebhookPromptEvent, RequiredGitHubChannelConfig, RequiredGitHubChannelHandler } from "./define.js";
6
+ export declare const GITHUB_WEBHOOK_SECRET_ENV = "GITHUB_WEBHOOK_SECRET";
7
+ export interface GitHubNormalizeResult {
8
+ event: ChannelEvent;
9
+ sourceThreadKey: string;
10
+ trigger: string;
11
+ ignored?: boolean;
12
+ /** Matched handler when the event is accepted (live `prompt` included). */
13
+ handler?: RequiredGitHubChannelHandler;
14
+ /** Envelope passed to {@link RequiredGitHubChannelHandler.prompt}. */
15
+ promptEvent?: GitHubWebhookPromptEvent;
16
+ }
17
+ /**
18
+ * Verify `X-Hub-Signature-256` against the raw body before parsing JSON.
19
+ */
20
+ export declare function verifyGitHubWebhookSignature(rawBody: string | Uint8Array, signatureHeader: string, secret: string): void;
21
+ /**
22
+ * Normalize a verified GitHub webhook payload into a {@link ChannelEvent}.
23
+ *
24
+ * Accepts any `X-GitHub-Event`. Returns `ignored: true` when no handler matches.
25
+ */
26
+ export declare function normalizeGitHubEvent(body: unknown, headers: {
27
+ eventName: string;
28
+ deliveryId: string;
29
+ }, config: RequiredGitHubChannelConfig, installationIdFallback?: string): GitHubNormalizeResult;
30
+ /** Best-effort issue/PR number from common webhook payload shapes. */
31
+ export declare function extractIssueOrPullNumber(payload: Record<string, unknown>): number | undefined;
32
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/channels/github/normalize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,aAAa,CAAC;AAIrB,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,4BAA4B,CAAC;IACvC,sEAAsE;IACtE,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,IAAI,CA0BN;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,EACD,MAAM,EAAE,2BAA2B,EACnC,sBAAsB,CAAC,EAAE,MAAM,GAC9B,qBAAqB,CAgGvB;AAED,sEAAsE;AACtE,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,GAAG,SAAS,CAMpB"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * GitHub App webhook verify + normalize into {@link ChannelEvent}.
3
+ */
4
+ import { createHmac, timingSafeEqual } from "node:crypto";
5
+ import { randomUUID } from "node:crypto";
6
+ import { ChannelError } from "../errors.js";
7
+ import { matchGitHubHandler } from "./define.js";
8
+ import { encodeGitHubSourceThreadKey } from "./source-thread.js";
9
+ export const GITHUB_WEBHOOK_SECRET_ENV = "GITHUB_WEBHOOK_SECRET";
10
+ /**
11
+ * Verify `X-Hub-Signature-256` against the raw body before parsing JSON.
12
+ */
13
+ export function verifyGitHubWebhookSignature(rawBody, signatureHeader, secret) {
14
+ if (!secret) {
15
+ throw new ChannelError("channel_provider_rejected", "GitHub webhook secret is not configured");
16
+ }
17
+ const expectedPrefix = "sha256=";
18
+ if (!signatureHeader.startsWith(expectedPrefix)) {
19
+ throw new ChannelError("channel_invalid_signature", "missing or invalid X-Hub-Signature-256");
20
+ }
21
+ const body = typeof rawBody === "string" ? Buffer.from(rawBody) : Buffer.from(rawBody);
22
+ const digest = createHmac("sha256", secret).update(body).digest("hex");
23
+ const provided = signatureHeader.slice(expectedPrefix.length);
24
+ const a = Buffer.from(digest, "utf8");
25
+ const b = Buffer.from(provided, "utf8");
26
+ if (a.length !== b.length || !timingSafeEqual(a, b)) {
27
+ throw new ChannelError("channel_invalid_signature", "GitHub webhook signature mismatch");
28
+ }
29
+ }
30
+ /**
31
+ * Normalize a verified GitHub webhook payload into a {@link ChannelEvent}.
32
+ *
33
+ * Accepts any `X-GitHub-Event`. Returns `ignored: true` when no handler matches.
34
+ */
35
+ export function normalizeGitHubEvent(body, headers, config, installationIdFallback) {
36
+ if (!headers.eventName) {
37
+ return ignoredResult(headers.deliveryId);
38
+ }
39
+ const payload = asObject(body);
40
+ const action = stringField(payload.action);
41
+ const installationId = stringField(asObject(payload.installation)?.id) ??
42
+ (numberField(asObject(payload.installation)?.id) !== undefined
43
+ ? String(numberField(asObject(payload.installation)?.id))
44
+ : undefined) ??
45
+ installationIdFallback ??
46
+ undefined;
47
+ const repository = asObject(payload.repository);
48
+ const ownerLogin = stringField(asObject(repository.owner)?.login) ??
49
+ stringField(repository.full_name)?.split("/")[0] ??
50
+ undefined;
51
+ const repoName = stringField(repository.name) ??
52
+ stringField(repository.full_name)?.split("/")[1] ??
53
+ undefined;
54
+ const fullName = stringField(repository.full_name) ??
55
+ (ownerLogin && repoName ? `${ownerLogin}/${repoName}` : undefined);
56
+ const handler = matchGitHubHandler(config, headers.eventName, fullName, action);
57
+ if (!handler) {
58
+ return ignoredResult(headers.deliveryId);
59
+ }
60
+ const issueOrPullNumber = extractIssueOrPullNumber(payload);
61
+ const trigger = action !== undefined ? `${headers.eventName}.${action}` : headers.eventName;
62
+ const promptEvent = {
63
+ eventName: headers.eventName,
64
+ ...(action !== undefined ? { action } : {}),
65
+ trigger,
66
+ deliveryId: headers.deliveryId,
67
+ ...(fullName !== undefined ? { repository: fullName } : {}),
68
+ ...(installationId !== undefined ? { installationId } : {}),
69
+ ...(issueOrPullNumber !== undefined ? { issueOrPullNumber } : {}),
70
+ payload: body,
71
+ };
72
+ const text = handler.prompt(promptEvent);
73
+ const conversationId = ownerLogin && repoName && issueOrPullNumber !== undefined
74
+ ? `${ownerLogin}/${repoName}#${issueOrPullNumber}`
75
+ : (fullName ?? headers.deliveryId);
76
+ const sourceThreadKey = encodeGitHubSourceThreadKey({
77
+ installationId: installationId ?? "unknown",
78
+ owner: ownerLogin,
79
+ repo: repoName,
80
+ number: issueOrPullNumber,
81
+ deliveryId: headers.deliveryId,
82
+ });
83
+ return {
84
+ trigger,
85
+ sourceThreadKey,
86
+ handler,
87
+ promptEvent,
88
+ event: {
89
+ deliveryId: randomUUID(),
90
+ eventId: headers.deliveryId,
91
+ type: trigger,
92
+ address: {
93
+ conversationId,
94
+ ...(issueOrPullNumber !== undefined
95
+ ? { threadId: conversationId }
96
+ : {}),
97
+ },
98
+ message: { id: headers.deliveryId, text, attachments: [] },
99
+ native: {
100
+ provider: "github",
101
+ payload: {
102
+ eventName: headers.eventName,
103
+ ...(action !== undefined ? { action } : {}),
104
+ ...(fullName !== undefined ? { repository: fullName } : {}),
105
+ ...(installationId !== undefined
106
+ ? { installation: { id: installationId } }
107
+ : {}),
108
+ },
109
+ },
110
+ },
111
+ };
112
+ }
113
+ /** Best-effort issue/PR number from common webhook payload shapes. */
114
+ export function extractIssueOrPullNumber(payload) {
115
+ const pr = numberField(asObject(payload.pull_request).number);
116
+ if (pr !== undefined)
117
+ return pr;
118
+ const issue = numberField(asObject(payload.issue).number);
119
+ if (issue !== undefined)
120
+ return issue;
121
+ return numberField(payload.number);
122
+ }
123
+ function ignoredResult(deliveryHeader) {
124
+ return {
125
+ ignored: true,
126
+ trigger: "ignored",
127
+ sourceThreadKey: "",
128
+ event: {
129
+ deliveryId: randomUUID(),
130
+ eventId: deliveryHeader,
131
+ type: "ignored",
132
+ address: { conversationId: "" },
133
+ },
134
+ };
135
+ }
136
+ function asObject(value) {
137
+ return typeof value === "object" && value !== null
138
+ ? value
139
+ : {};
140
+ }
141
+ function stringField(value) {
142
+ if (typeof value === "number" && Number.isFinite(value)) {
143
+ return String(value);
144
+ }
145
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
146
+ }
147
+ function numberField(value) {
148
+ return typeof value === "number" && Number.isFinite(value)
149
+ ? value
150
+ : undefined;
151
+ }
152
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../src/channels/github/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Stable GitHub source-thread keys for trusted channel ingress.
3
+ *
4
+ * Prefer issue/PR scoped keys when a number is known:
5
+ * `github:<installationId>:<owner>/<repo>#<number>`
6
+ * Otherwise fall back to delivery-scoped keys:
7
+ * `github:<installationId>:<owner>/<repo>:delivery:<deliveryId>`
8
+ * `github:<installationId>:delivery:<deliveryId>`
9
+ */
10
+ export declare function encodeGitHubSourceThreadKey(input: {
11
+ installationId: string;
12
+ owner?: string;
13
+ repo?: string;
14
+ number?: number;
15
+ deliveryId?: string;
16
+ }): string;
17
+ export declare function decodeGitHubSourceThreadKey(key: string): {
18
+ installationId: string;
19
+ owner?: string;
20
+ repo?: string;
21
+ number?: number;
22
+ deliveryId?: string;
23
+ } | null;
24
+ //# sourceMappingURL=source-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-thread.d.ts","sourceRoot":"","sources":["../../../src/channels/github/source-thread.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAiBT;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG;IACxD,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CA6BP"}