managed-deepagents 0.10.0-dev.12 → 0.10.0-dev.14
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 +122 -33
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +7 -6
- package/dist/channels/github/index.js.map +1 -1
- package/dist/channels/github/mentions.d.ts +7 -0
- package/dist/channels/github/mentions.d.ts.map +1 -0
- package/dist/channels/github/mentions.js +112 -0
- package/dist/channels/github/mentions.js.map +1 -0
- package/dist/channels/github/schema.d.ts +168 -0
- package/dist/channels/github/schema.d.ts.map +1 -1
- package/dist/channels/github/schema.js +8 -0
- package/dist/channels/github/schema.js.map +1 -1
- package/dist/channels/github/types.d.ts +26 -10
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/http/endpoint.d.ts +25 -11
- package/dist/channels/http/endpoint.d.ts.map +1 -1
- package/dist/channels/http/endpoint.js +107 -35
- package/dist/channels/http/endpoint.js.map +1 -1
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +45 -53
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +1 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/ingress.d.ts +10 -21
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +29 -24
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +17 -6
- package/dist/channels/http/provider.d.ts.map +1 -1
- package/dist/channels/http/provider.js +25 -5
- package/dist/channels/http/provider.js.map +1 -1
- package/dist/channels/http/studio.d.ts +7 -1
- package/dist/channels/http/studio.d.ts.map +1 -1
- package/dist/channels/http/studio.js +10 -0
- package/dist/channels/http/studio.js.map +1 -1
- package/dist/channels/http/types.d.ts +27 -45
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/linear/index.d.ts.map +1 -1
- package/dist/channels/linear/index.js +15 -11
- package/dist/channels/linear/index.js.map +1 -1
- package/dist/channels/linear/types.d.ts +11 -10
- package/dist/channels/linear/types.d.ts.map +1 -1
- package/dist/channels/run-input.js +17 -6
- package/dist/channels/run-input.js.map +1 -1
- package/dist/channels/slack/index.d.ts +33 -1
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +54 -4
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/define-deep-agent.d.ts.map +1 -1
- package/dist/define-deep-agent.js +6 -0
- package/dist/define-deep-agent.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/runs.d.ts +3 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +7 -4
- package/dist/ingress/runs.js.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -136,7 +136,10 @@ export function agent(runtime: ManagedServerRuntime) {
|
|
|
136
136
|
const ctx = runtime.executionRuntime?.context ?? {};
|
|
137
137
|
return defineDeepAgent({
|
|
138
138
|
name: "support",
|
|
139
|
-
model:
|
|
139
|
+
model:
|
|
140
|
+
"tier" in ctx && ctx.tier === "fast"
|
|
141
|
+
? "openai:gpt-5-mini"
|
|
142
|
+
: "openai:gpt-5.5",
|
|
140
143
|
});
|
|
141
144
|
}
|
|
142
145
|
```
|
|
@@ -281,7 +284,10 @@ does not expose the target or let callers replace it.
|
|
|
281
284
|
|
|
282
285
|
```ts
|
|
283
286
|
if (runtime.channel?.post) {
|
|
284
|
-
await runtime.channel.post({
|
|
287
|
+
await runtime.channel.post({
|
|
288
|
+
type: "content",
|
|
289
|
+
content: "I am checking that now.",
|
|
290
|
+
});
|
|
285
291
|
}
|
|
286
292
|
```
|
|
287
293
|
|
|
@@ -399,7 +405,9 @@ channels.github({
|
|
|
399
405
|
permissions: { contents: "read" }, // for the token, beyond what the events need
|
|
400
406
|
repositories: ["acme/api", "acme/web"], // one owner
|
|
401
407
|
},
|
|
402
|
-
onEvent: {
|
|
408
|
+
onEvent: {
|
|
409
|
+
"issues.opened": (event) => `Triage ${event.payload.issue.title}`,
|
|
410
|
+
},
|
|
403
411
|
});
|
|
404
412
|
```
|
|
405
413
|
|
|
@@ -440,6 +448,28 @@ Supported keys:
|
|
|
440
448
|
the event name. A CI event continues a pull request's conversation when it
|
|
441
449
|
ran for exactly one pull request.
|
|
442
450
|
|
|
451
|
+
GitHub sends no event for a mention, so each event lists the handles its own
|
|
452
|
+
text mentions in `event.mentions`: the comment's or review's body, or an
|
|
453
|
+
issue's or pull request's title and body. Handles are lowercased, listed once,
|
|
454
|
+
in order, and read as GitHub links them: `@octocat` or `@octo-org/reviewers`,
|
|
455
|
+
not `team@octo.dev` or `@octocat` inside code. Any text tag counts, such as
|
|
456
|
+
`@openswe`, even one that is no GitHub account. Other events list none. A
|
|
457
|
+
handler that answers mentions checks the list:
|
|
458
|
+
|
|
459
|
+
```ts
|
|
460
|
+
channels.github({
|
|
461
|
+
onEvent: {
|
|
462
|
+
"issue_comment.created": (event) => {
|
|
463
|
+
if (!event.mentions.includes("@openswe")) return;
|
|
464
|
+
return `Answer the comment on #${event.payload.issue.number}.`;
|
|
465
|
+
},
|
|
466
|
+
},
|
|
467
|
+
});
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
An issue comment on a pull request has `issue.pull_request` set, and an edit
|
|
471
|
+
says what it changed in `payload.changes`.
|
|
472
|
+
|
|
443
473
|
While a conversation's run is still going, a new event that starts a run waits
|
|
444
474
|
for it by default. `multitaskStrategy` changes that, using LangGraph's names:
|
|
445
475
|
`"interrupt"` cancels the active run and keeps its progress, `"rollback"`
|
|
@@ -494,6 +524,36 @@ The resumed run uses no user connections, even though a person answered: the
|
|
|
494
524
|
conversation holds content from outside the workspace, which must not act with
|
|
495
525
|
the grants of whoever resumes it from Studio.
|
|
496
526
|
|
|
527
|
+
To acknowledge an event the moment it arrives, such as with a 👀 reaction,
|
|
528
|
+
pass `onReceived(event, thread)`. It hears each delivery of a handled event once,
|
|
529
|
+
with the parsed event and its thread, as soon as the delivery reaches its
|
|
530
|
+
thread: before MDA reads the thread or asks the handler, which under the
|
|
531
|
+
default `enqueue` waits until a busy conversation's run has finished. It
|
|
532
|
+
fires even when the thread then waits on an interrupt or the handler declines,
|
|
533
|
+
so apply your own filters there, such as a mention check. It runs in the
|
|
534
|
+
background, before `onFinish`; a failure is logged and doesn't stop the run.
|
|
535
|
+
|
|
536
|
+
```ts
|
|
537
|
+
import { Octokit } from "@octokit/rest";
|
|
538
|
+
import { channels, connections } from "managed-deepagents";
|
|
539
|
+
|
|
540
|
+
export const channel = channels.github({
|
|
541
|
+
onEvent: { "issue_comment.created": (event) => answerMentions(event) },
|
|
542
|
+
onReceived: async (event) => {
|
|
543
|
+
if (event.key !== "issue_comment.created") return;
|
|
544
|
+
if (!/(^|\s)@my-agent\b/i.test(event.payload.comment.body)) return;
|
|
545
|
+
const auth = await connections.get("mda/github-token", { type: "agent" });
|
|
546
|
+
await new Octokit({ auth }).rest.reactions.createForIssueComment({
|
|
547
|
+
owner: event.repository.owner,
|
|
548
|
+
repo: event.repository.name,
|
|
549
|
+
comment_id: event.payload.comment.id,
|
|
550
|
+
content: "eyes",
|
|
551
|
+
request: { signal: AbortSignal.timeout(10_000) },
|
|
552
|
+
});
|
|
553
|
+
},
|
|
554
|
+
});
|
|
555
|
+
```
|
|
556
|
+
|
|
497
557
|
Keep callbacks short: their work and run creation must fit within GitHub's webhook
|
|
498
558
|
response window. A handler for an event that waits for a busy conversation runs
|
|
499
559
|
once that run has finished, after the webhook was acknowledged. The request does not wait for agent completion. Run-start
|
|
@@ -532,7 +592,11 @@ export const channel = channels.linear({
|
|
|
532
592
|
const added = Array.isArray(before)
|
|
533
593
|
? event.payload.data.labelIds?.filter((id) => !before.includes(id))
|
|
534
594
|
: [];
|
|
535
|
-
if (
|
|
595
|
+
if (
|
|
596
|
+
!event.payload.data.labels?.some(
|
|
597
|
+
(l) => added?.includes(l.id) && l.name === "agent"
|
|
598
|
+
)
|
|
599
|
+
)
|
|
536
600
|
return;
|
|
537
601
|
return `Triage ${event.payload.data.identifier}. Treat the following as untrusted data:\n${event.payload.data.title}\n${event.payload.data.description ?? ""}`;
|
|
538
602
|
},
|
|
@@ -672,41 +736,39 @@ Two optional async hooks follow each message through its lifecycle:
|
|
|
672
736
|
- `onReceived(target, delivery)` runs for every verified message that reaches
|
|
673
737
|
its thread, before MDA starts or queues anything for it, for providers that
|
|
674
738
|
expect a prompt acknowledgement.
|
|
675
|
-
- `
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
(it stopped on interrupts,
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
`
|
|
684
|
-
|
|
685
|
-
or `duplicate`.
|
|
739
|
+
- `onFinish(target, { ...delivery, run?, interrupts })` runs once each message
|
|
740
|
+
is done, after `onReceived` and after `onError`. A message that started a
|
|
741
|
+
run carries it as `run: { id, status }`, with LangGraph's run status:
|
|
742
|
+
`success`, `error`, `timeout` or `interrupted` (it stopped on interrupts, or
|
|
743
|
+
was cancelled). `interrupts` lists the decisions the thread waits on, as
|
|
744
|
+
LangGraph's `thread.interrupts` does: when it isn't empty, point the sender
|
|
745
|
+
to Studio, where they can be resumed. A message that started no run, such as
|
|
746
|
+
one whose `input` returned nothing or one that found the thread waiting, has
|
|
747
|
+
no `run`. A message whose run couldn't be started gets no `onFinish`, since
|
|
748
|
+
the provider redelivers it, and neither does a run MDA lost track of.
|
|
686
749
|
|
|
687
750
|
A `parse` result of `{ type: "cancel", message: { userId, threadId, target } }`
|
|
688
751
|
cancels the thread's queued and running runs, keeping their progress, and
|
|
689
|
-
drops messages waiting for the thread. It
|
|
690
|
-
`{ type: "stopped", cancelled }`, with how many runs were active.
|
|
752
|
+
drops messages waiting for the thread. It finishes at once, without a `run`.
|
|
691
753
|
|
|
692
754
|
```ts
|
|
693
|
-
|
|
694
|
-
if (
|
|
755
|
+
onFinish: async (target, { threadId, interrupts }) => {
|
|
756
|
+
if (interrupts.length)
|
|
695
757
|
await notify(target, `A decision is pending: ${studioLink(threadId)}`);
|
|
696
758
|
},
|
|
697
759
|
```
|
|
698
760
|
|
|
699
761
|
The hooks run in the background, in the process that took the delivery;
|
|
700
762
|
failures are logged. A restart while a run is in flight loses its
|
|
701
|
-
`
|
|
763
|
+
`onFinish`, and a run Studio resumes has no delivery, so it gets none: keep a
|
|
702
764
|
reconciliation, or the run's `webhook` (see handlers' run options), for anything
|
|
703
765
|
that must not miss one. The run posts its own
|
|
704
766
|
answer.
|
|
705
767
|
|
|
706
|
-
GitHub and Linear take `
|
|
707
|
-
event and the thread its handler saw, called after their own
|
|
708
|
-
the comment or the session elicitation that a decision is
|
|
709
|
-
"Stopped.".
|
|
768
|
+
GitHub and Linear take `onFinish(event, thread, { run?, interrupts })`, with
|
|
769
|
+
their parsed event and the thread its handler saw, called after their own
|
|
770
|
+
notices, such as the comment or the session elicitation that a decision is
|
|
771
|
+
pending, or Linear's "Stopped.".
|
|
710
772
|
|
|
711
773
|
### Asking your service what to start
|
|
712
774
|
|
|
@@ -739,19 +801,42 @@ An error status, a redirect, an answer that isn't one of these, more than
|
|
|
739
801
|
throws does: Linear tells the session. The URL must be http(s), without
|
|
740
802
|
credentials in it; a bad one throws when the channel is declared.
|
|
741
803
|
|
|
804
|
+
To let the service check that a request came from your deployment and wasn't
|
|
805
|
+
changed or replayed, set `MDA_SERVICE_SECRET` in the project's `.env`;
|
|
806
|
+
`mda deploy` forwards it to the deployment. MDA then signs every endpoint
|
|
807
|
+
request as [Standard Webhooks](https://www.standardwebhooks.com/) does:
|
|
808
|
+
`webhook-id`, `webhook-timestamp` and `webhook-signature`, an HMAC-SHA256 of the
|
|
809
|
+
id, the timestamp and the exact body. The secret is `whsec_` and padded base64
|
|
810
|
+
of 24 to 64 random bytes (`echo "whsec_$(openssl rand -base64 32)"`; an
|
|
811
|
+
`openssl rand -hex 32` value is valid too); several, separated by commas, each
|
|
812
|
+
sign the request, for rotation. A malformed secret fails the handler.
|
|
813
|
+
|
|
814
|
+
The service keeps the same secret and verifies with any Standard Webhooks
|
|
815
|
+
library, which also rejects timestamps older than five minutes:
|
|
816
|
+
|
|
817
|
+
```ts
|
|
818
|
+
import { Webhook } from "standardwebhooks";
|
|
819
|
+
|
|
820
|
+
const event = new Webhook(process.env.ENDPOINT_SECRET!).verify(
|
|
821
|
+
rawBody,
|
|
822
|
+
Object.fromEntries(request.headers)
|
|
823
|
+
);
|
|
824
|
+
```
|
|
825
|
+
|
|
742
826
|
On the service's side, `LinearEndpointRequest<K>` and
|
|
743
827
|
`GitHubEndpointRequest<K>` type what the channel sends, `{ event: { key,
|
|
744
828
|
deliveryId, payload }, thread }`, with the payload typed by the event key, and
|
|
745
|
-
`EndpointAnswer` types
|
|
746
|
-
|
|
747
|
-
`Request`
|
|
829
|
+
`EndpointAnswer` types an answer, all JSON; answer `null` to start nothing. The
|
|
830
|
+
request types are types only: validate the body as your service validates
|
|
831
|
+
input, after verifying its signature, or the credential your endpoint's `Request`
|
|
832
|
+
carries.
|
|
748
833
|
|
|
749
834
|
```ts
|
|
750
835
|
import type { EndpointAnswer, LinearEndpointRequest } from "managed-deepagents";
|
|
751
836
|
|
|
752
837
|
app.post("/linear/runs", (req, res) => {
|
|
753
838
|
const { event, thread } = req.body as LinearEndpointRequest;
|
|
754
|
-
const answer: EndpointAnswer =
|
|
839
|
+
const answer: EndpointAnswer | null =
|
|
755
840
|
event.key === "AgentSessionEvent.created"
|
|
756
841
|
? { input: `Plan ${event.payload.agentSession.issue?.title}` }
|
|
757
842
|
: null;
|
|
@@ -800,6 +885,7 @@ export const schedule = defineSchedule({
|
|
|
800
885
|
|
|
801
886
|
```md
|
|
802
887
|
<!-- schedules/daily-digest.md -->
|
|
888
|
+
|
|
803
889
|
Write the daily digest.
|
|
804
890
|
```
|
|
805
891
|
|
|
@@ -910,7 +996,10 @@ import type { ManagedToolRuntime } from "managed-deepagents";
|
|
|
910
996
|
|
|
911
997
|
async function writeReport(runtime: ManagedToolRuntime) {
|
|
912
998
|
if (!runtime.backend) throw new Error("This tool requires a sandbox");
|
|
913
|
-
const result = await runtime.backend.write(
|
|
999
|
+
const result = await runtime.backend.write(
|
|
1000
|
+
"/workspace/report.txt",
|
|
1001
|
+
"Report ready"
|
|
1002
|
+
);
|
|
914
1003
|
if (result.error) throw new Error(result.error);
|
|
915
1004
|
}
|
|
916
1005
|
```
|
|
@@ -1041,10 +1130,10 @@ export const sandbox = defineSandbox({
|
|
|
1041
1130
|
});
|
|
1042
1131
|
```
|
|
1043
1132
|
|
|
1044
|
-
| Header value
|
|
1045
|
-
|
|
|
1046
|
-
| `ref`
|
|
1047
|
-
| `bearer(ref)`
|
|
1133
|
+
| Header value | Sent value |
|
|
1134
|
+
| ---------------------- | -------------------------------- |
|
|
1135
|
+
| `ref` | Raw token |
|
|
1136
|
+
| `bearer(ref)` | `Bearer <token>` |
|
|
1048
1137
|
| `basic(username, ref)` | `Basic <base64(username:token)>` |
|
|
1049
1138
|
|
|
1050
1139
|
Use `{ type: "agent" }` for agent credentials. Omit header `type` for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAKjB,MAAM,kBAAkB,CAAC;
|
|
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;AA4B1B,OAAO,KAAK,EAEV,oBAAoB,EAKrB,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;AAOpB,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CAkD7E;AAoDD,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { channelThreadId, httpChannel, } from "../http/index.js";
|
|
2
|
-
import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler,
|
|
3
|
-
import { interruptedNotice } from "../http/studio.js";
|
|
2
|
+
import { channelName, checkEventKeys, definedFields, eventSnapshot, handledEventKeys, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, finishEvents, receiveEvents, verifyHmacSha256, } from "../http/provider.js";
|
|
3
|
+
import { interruptedNotice, pendingDecision } from "../http/studio.js";
|
|
4
4
|
import { logger } from "../../runtime/log.js";
|
|
5
5
|
import { connections } from "../../connections.js";
|
|
6
6
|
import { ConnectionsNotConfiguredError } from "../../agent-auth.js";
|
|
@@ -35,7 +35,8 @@ export function githubChannel(options = {}) {
|
|
|
35
35
|
id: message.threadId,
|
|
36
36
|
channel: { name: channelName(channel) },
|
|
37
37
|
}),
|
|
38
|
-
|
|
38
|
+
onReceived: receiveEvents(options.onReceived, githubEvent, () => channelName(channel)),
|
|
39
|
+
onFinish: finishEvents((target, delivery) => notifyInterrupted(handlers, target, delivery, channelName(channel)), options.onFinish, githubEvent, () => channelName(channel)),
|
|
39
40
|
});
|
|
40
41
|
return channel;
|
|
41
42
|
}
|
|
@@ -46,8 +47,8 @@ export function githubChannel(options = {}) {
|
|
|
46
47
|
* is only asked, so it can skip side effects.
|
|
47
48
|
*/
|
|
48
49
|
async function notifyInterrupted(handlers, target, delivery, name) {
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
50
|
+
const pending = pendingDecision(delivery);
|
|
51
|
+
if (!pending)
|
|
51
52
|
return;
|
|
52
53
|
if ((await handlerInput(handlers, delivery.rawEvent, {
|
|
53
54
|
id: delivery.threadId,
|
|
@@ -55,7 +56,7 @@ async function notifyInterrupted(handlers, target, delivery, name) {
|
|
|
55
56
|
interrupted: true,
|
|
56
57
|
})) === undefined)
|
|
57
58
|
return;
|
|
58
|
-
await postInterruptedNotice(target, delivery,
|
|
59
|
+
await postInterruptedNotice(target, delivery, pending);
|
|
59
60
|
}
|
|
60
61
|
/** The App options deploy reads, without unset fields. */
|
|
61
62
|
function appConfig(app) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,WAAW,GAMZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The handles an event's text mentions: GitHub sends no event for a mention. */
|
|
2
|
+
/**
|
|
3
|
+
* The handles, such as `@octocat`, the event's own text mentions: lowercased,
|
|
4
|
+
* each once, in order. Code doesn't mention anyone, as on GitHub.
|
|
5
|
+
*/
|
|
6
|
+
export declare function eventMentions(name: string, payload: Record<string, unknown>): string[];
|
|
7
|
+
//# 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;AAqBjF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,EAAE,CAiBV"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/** The handles an event's text mentions: GitHub sends no event for a mention. */
|
|
2
|
+
// A login (letters, digits, hyphens, at most 39 characters) or an
|
|
3
|
+
// organization's team, as GitHub links them. Not part of an email address,
|
|
4
|
+
// a longer word or a path, and without trailing punctuation.
|
|
5
|
+
const MENTION = /(?<![A-Za-z0-9_`@/.-])@([A-Za-z0-9][A-Za-z0-9-]{0,38}(?:\/[A-Za-z0-9_-](?:[A-Za-z0-9_.-]{0,98}[A-Za-z0-9_-])?)?)(?![A-Za-z0-9_-])/g;
|
|
6
|
+
/** A fence opens or closes a code block on a line of its own. */
|
|
7
|
+
const FENCE = /^ {0,3}(`{3,}|~{3,})/;
|
|
8
|
+
const PARAGRAPH_BREAK = /\n[ \t]*\n/;
|
|
9
|
+
const BACKTICKS = /`+/g;
|
|
10
|
+
const MAX_MENTIONS = 50;
|
|
11
|
+
/** Where an event's text is: the comment, review or subject that triggered it. */
|
|
12
|
+
const TEXT_FIELDS = {
|
|
13
|
+
issues: ["issue", ["title", "body"]],
|
|
14
|
+
pull_request: ["pull_request", ["title", "body"]],
|
|
15
|
+
issue_comment: ["comment", ["body"]],
|
|
16
|
+
pull_request_review: ["review", ["body"]],
|
|
17
|
+
pull_request_review_comment: ["comment", ["body"]],
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The handles, such as `@octocat`, the event's own text mentions: lowercased,
|
|
21
|
+
* each once, in order. Code doesn't mention anyone, as on GitHub.
|
|
22
|
+
*/
|
|
23
|
+
export function eventMentions(name, payload) {
|
|
24
|
+
if (!Object.hasOwn(TEXT_FIELDS, name))
|
|
25
|
+
return [];
|
|
26
|
+
const [subjectField, textFields] = TEXT_FIELDS[name];
|
|
27
|
+
const subject = payload[subjectField];
|
|
28
|
+
if (!subject || typeof subject !== "object")
|
|
29
|
+
return [];
|
|
30
|
+
const text = textFields
|
|
31
|
+
.map((field) => subject[field])
|
|
32
|
+
.filter((value) => typeof value === "string")
|
|
33
|
+
.join("\n\n");
|
|
34
|
+
const mentions = [];
|
|
35
|
+
for (const match of withoutCode(text).matchAll(MENTION)) {
|
|
36
|
+
const handle = `@${match[1].toLowerCase()}`;
|
|
37
|
+
if (mentions.includes(handle))
|
|
38
|
+
continue;
|
|
39
|
+
mentions.push(handle);
|
|
40
|
+
if (mentions.length === MAX_MENTIONS)
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
return mentions;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The text outside fenced code blocks and inline code spans, as Markdown
|
|
47
|
+
* reads them. A fence that is never closed runs to the end, as on GitHub.
|
|
48
|
+
*/
|
|
49
|
+
function withoutCode(text) {
|
|
50
|
+
const prose = [];
|
|
51
|
+
let fence = "";
|
|
52
|
+
for (const line of text.split("\n")) {
|
|
53
|
+
const marker = FENCE.exec(line);
|
|
54
|
+
const rest = marker ? line.slice(marker[0].length) : "";
|
|
55
|
+
if (!fence) {
|
|
56
|
+
// A backtick fence's info string can't hold a backtick.
|
|
57
|
+
if (marker && !(marker[1].startsWith("`") && rest.includes("`"))) {
|
|
58
|
+
fence = marker[1];
|
|
59
|
+
prose.push("");
|
|
60
|
+
}
|
|
61
|
+
else
|
|
62
|
+
prose.push(line);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (marker &&
|
|
66
|
+
marker[1][0] === fence[0] &&
|
|
67
|
+
marker[1].length >= fence.length &&
|
|
68
|
+
!rest.trim())
|
|
69
|
+
fence = "";
|
|
70
|
+
prose.push("");
|
|
71
|
+
}
|
|
72
|
+
return prose.join("\n").split(PARAGRAPH_BREAK).map(withoutSpans).join("\n\n");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* A paragraph without its code spans. A span opens with a run of backticks
|
|
76
|
+
* and closes with the next run of the same length; a run that nothing
|
|
77
|
+
* closes is just backticks.
|
|
78
|
+
*/
|
|
79
|
+
function withoutSpans(paragraph) {
|
|
80
|
+
const runs = [...paragraph.matchAll(BACKTICKS)].map((match) => [match.index, match.index + match[0].length]);
|
|
81
|
+
const closers = new Map();
|
|
82
|
+
runs.forEach(([start, end], index) => {
|
|
83
|
+
const waiting = closers.get(end - start) ?? [];
|
|
84
|
+
waiting.push(index);
|
|
85
|
+
closers.set(end - start, waiting);
|
|
86
|
+
});
|
|
87
|
+
// How far each length's queue has been read.
|
|
88
|
+
const read = new Map();
|
|
89
|
+
const kept = [];
|
|
90
|
+
let cursor = 0;
|
|
91
|
+
let index = 0;
|
|
92
|
+
while (index < runs.length) {
|
|
93
|
+
const [start, end] = runs[index];
|
|
94
|
+
const waiting = closers.get(end - start);
|
|
95
|
+
let next = read.get(end - start) ?? 0;
|
|
96
|
+
while (next < waiting.length && waiting[next] <= index)
|
|
97
|
+
next += 1;
|
|
98
|
+
read.set(end - start, next);
|
|
99
|
+
if (next === waiting.length) {
|
|
100
|
+
index += 1;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const closer = waiting[next];
|
|
104
|
+
read.set(end - start, next + 1);
|
|
105
|
+
kept.push(`${paragraph.slice(cursor, start)} `);
|
|
106
|
+
cursor = runs[closer][1];
|
|
107
|
+
index = closer + 1;
|
|
108
|
+
}
|
|
109
|
+
kept.push(paragraph.slice(cursor));
|
|
110
|
+
return kept.join("");
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=mentions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/channels/github/mentions.ts"],"names":[],"mappings":"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"}
|