managed-deepagents 0.9.4-dev.9 → 0.10.0-dev.10
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.
- package/README.md +345 -19
- package/dist/agent-auth.d.ts +1 -1
- package/dist/agent-auth.d.ts.map +1 -1
- package/dist/agent-auth.js +36 -12
- package/dist/agent-auth.js.map +1 -1
- package/dist/channels/github/connections.d.ts +11 -0
- package/dist/channels/github/connections.d.ts.map +1 -0
- package/dist/channels/github/connections.js +14 -0
- package/dist/channels/github/connections.js.map +1 -0
- package/dist/channels/github/index.d.ts +8 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +268 -0
- package/dist/channels/github/index.js.map +1 -0
- package/dist/channels/github/schema.d.ts +3894 -0
- package/dist/channels/github/schema.d.ts.map +1 -0
- package/dist/channels/github/schema.js +188 -0
- package/dist/channels/github/schema.js.map +1 -0
- package/dist/channels/github/types.d.ts +138 -0
- package/dist/channels/github/types.d.ts.map +1 -0
- package/dist/channels/github/types.js +2 -0
- package/dist/channels/github/types.js.map +1 -0
- package/dist/channels/http/endpoint.d.ts +41 -0
- package/dist/channels/http/endpoint.d.ts.map +1 -0
- package/dist/channels/http/endpoint.js +132 -0
- package/dist/channels/http/endpoint.js.map +1 -0
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +301 -49
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +2 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +11 -1
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +61 -5
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +138 -29
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +99 -0
- package/dist/channels/http/provider.d.ts.map +1 -0
- package/dist/channels/http/provider.js +188 -0
- package/dist/channels/http/provider.js.map +1 -0
- package/dist/channels/http/reply.d.ts +20 -0
- package/dist/channels/http/reply.d.ts.map +1 -0
- package/dist/channels/http/reply.js +116 -0
- package/dist/channels/http/reply.js.map +1 -0
- package/dist/channels/http/studio.d.ts +17 -0
- package/dist/channels/http/studio.d.ts.map +1 -0
- package/dist/channels/http/studio.js +82 -0
- package/dist/channels/http/studio.js.map +1 -0
- package/dist/channels/http/threads.d.ts +7 -0
- package/dist/channels/http/threads.d.ts.map +1 -0
- package/dist/channels/http/threads.js +10 -0
- package/dist/channels/http/threads.js.map +1 -0
- package/dist/channels/http/types.d.ts +113 -1
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/linear/connections.d.ts +11 -0
- package/dist/channels/linear/connections.d.ts.map +1 -0
- package/dist/channels/linear/connections.js +14 -0
- package/dist/channels/linear/connections.js.map +1 -0
- package/dist/channels/linear/graphql.d.ts +57 -0
- package/dist/channels/linear/graphql.d.ts.map +1 -0
- package/dist/channels/linear/graphql.js +167 -0
- package/dist/channels/linear/graphql.js.map +1 -0
- package/dist/channels/linear/index.d.ts +9 -0
- package/dist/channels/linear/index.d.ts.map +1 -0
- package/dist/channels/linear/index.js +477 -0
- package/dist/channels/linear/index.js.map +1 -0
- package/dist/channels/linear/schema.d.ts +1064 -0
- package/dist/channels/linear/schema.d.ts.map +1 -0
- package/dist/channels/linear/schema.js +249 -0
- package/dist/channels/linear/schema.js.map +1 -0
- package/dist/channels/linear/types.d.ts +150 -0
- package/dist/channels/linear/types.d.ts.map +1 -0
- package/dist/channels/linear/types.js +2 -0
- package/dist/channels/linear/types.js.map +1 -0
- package/dist/channels/message-schema.d.ts +2 -0
- package/dist/channels/message-schema.d.ts.map +1 -1
- package/dist/channels/message-schema.js +4 -0
- package/dist/channels/message-schema.js.map +1 -1
- package/dist/channels/reserved-connections.d.ts +12 -0
- package/dist/channels/reserved-connections.d.ts.map +1 -0
- package/dist/channels/reserved-connections.js +45 -0
- package/dist/channels/reserved-connections.js.map +1 -0
- package/dist/channels/run-input.d.ts +54 -0
- package/dist/channels/run-input.d.ts.map +1 -0
- package/dist/channels/run-input.js +129 -0
- package/dist/channels/run-input.js.map +1 -0
- package/dist/channels/source-providers.js +1 -1
- package/dist/channels/source-providers.js.map +1 -1
- package/dist/channels/trigger/client.js +2 -6
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/http.js +1 -1
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/identity-context.d.ts +1 -1
- package/dist/channels/trigger/identity-context.d.ts.map +1 -1
- package/dist/channels/trigger/identity-context.js +2 -3
- package/dist/channels/trigger/identity-context.js.map +1 -1
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +1 -19
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/connections.d.ts +31 -0
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +106 -9
- package/dist/connections.js.map +1 -1
- package/dist/credential-gate.d.ts +2 -0
- package/dist/credential-gate.d.ts.map +1 -1
- package/dist/credential-gate.js +37 -3
- package/dist/credential-gate.js.map +1 -1
- package/dist/identity/loopback.d.ts +1 -1
- package/dist/identity/loopback.d.ts.map +1 -1
- package/dist/identity/loopback.js +2 -3
- package/dist/identity/loopback.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +50 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +128 -2
- package/dist/ingress/runs.js.map +1 -1
- package/dist/memory/instructions-middleware.d.ts.map +1 -1
- package/dist/memory/instructions-middleware.js +5 -6
- package/dist/memory/instructions-middleware.js.map +1 -1
- package/dist/namespaces.d.ts +21 -0
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +4 -0
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/auth.d.ts +2 -1
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +115 -14
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/channel-icon.d.ts +22 -0
- package/dist/runtime/channel-icon.d.ts.map +1 -0
- package/dist/runtime/channel-icon.js +70 -0
- package/dist/runtime/channel-icon.js.map +1 -0
- package/dist/runtime/channel.d.ts +6 -0
- package/dist/runtime/channel.d.ts.map +1 -1
- package/dist/runtime/channel.js.map +1 -1
- package/dist/runtime/identity-http.d.ts +2 -0
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +36 -11
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +15 -0
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +35 -0
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/memory/mounts.d.ts +0 -42
- package/dist/runtime/memory/mounts.d.ts.map +1 -1
- package/dist/runtime/memory/mounts.js +7 -63
- package/dist/runtime/memory/mounts.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +1 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +3 -3
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { channelThreadId, httpChannel, } from "../http/index.js";
|
|
2
|
+
import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, settleEvents, verifyHmacSha256, } from "../http/provider.js";
|
|
3
|
+
import { interruptedNotice } from "../http/studio.js";
|
|
4
|
+
import { logger } from "../../runtime/log.js";
|
|
5
|
+
import { connections } from "../../connections.js";
|
|
6
|
+
import { ConnectionsNotConfiguredError } from "../../agent-auth.js";
|
|
7
|
+
import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug } from "./connections.js";
|
|
8
|
+
import { SUPPORTED_EVENT_KEYS, githubReceiptSchema, githubIdentifierSchema, githubEventSchema, } from "./schema.js";
|
|
9
|
+
const EVENT_KEYS = new Set(SUPPORTED_EVENT_KEYS);
|
|
10
|
+
/** Adapt verified GitHub events into HTTP channel messages or skips. */
|
|
11
|
+
export function githubChannel(options = {}) {
|
|
12
|
+
const handlers = resolveEndpoints("GitHub", options.onEvent);
|
|
13
|
+
checkEventKeys("GitHub", handlers, EVENT_KEYS);
|
|
14
|
+
// A misspelled option would silently widen what the agent's token reaches.
|
|
15
|
+
const unknown = Object.keys(options.app ?? {}).filter((key) => key !== "permissions" && key !== "repositories");
|
|
16
|
+
if (unknown.length)
|
|
17
|
+
throw new TypeError(`unknown GitHub app option ${unknown.join(", ")}; use permissions or repositories`);
|
|
18
|
+
// GitHub names are case-insensitive; deploy validates the rest.
|
|
19
|
+
const repositories = options.app?.repositories?.map((repository) => repository.trim().toLowerCase());
|
|
20
|
+
if (repositories?.length === 0)
|
|
21
|
+
throw new TypeError("GitHub app.repositories must list at least one repository; omit it to allow every repository");
|
|
22
|
+
const channel = httpChannel({
|
|
23
|
+
provider: "github",
|
|
24
|
+
...(options.multitaskStrategy && {
|
|
25
|
+
multitaskStrategy: options.multitaskStrategy,
|
|
26
|
+
}),
|
|
27
|
+
providerConfig: {
|
|
28
|
+
// Deploy subscribes the GitHub App to the handled events.
|
|
29
|
+
events: handledEventKeys(handlers),
|
|
30
|
+
...(options.app && { app: appConfig(options.app) }),
|
|
31
|
+
},
|
|
32
|
+
verify: verifyGitHubRequest,
|
|
33
|
+
parse: (context) => parseGitHubRequest(context, handlers, channelName(channel), repositories),
|
|
34
|
+
input: (message, rawEvent) => handlerInput(handlers, rawEvent, {
|
|
35
|
+
id: message.threadId,
|
|
36
|
+
channel: { name: channelName(channel) },
|
|
37
|
+
}),
|
|
38
|
+
onSettled: settleEvents((target, delivery) => notifyInterrupted(handlers, target, delivery, channelName(channel)), options.onSettled, githubEvent, () => channelName(channel)),
|
|
39
|
+
});
|
|
40
|
+
return channel;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Tell the issue or pull request when its thread waits on a decision. Only
|
|
44
|
+
* for an event its handler would act on, so the handler's filters, such as
|
|
45
|
+
* trusted senders or mentions, decide who gets a notice. The handler knows it
|
|
46
|
+
* is only asked, so it can skip side effects.
|
|
47
|
+
*/
|
|
48
|
+
async function notifyInterrupted(handlers, target, delivery, name) {
|
|
49
|
+
const { type } = delivery.outcome;
|
|
50
|
+
if (type !== "interrupted" && type !== "waiting")
|
|
51
|
+
return;
|
|
52
|
+
if ((await handlerInput(handlers, delivery.rawEvent, {
|
|
53
|
+
id: delivery.threadId,
|
|
54
|
+
channel: { name },
|
|
55
|
+
interrupted: true,
|
|
56
|
+
})) === undefined)
|
|
57
|
+
return;
|
|
58
|
+
await postInterruptedNotice(target, delivery, type);
|
|
59
|
+
}
|
|
60
|
+
/** The App options deploy reads, without unset fields. */
|
|
61
|
+
function appConfig(app) {
|
|
62
|
+
return definedFields({
|
|
63
|
+
permissions: app.permissions && { ...app.permissions },
|
|
64
|
+
repositories: app.repositories && [...app.repositories],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The App's webhook secret or bot ID: the `GH_*` env override when set,
|
|
69
|
+
* otherwise the agent secret Agent Auth stored when `mda deploy` created the
|
|
70
|
+
* App, at `mda/github-app/{deployment}/{suffix}`. Only a missing connection
|
|
71
|
+
* reads as `undefined`; credential store failures propagate.
|
|
72
|
+
*/
|
|
73
|
+
function gitHubAppValue(envKey, suffix) {
|
|
74
|
+
return readDeploymentSecret(envKey, (deploymentId) => githubAppConnectionSlug(deploymentId, suffix), `GitHub App ${suffix}`);
|
|
75
|
+
}
|
|
76
|
+
/** Forget values read from Agent Auth; for tests. */
|
|
77
|
+
export function resetGitHubAppValues() {
|
|
78
|
+
resetDeploymentSecrets();
|
|
79
|
+
}
|
|
80
|
+
/** GitHub's delivery ID for a log line, or `unknown` when it is not one. */
|
|
81
|
+
function deliveryLabel(deliveryId) {
|
|
82
|
+
return deliveryId && /^[0-9a-fA-F-]{1,64}$/.test(deliveryId)
|
|
83
|
+
? deliveryId
|
|
84
|
+
: "unknown";
|
|
85
|
+
}
|
|
86
|
+
async function verifyGitHubRequest({ request, rawBody, }) {
|
|
87
|
+
// GitHub pings a new App before Agent Auth has its webhook secret, and a
|
|
88
|
+
// ping starts nothing, so it needs no secret. Reading it here would also
|
|
89
|
+
// remember the secret as missing and reject the first real events.
|
|
90
|
+
if (request.headers.get("x-github-event") === "ping")
|
|
91
|
+
return true;
|
|
92
|
+
// Reject unsigned deliveries before reading the secret from Agent Auth.
|
|
93
|
+
const signature = request.headers.get("x-hub-signature-256") ?? "";
|
|
94
|
+
if (!/^sha256=[a-fA-F0-9]{64}$/.test(signature))
|
|
95
|
+
return false;
|
|
96
|
+
let secret;
|
|
97
|
+
try {
|
|
98
|
+
secret = await gitHubAppValue("GH_WEBHOOK_SECRET", "webhook-secret");
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error instanceof ConnectionsNotConfiguredError) {
|
|
102
|
+
// The message names only the missing setting, so it is safe to log.
|
|
103
|
+
logger.error(`GitHub delivery ${deliveryLabel(request.headers.get("x-github-delivery"))} ` +
|
|
104
|
+
`cannot be verified: ${error.message}`);
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
if (!secret)
|
|
109
|
+
return false;
|
|
110
|
+
return verifyHmacSha256(secret, rawBody, signature.slice(7));
|
|
111
|
+
}
|
|
112
|
+
async function parseGitHubRequest({ request }, handlers, channelName, repositories) {
|
|
113
|
+
const envelope = githubReceiptSchema.parse({
|
|
114
|
+
event: request.headers.get("x-github-event"),
|
|
115
|
+
deliveryId: request.headers.get("x-github-delivery"),
|
|
116
|
+
payload: await request.json(),
|
|
117
|
+
});
|
|
118
|
+
const { event, deliveryId, payload } = envelope;
|
|
119
|
+
logReceipt(envelope);
|
|
120
|
+
const response = Response.json({ status: "received" }, { status: event === "ping" ? 200 : 202 });
|
|
121
|
+
// Events nothing handles stop here, before run creation.
|
|
122
|
+
// Events without an action, such as `push`, are keyed by their name.
|
|
123
|
+
const key = (payload.action === undefined ? event : `${event}.${payload.action}`);
|
|
124
|
+
if (!Object.hasOwn(handlers, key) || handlers[key] === undefined)
|
|
125
|
+
return { type: "ignore", response };
|
|
126
|
+
const parsedEvent = githubEventSchema.parse({ key, payload, deliveryId });
|
|
127
|
+
// Events from repositories the channel is not limited to start nothing.
|
|
128
|
+
if (repositories &&
|
|
129
|
+
!repositories.includes(parsedEvent.repository.fullName.toLowerCase()))
|
|
130
|
+
return { type: "ignore", response };
|
|
131
|
+
// Ignore the App's own activity to avoid triggering ourselves.
|
|
132
|
+
const configuredBotId = (await gitHubAppValue("GH_APP_BOT_ID", "bot-id")) ?? "";
|
|
133
|
+
if (!/^[1-9][0-9]*$/.test(configuredBotId))
|
|
134
|
+
throw new TypeError("GitHub App bot ID is unavailable; run `mda deploy` to store it or set GH_APP_BOT_ID");
|
|
135
|
+
const botId = githubIdentifierSchema.parse(Number(configuredBotId));
|
|
136
|
+
if (parsedEvent.sender.id === botId)
|
|
137
|
+
return { type: "ignore", response };
|
|
138
|
+
// Preserve the original event even if a callback modifies its argument.
|
|
139
|
+
const snapshot = eventSnapshot(parsedEvent, "GitHub");
|
|
140
|
+
// One thread per issue or pull request, so the agent keeps the
|
|
141
|
+
// conversation. Other events get their own thread, keyed by the delivery so
|
|
142
|
+
// a redelivery still finds the run it started.
|
|
143
|
+
const number = conversationNumber(parsedEvent);
|
|
144
|
+
const threadId = channelThreadId(channelName, number === undefined
|
|
145
|
+
? `delivery/${deliveryId}`
|
|
146
|
+
: `${parsedEvent.repository.id}/${number}`);
|
|
147
|
+
const target = number === undefined
|
|
148
|
+
? null
|
|
149
|
+
: { repository: parsedEvent.repository.fullName, number };
|
|
150
|
+
// What the run starts with is decided once MDA knows the thread takes a
|
|
151
|
+
// new turn.
|
|
152
|
+
return {
|
|
153
|
+
type: "message",
|
|
154
|
+
message: {
|
|
155
|
+
threadId,
|
|
156
|
+
userId: senderUserId(parsedEvent.sender),
|
|
157
|
+
target,
|
|
158
|
+
deliveryKey: deliveryId,
|
|
159
|
+
},
|
|
160
|
+
rawEvent: snapshot,
|
|
161
|
+
response,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Who the run acts for. GitHub signs each delivery, so its sender is verified:
|
|
166
|
+
* a person acts as `github:<id>`, by the numeric ID that outlives login
|
|
167
|
+
* renames, and gets their own user memory where the agent allows it. Bots and
|
|
168
|
+
* organizations run as the channel.
|
|
169
|
+
*/
|
|
170
|
+
function senderUserId(sender) {
|
|
171
|
+
return sender.type === "User" ? `github:${sender.id}` : "mda:channel";
|
|
172
|
+
}
|
|
173
|
+
/** What the event's handler starts a run with; `undefined` when it skips or fails. */
|
|
174
|
+
async function handlerInput(handlers, rawEvent, thread) {
|
|
175
|
+
const event = githubEvent(rawEvent);
|
|
176
|
+
const handler = event && Object.hasOwn(handlers, event.key)
|
|
177
|
+
? handlers[event.key]
|
|
178
|
+
: undefined;
|
|
179
|
+
if (!event || !handler)
|
|
180
|
+
return undefined;
|
|
181
|
+
const outcome = await runEventHandler("GitHub", event, () => handler(event, thread));
|
|
182
|
+
return outcome.type === "input" ? outcome.input : undefined;
|
|
183
|
+
}
|
|
184
|
+
/** The parsed event a delivery carries, as handlers may change it. */
|
|
185
|
+
function githubEvent(rawEvent) {
|
|
186
|
+
if (!rawEvent || typeof rawEvent !== "object" || Array.isArray(rawEvent))
|
|
187
|
+
return undefined;
|
|
188
|
+
const event = structuredClone(rawEvent);
|
|
189
|
+
return EVENT_KEYS.has(event.key) ? event : undefined;
|
|
190
|
+
}
|
|
191
|
+
/** The issue or pull request an event is about, if any. */
|
|
192
|
+
function conversationNumber(event) {
|
|
193
|
+
const payload = event.payload;
|
|
194
|
+
for (const subject of ["issue", "pull_request"]) {
|
|
195
|
+
const number = payload[subject]
|
|
196
|
+
?.number;
|
|
197
|
+
if (isIssueNumber(number))
|
|
198
|
+
return number;
|
|
199
|
+
}
|
|
200
|
+
// A CI run belongs to a pull request only when it ran for exactly one.
|
|
201
|
+
for (const run of ["workflow_run", "check_run", "check_suite"]) {
|
|
202
|
+
const pullRequests = payload[run]?.pull_requests;
|
|
203
|
+
if (Array.isArray(pullRequests) && pullRequests.length === 1) {
|
|
204
|
+
const number = pullRequests[0]?.number;
|
|
205
|
+
if (isIssueNumber(number))
|
|
206
|
+
return number;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
function isIssueNumber(value) {
|
|
212
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
213
|
+
}
|
|
214
|
+
const REPOSITORY_PATTERN = /^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/;
|
|
215
|
+
const GITHUB_API_TIMEOUT_MS = 10_000;
|
|
216
|
+
/**
|
|
217
|
+
* The thread waits on an interrupt, so tell the issue or pull request where
|
|
218
|
+
* to continue it. Posts as the App; the notice is fixed text.
|
|
219
|
+
*/
|
|
220
|
+
async function postInterruptedNotice(target, delivery, outcome) {
|
|
221
|
+
if (!isGitHubTarget(target))
|
|
222
|
+
return;
|
|
223
|
+
const [owner, name] = target.repository.split("/");
|
|
224
|
+
const token = await connections.resolveDeploymentSecret(GITHUB_TOKEN_SLUG);
|
|
225
|
+
const response = await fetch(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues/${target.number}/comments`, {
|
|
226
|
+
method: "POST",
|
|
227
|
+
headers: {
|
|
228
|
+
Accept: "application/vnd.github+json",
|
|
229
|
+
Authorization: `Bearer ${token}`,
|
|
230
|
+
"Content-Type": "application/json",
|
|
231
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
232
|
+
},
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
body: interruptedNotice(outcome, delivery, "comment again"),
|
|
235
|
+
}),
|
|
236
|
+
signal: AbortSignal.timeout(GITHUB_API_TIMEOUT_MS),
|
|
237
|
+
});
|
|
238
|
+
if (!response.ok)
|
|
239
|
+
throw new Error(`GitHub refused the interrupted notice (HTTP ${response.status})`);
|
|
240
|
+
}
|
|
241
|
+
function isGitHubTarget(value) {
|
|
242
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
243
|
+
return false;
|
|
244
|
+
const { repository, number } = value;
|
|
245
|
+
return (typeof repository === "string" &&
|
|
246
|
+
REPOSITORY_PATTERN.test(repository) &&
|
|
247
|
+
isIssueNumber(number));
|
|
248
|
+
}
|
|
249
|
+
function logReceipt({ event, deliveryId, payload, }) {
|
|
250
|
+
const receipt = {
|
|
251
|
+
event: logger.logIdentifier(event),
|
|
252
|
+
deliveryId: logger.logIdentifier(deliveryId),
|
|
253
|
+
};
|
|
254
|
+
if (payload.action !== undefined)
|
|
255
|
+
receipt.action = logger.logIdentifier(payload.action);
|
|
256
|
+
for (const [key, field] of [
|
|
257
|
+
["repository", "id"],
|
|
258
|
+
["issue", "number"],
|
|
259
|
+
["pull_request", "number"],
|
|
260
|
+
]) {
|
|
261
|
+
const id = payload[key]?.[field];
|
|
262
|
+
if (typeof id === "number")
|
|
263
|
+
receipt[key] = id;
|
|
264
|
+
}
|
|
265
|
+
logger.info(`github receipt ${JSON.stringify(receipt)}`);
|
|
266
|
+
return receipt;
|
|
267
|
+
}
|
|
268
|
+
//# 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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"}
|