managed-deepagents 0.9.2-dev.8 → 0.10.0-dev.1
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 +155 -0
- 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 +15 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +336 -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 +190 -0
- package/dist/channels/github/schema.js.map +1 -0
- package/dist/channels/github/types.d.ts +100 -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/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +100 -15
- 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 +27 -2
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +106 -13
- package/dist/channels/http/ingress.js.map +1 -1
- 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 +42 -1
- package/dist/channels/http/types.d.ts.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 +28 -0
- package/dist/channels/reserved-connections.js.map +1 -0
- package/dist/channels/run-input.d.ts +38 -0
- package/dist/channels/run-input.d.ts.map +1 -0
- package/dist/channels/run-input.js +95 -0
- package/dist/channels/run-input.js.map +1 -0
- 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/channels/types.d.ts.map +1 -1
- package/dist/channels/types.js +14 -9
- package/dist/channels/types.js.map +1 -1
- package/dist/connections.d.ts +8 -0
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +41 -6
- package/dist/connections.js.map +1 -1
- package/dist/connectors/mcp/index.d.ts +2 -2
- package/dist/connectors/mcp/index.d.ts.map +1 -1
- package/dist/connectors/mcp/index.js +16 -15
- package/dist/connectors/mcp/index.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 +16 -3
- package/dist/credential-gate.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +43 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +95 -2
- package/dist/ingress/runs.js.map +1 -1
- package/dist/namespaces.d.ts +6 -0
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +2 -0
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/auth.d.ts +5 -0
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +75 -5
- package/dist/runtime/auth.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/dist/schedule-time.d.ts.map +1 -1
- package/dist/schedule-time.js +6 -1
- package/dist/schedule-time.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { channelThreadId, httpChannel, } from "../http/index.js";
|
|
3
|
+
import { isJsonValue } from "../message-schema.js";
|
|
4
|
+
import { immutableCopy } from "../runtime.js";
|
|
5
|
+
import { logger } from "../../runtime/log.js";
|
|
6
|
+
import { ConnectionNotFoundError, DEPLOYMENT_ID_ENV, connections, } from "../../connections.js";
|
|
7
|
+
import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug } from "./connections.js";
|
|
8
|
+
import { managedDeploymentName } from "../../runtime/sandbox-manager.js";
|
|
9
|
+
import { SUPPORTED_EVENT_KEYS, githubReceiptSchema, githubIdentifierSchema, githubEventSchema, } from "./schema.js";
|
|
10
|
+
/** Adapt verified GitHub events into HTTP channel messages or skips. */
|
|
11
|
+
export function githubChannel(options = {}) {
|
|
12
|
+
const handlers = { ...options.onEvent };
|
|
13
|
+
// A misspelled option would silently widen what the agent's token reaches.
|
|
14
|
+
const unknown = Object.keys(options.app ?? {}).filter((key) => key !== "permissions" && key !== "repositories");
|
|
15
|
+
if (unknown.length)
|
|
16
|
+
throw new TypeError(`unknown GitHub app option ${unknown.join(", ")}; use permissions or repositories`);
|
|
17
|
+
// GitHub names are case-insensitive; deploy validates the rest.
|
|
18
|
+
const repositories = options.app?.repositories?.map((repository) => repository.trim().toLowerCase());
|
|
19
|
+
if (repositories?.length === 0)
|
|
20
|
+
throw new TypeError("GitHub app.repositories must list at least one repository; omit it to allow every repository");
|
|
21
|
+
const channel = httpChannel({
|
|
22
|
+
provider: "github",
|
|
23
|
+
...(options.multitaskStrategy && {
|
|
24
|
+
multitaskStrategy: options.multitaskStrategy,
|
|
25
|
+
}),
|
|
26
|
+
providerConfig: {
|
|
27
|
+
// Deploy subscribes the GitHub App to the handled events.
|
|
28
|
+
events: subscribedEvents(handlers),
|
|
29
|
+
...(options.app && { app: appConfig(options.app) }),
|
|
30
|
+
},
|
|
31
|
+
verify: verifyGitHubRequest,
|
|
32
|
+
parse: (context) => parseGitHubRequest(context, handlers, channelName(channel), repositories),
|
|
33
|
+
input: (_message, rawEvent) => handlerInput(handlers, rawEvent, channelName(channel), false),
|
|
34
|
+
// Only for an event its handler would act on, so the handler's filters,
|
|
35
|
+
// such as trusted senders or mentions, decide who gets a notice. The
|
|
36
|
+
// handler knows it is only asked, so it can skip side effects.
|
|
37
|
+
onPaused: async (target, run) => {
|
|
38
|
+
if ((await handlerInput(handlers, run.rawEvent, channelName(channel), true)) === undefined)
|
|
39
|
+
return;
|
|
40
|
+
await postPausedNotice(target, run);
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return channel;
|
|
44
|
+
}
|
|
45
|
+
function channelName(channel) {
|
|
46
|
+
return channel.name ?? channel.kind;
|
|
47
|
+
}
|
|
48
|
+
/** The events deploy subscribes the App to: the handled ones. */
|
|
49
|
+
function subscribedEvents(handlers) {
|
|
50
|
+
return Object.keys(handlers)
|
|
51
|
+
.filter((key) => handlers[key] !== undefined)
|
|
52
|
+
.sort();
|
|
53
|
+
}
|
|
54
|
+
/** The App options deploy reads, without unset fields. */
|
|
55
|
+
function appConfig(app) {
|
|
56
|
+
return Object.fromEntries(Object.entries({
|
|
57
|
+
permissions: app.permissions && { ...app.permissions },
|
|
58
|
+
repositories: app.repositories && [...app.repositories],
|
|
59
|
+
}).filter(([, value]) => value !== undefined));
|
|
60
|
+
}
|
|
61
|
+
/** How long a value read from Agent Auth is reused before it is read again. */
|
|
62
|
+
const APP_VALUE_TTL_MS = 5 * 60_000;
|
|
63
|
+
/** How long a missing value is remembered, so unsigned traffic can't hammer Agent Auth. */
|
|
64
|
+
const MISSING_APP_VALUE_TTL_MS = 60_000;
|
|
65
|
+
const appValues = new Map();
|
|
66
|
+
/**
|
|
67
|
+
* The App's webhook secret or bot ID: the `GH_*` env override when set,
|
|
68
|
+
* otherwise the agent secret Agent Auth stored when `mda deploy` created the
|
|
69
|
+
* App, at `mda/github-app/{deployment}/{suffix}`. Only a missing connection
|
|
70
|
+
* reads as `undefined`; credential store failures propagate.
|
|
71
|
+
*/
|
|
72
|
+
async function gitHubAppValue(envKey, suffix) {
|
|
73
|
+
const override = process.env[envKey]?.trim();
|
|
74
|
+
if (override)
|
|
75
|
+
return override;
|
|
76
|
+
const deploymentId = process.env[DEPLOYMENT_ID_ENV]?.trim();
|
|
77
|
+
if (!deploymentId)
|
|
78
|
+
return undefined;
|
|
79
|
+
const slug = githubAppConnectionSlug(deploymentId, suffix);
|
|
80
|
+
const cached = appValues.get(slug);
|
|
81
|
+
if (cached && cached.expiresAt > Date.now())
|
|
82
|
+
return cached.value;
|
|
83
|
+
// Concurrent deliveries share the in-flight read.
|
|
84
|
+
const entry = {
|
|
85
|
+
value: connections.resolveDeploymentSecret(slug).catch((error) => {
|
|
86
|
+
if (error instanceof ConnectionNotFoundError) {
|
|
87
|
+
entry.expiresAt = Date.now() + MISSING_APP_VALUE_TTL_MS;
|
|
88
|
+
logger.error(`GitHub App ${suffix} is not stored in Agent Auth`);
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
// Read again on the next delivery rather than caching a failure.
|
|
92
|
+
if (appValues.get(slug) === entry)
|
|
93
|
+
appValues.delete(slug);
|
|
94
|
+
throw error;
|
|
95
|
+
}),
|
|
96
|
+
expiresAt: Date.now() + APP_VALUE_TTL_MS,
|
|
97
|
+
};
|
|
98
|
+
appValues.set(slug, entry);
|
|
99
|
+
return entry.value;
|
|
100
|
+
}
|
|
101
|
+
/** Forget values read from Agent Auth; for tests. */
|
|
102
|
+
export function resetGitHubAppValues() {
|
|
103
|
+
appValues.clear();
|
|
104
|
+
}
|
|
105
|
+
async function verifyGitHubRequest({ request, rawBody, }) {
|
|
106
|
+
// GitHub pings a new App before Agent Auth has its webhook secret, and a
|
|
107
|
+
// ping starts nothing, so it needs no secret. Reading it here would also
|
|
108
|
+
// remember the secret as missing and reject the first real events.
|
|
109
|
+
if (request.headers.get("x-github-event") === "ping")
|
|
110
|
+
return true;
|
|
111
|
+
// Reject unsigned deliveries before reading the secret from Agent Auth.
|
|
112
|
+
const signature = request.headers.get("x-hub-signature-256") ?? "";
|
|
113
|
+
if (!/^sha256=[a-fA-F0-9]{64}$/.test(signature))
|
|
114
|
+
return false;
|
|
115
|
+
const secret = await gitHubAppValue("GH_WEBHOOK_SECRET", "webhook-secret");
|
|
116
|
+
if (!secret)
|
|
117
|
+
return false;
|
|
118
|
+
return timingSafeEqual(createHmac("sha256", secret).update(rawBody).digest(), Buffer.from(signature.slice(7), "hex"));
|
|
119
|
+
}
|
|
120
|
+
const EVENT_KEYS = new Set(SUPPORTED_EVENT_KEYS);
|
|
121
|
+
async function parseGitHubRequest({ request }, handlers, channelName, repositories) {
|
|
122
|
+
const envelope = githubReceiptSchema.parse({
|
|
123
|
+
event: request.headers.get("x-github-event"),
|
|
124
|
+
deliveryId: request.headers.get("x-github-delivery"),
|
|
125
|
+
payload: await request.json(),
|
|
126
|
+
});
|
|
127
|
+
const { event, deliveryId, payload } = envelope;
|
|
128
|
+
logReceipt(envelope);
|
|
129
|
+
const response = Response.json({ status: "received" }, { status: event === "ping" ? 200 : 202 });
|
|
130
|
+
// Events nothing handles stop here, before run creation.
|
|
131
|
+
// Events without an action, such as `push`, are keyed by their name.
|
|
132
|
+
const key = (payload.action === undefined ? event : `${event}.${payload.action}`);
|
|
133
|
+
if (!Object.hasOwn(handlers, key) || handlers[key] === undefined)
|
|
134
|
+
return { type: "ignore", response };
|
|
135
|
+
const parsedEvent = githubEventSchema.parse({ key, payload, deliveryId });
|
|
136
|
+
// Events from repositories the channel is not limited to start nothing.
|
|
137
|
+
if (repositories &&
|
|
138
|
+
!repositories.includes(parsedEvent.repository.fullName.toLowerCase()))
|
|
139
|
+
return { type: "ignore", response };
|
|
140
|
+
// Ignore the App's own activity to avoid triggering ourselves.
|
|
141
|
+
const configuredBotId = (await gitHubAppValue("GH_APP_BOT_ID", "bot-id")) ?? "";
|
|
142
|
+
if (!/^[1-9][0-9]*$/.test(configuredBotId))
|
|
143
|
+
throw new TypeError("GitHub App bot ID is unavailable; run `mda deploy` to store it or set GH_APP_BOT_ID");
|
|
144
|
+
const botId = githubIdentifierSchema.parse(Number(configuredBotId));
|
|
145
|
+
if (parsedEvent.sender.id === botId)
|
|
146
|
+
return { type: "ignore", response };
|
|
147
|
+
// Preserve the original event even if a callback modifies its argument.
|
|
148
|
+
if (!isJsonValue(parsedEvent))
|
|
149
|
+
throw new TypeError("invalid GitHub event");
|
|
150
|
+
const eventSnapshot = immutableCopy(parsedEvent);
|
|
151
|
+
// One thread per issue or pull request, so the agent keeps the
|
|
152
|
+
// conversation. Other events get their own thread, keyed by the delivery so
|
|
153
|
+
// a redelivery still finds the run it started.
|
|
154
|
+
const number = conversationNumber(parsedEvent);
|
|
155
|
+
const threadId = channelThreadId(channelName, number === undefined
|
|
156
|
+
? `delivery/${deliveryId}`
|
|
157
|
+
: `${parsedEvent.repository.id}/${number}`);
|
|
158
|
+
const target = number === undefined
|
|
159
|
+
? null
|
|
160
|
+
: { repository: parsedEvent.repository.fullName, number };
|
|
161
|
+
// What the run starts with is decided once MDA knows the thread takes a
|
|
162
|
+
// new turn.
|
|
163
|
+
return {
|
|
164
|
+
type: "message",
|
|
165
|
+
message: {
|
|
166
|
+
threadId,
|
|
167
|
+
userId: "mda:channel",
|
|
168
|
+
target,
|
|
169
|
+
deliveryKey: deliveryId,
|
|
170
|
+
},
|
|
171
|
+
rawEvent: eventSnapshot,
|
|
172
|
+
response,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** What the event's handler starts a run with; `undefined` when it skips or fails. */
|
|
176
|
+
async function handlerInput(handlers, rawEvent, channelName, paused) {
|
|
177
|
+
const event = githubEvent(rawEvent);
|
|
178
|
+
const handler = event && Object.hasOwn(handlers, event.key)
|
|
179
|
+
? handlers[event.key]
|
|
180
|
+
: undefined;
|
|
181
|
+
if (!event || !handler)
|
|
182
|
+
return undefined;
|
|
183
|
+
const receipt = {
|
|
184
|
+
event: logger.logIdentifier(event.key),
|
|
185
|
+
deliveryId: logger.logIdentifier(event.deliveryId),
|
|
186
|
+
};
|
|
187
|
+
try {
|
|
188
|
+
const input = await handler(event, {
|
|
189
|
+
channel: { name: channelName },
|
|
190
|
+
...(paused && { paused: true }),
|
|
191
|
+
});
|
|
192
|
+
if (input === undefined || input === null)
|
|
193
|
+
return undefined;
|
|
194
|
+
logger.info(`GitHub handler returned run input ${JSON.stringify(receipt)}`);
|
|
195
|
+
return input;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
logger.error(`github callback failed ${JSON.stringify(receipt)} (${logger.safeErrorLabel(error)})`);
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** The parsed event a delivery carries, as handlers may change it. */
|
|
203
|
+
function githubEvent(rawEvent) {
|
|
204
|
+
if (!rawEvent || typeof rawEvent !== "object" || Array.isArray(rawEvent))
|
|
205
|
+
return undefined;
|
|
206
|
+
const event = structuredClone(rawEvent);
|
|
207
|
+
return EVENT_KEYS.has(event.key) ? event : undefined;
|
|
208
|
+
}
|
|
209
|
+
/** The issue or pull request an event is about, if any. */
|
|
210
|
+
function conversationNumber(event) {
|
|
211
|
+
const payload = event.payload;
|
|
212
|
+
for (const subject of ["issue", "pull_request"]) {
|
|
213
|
+
const number = payload[subject]
|
|
214
|
+
?.number;
|
|
215
|
+
if (isIssueNumber(number))
|
|
216
|
+
return number;
|
|
217
|
+
}
|
|
218
|
+
// A CI run belongs to a pull request only when it ran for exactly one.
|
|
219
|
+
for (const run of ["workflow_run", "check_run", "check_suite"]) {
|
|
220
|
+
const pullRequests = payload[run]?.pull_requests;
|
|
221
|
+
if (Array.isArray(pullRequests) && pullRequests.length === 1) {
|
|
222
|
+
const number = pullRequests[0]?.number;
|
|
223
|
+
if (isIssueNumber(number))
|
|
224
|
+
return number;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
function isIssueNumber(value) {
|
|
230
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
231
|
+
}
|
|
232
|
+
const REPOSITORY_PATTERN = /^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/;
|
|
233
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
234
|
+
const DEPLOYMENT_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
235
|
+
const GITHUB_API_TIMEOUT_MS = 10_000;
|
|
236
|
+
/**
|
|
237
|
+
* The thread waits on an interrupt, so tell the issue or pull request where
|
|
238
|
+
* to continue it. Posts as the App; the notice is fixed text.
|
|
239
|
+
*/
|
|
240
|
+
async function postPausedNotice(target, run) {
|
|
241
|
+
if (!isGitHubTarget(target))
|
|
242
|
+
return;
|
|
243
|
+
const url = studioUrl(run);
|
|
244
|
+
const studio = url ? `[LangSmith Studio](${url})` : "LangSmith Studio";
|
|
245
|
+
const [owner, name] = target.repository.split("/");
|
|
246
|
+
const token = await connections.resolveDeploymentSecret(GITHUB_TOKEN_SLUG);
|
|
247
|
+
const response = await fetch(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues/${target.number}/comments`, {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers: {
|
|
250
|
+
Accept: "application/vnd.github+json",
|
|
251
|
+
Authorization: `Bearer ${token}`,
|
|
252
|
+
"Content-Type": "application/json",
|
|
253
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
254
|
+
},
|
|
255
|
+
body: JSON.stringify({
|
|
256
|
+
body: `I'm waiting for a decision on an earlier step in this conversation, so I haven't read this yet. Review the pending step in ${studio}, then comment again.`,
|
|
257
|
+
}),
|
|
258
|
+
signal: AbortSignal.timeout(GITHUB_API_TIMEOUT_MS),
|
|
259
|
+
});
|
|
260
|
+
if (!response.ok)
|
|
261
|
+
throw new Error(`GitHub refused the paused notice (HTTP ${response.status})`);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* The thread in the deployment's Studio, or the deployment's page when the
|
|
265
|
+
* deployment's name or the thread's assistant is unknown. The LangSmith UI is
|
|
266
|
+
* the one `mda deploy` recorded for the deployment's environment
|
|
267
|
+
* (`MDA_LANGSMITH_URL`); without it there is nothing to link to.
|
|
268
|
+
*/
|
|
269
|
+
export function studioUrl(run, env = process.env) {
|
|
270
|
+
const workspace = env.LANGSMITH_TENANT_ID?.trim() ?? "";
|
|
271
|
+
const deployment = env[DEPLOYMENT_ID_ENV]?.trim() ?? "";
|
|
272
|
+
if (!UUID_PATTERN.test(workspace) || !UUID_PATTERN.test(deployment))
|
|
273
|
+
return undefined;
|
|
274
|
+
const origin = parseHttpUrl(env.MDA_LANGSMITH_URL)?.origin;
|
|
275
|
+
if (!origin)
|
|
276
|
+
return undefined;
|
|
277
|
+
const name = managedDeploymentName(env);
|
|
278
|
+
const { threadId, assistantId } = run ?? {};
|
|
279
|
+
if (!name ||
|
|
280
|
+
!DEPLOYMENT_NAME_PATTERN.test(name) ||
|
|
281
|
+
!threadId ||
|
|
282
|
+
!UUID_PATTERN.test(threadId) ||
|
|
283
|
+
!assistantId ||
|
|
284
|
+
!UUID_PATTERN.test(assistantId))
|
|
285
|
+
return `${origin}/o/${workspace}/host/deployments/${deployment}`;
|
|
286
|
+
const query = new URLSearchParams({
|
|
287
|
+
organizationId: workspace,
|
|
288
|
+
render: "interact",
|
|
289
|
+
hostProjectId: deployment,
|
|
290
|
+
assistantId,
|
|
291
|
+
mode: "chat",
|
|
292
|
+
threadId,
|
|
293
|
+
});
|
|
294
|
+
return `${origin}/o/${workspace}/a/${encodeURIComponent(name)}/studio/thread?${query}`;
|
|
295
|
+
}
|
|
296
|
+
function parseHttpUrl(value) {
|
|
297
|
+
if (!value?.trim())
|
|
298
|
+
return undefined;
|
|
299
|
+
try {
|
|
300
|
+
const url = new URL(value.trim());
|
|
301
|
+
return url.protocol === "https:" || url.protocol === "http:"
|
|
302
|
+
? url
|
|
303
|
+
: undefined;
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function isGitHubTarget(value) {
|
|
310
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
311
|
+
return false;
|
|
312
|
+
const { repository, number } = value;
|
|
313
|
+
return (typeof repository === "string" &&
|
|
314
|
+
REPOSITORY_PATTERN.test(repository) &&
|
|
315
|
+
isIssueNumber(number));
|
|
316
|
+
}
|
|
317
|
+
function logReceipt({ event, deliveryId, payload, }) {
|
|
318
|
+
const receipt = {
|
|
319
|
+
event: logger.logIdentifier(event),
|
|
320
|
+
deliveryId: logger.logIdentifier(deliveryId),
|
|
321
|
+
};
|
|
322
|
+
if (payload.action !== undefined)
|
|
323
|
+
receipt.action = logger.logIdentifier(payload.action);
|
|
324
|
+
for (const [key, field] of [
|
|
325
|
+
["repository", "id"],
|
|
326
|
+
["issue", "number"],
|
|
327
|
+
["pull_request", "number"],
|
|
328
|
+
]) {
|
|
329
|
+
const id = payload[key]?.[field];
|
|
330
|
+
if (typeof id === "number")
|
|
331
|
+
receipt[key] = id;
|
|
332
|
+
}
|
|
333
|
+
logger.info(`github receipt ${JSON.stringify(receipt)}`);
|
|
334
|
+
return receipt;
|
|
335
|
+
}
|
|
336
|
+
//# 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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"}
|