managed-deepagents 0.9.6-dev.2 → 0.9.6-dev.21
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 +1075 -37
- 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/browser.d.ts +37 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +31 -0
- package/dist/browser.js.map +1 -0
- package/dist/channels/actor.d.ts +57 -0
- package/dist/channels/actor.d.ts.map +1 -0
- package/dist/channels/actor.js +24 -0
- package/dist/channels/actor.js.map +1 -0
- package/dist/channels/assistant-text.d.ts +29 -0
- package/dist/channels/assistant-text.d.ts.map +1 -1
- package/dist/channels/assistant-text.js +72 -1
- package/dist/channels/assistant-text.js.map +1 -1
- package/dist/channels/binding.d.ts +20 -1
- package/dist/channels/binding.d.ts.map +1 -1
- package/dist/channels/binding.js +44 -11
- package/dist/channels/binding.js.map +1 -1
- package/dist/channels/delivery.d.ts +51 -0
- package/dist/channels/delivery.d.ts.map +1 -0
- package/dist/channels/delivery.js +424 -0
- package/dist/channels/delivery.js.map +1 -0
- package/dist/channels/github/app-setup.d.ts +32 -0
- package/dist/channels/github/app-setup.d.ts.map +1 -0
- package/dist/channels/github/app-setup.js +146 -0
- package/dist/channels/github/app-setup.js.map +1 -0
- 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 +12 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +266 -0
- package/dist/channels/github/index.js.map +1 -0
- package/dist/channels/github/mentions.d.ts +12 -0
- package/dist/channels/github/mentions.d.ts.map +1 -0
- package/dist/channels/github/mentions.js +185 -0
- package/dist/channels/github/mentions.js.map +1 -0
- package/dist/channels/github/schema.d.ts +4165 -0
- package/dist/channels/github/schema.d.ts.map +1 -0
- package/dist/channels/github/schema.js +221 -0
- package/dist/channels/github/schema.js.map +1 -0
- package/dist/channels/github/types.d.ts +170 -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 +137 -0
- package/dist/channels/http/endpoint.d.ts.map +1 -0
- package/dist/channels/http/endpoint.js +286 -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 +439 -65
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +8 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +35 -16
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +67 -5
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +155 -43
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +125 -0
- package/dist/channels/http/provider.d.ts.map +1 -0
- package/dist/channels/http/provider.js +227 -0
- package/dist/channels/http/provider.js.map +1 -0
- package/dist/channels/http/studio.d.ts +24 -0
- package/dist/channels/http/studio.d.ts.map +1 -0
- package/dist/channels/http/studio.js +95 -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 +166 -2
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/linear/app-setup.d.ts +29 -0
- package/dist/channels/linear/app-setup.d.ts.map +1 -0
- package/dist/channels/linear/app-setup.js +102 -0
- package/dist/channels/linear/app-setup.js.map +1 -0
- 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 +13 -0
- package/dist/channels/linear/index.d.ts.map +1 -0
- package/dist/channels/linear/index.js +457 -0
- package/dist/channels/linear/index.js.map +1 -0
- package/dist/channels/linear/schema.d.ts +1050 -0
- package/dist/channels/linear/schema.d.ts.map +1 -0
- package/dist/channels/linear/schema.js +255 -0
- package/dist/channels/linear/schema.js.map +1 -0
- package/dist/channels/linear/types.d.ts +169 -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/messaging-registry.d.ts +16 -0
- package/dist/channels/messaging-registry.d.ts.map +1 -1
- package/dist/channels/messaging-registry.js +29 -0
- package/dist/channels/messaging-registry.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 +55 -0
- package/dist/channels/reserved-connections.js.map +1 -0
- package/dist/channels/resolve-user-endpoint.d.ts +34 -0
- package/dist/channels/resolve-user-endpoint.d.ts.map +1 -0
- package/dist/channels/resolve-user-endpoint.js +51 -0
- package/dist/channels/resolve-user-endpoint.js.map +1 -0
- package/dist/channels/resolve-user.d.ts +95 -0
- package/dist/channels/resolve-user.d.ts.map +1 -0
- package/dist/channels/resolve-user.js +143 -0
- package/dist/channels/resolve-user.js.map +1 -0
- package/dist/channels/run-input.d.ts +88 -0
- package/dist/channels/run-input.d.ts.map +1 -0
- package/dist/channels/run-input.js +177 -0
- package/dist/channels/run-input.js.map +1 -0
- package/dist/channels/runtime.d.ts +5 -2
- package/dist/channels/runtime.d.ts.map +1 -1
- package/dist/channels/runtime.js +19 -10
- package/dist/channels/runtime.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts +2 -13
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +6 -73
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/slack/api.d.ts +2 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +6 -0
- package/dist/channels/slack/api.js.map +1 -1
- package/dist/channels/slack/connections.d.ts +6 -0
- package/dist/channels/slack/connections.d.ts.map +1 -0
- package/dist/channels/slack/connections.js +6 -0
- package/dist/channels/slack/connections.js.map +1 -0
- package/dist/channels/slack/events.d.ts +278 -0
- package/dist/channels/slack/events.d.ts.map +1 -0
- package/dist/channels/slack/events.js +235 -0
- package/dist/channels/slack/events.js.map +1 -0
- package/dist/channels/slack/files.d.ts.map +1 -1
- package/dist/channels/slack/files.js +2 -3
- package/dist/channels/slack/files.js.map +1 -1
- package/dist/channels/slack/index.d.ts +90 -2
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +188 -6
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/channels/slack/message-content.d.ts.map +1 -1
- package/dist/channels/slack/message-content.js +23 -28
- package/dist/channels/slack/message-content.js.map +1 -1
- package/dist/channels/slack/status.d.ts +76 -0
- package/dist/channels/slack/status.d.ts.map +1 -0
- package/dist/channels/slack/status.js +427 -0
- package/dist/channels/slack/status.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.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +9 -15
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/conversation.d.ts +11 -0
- package/dist/channels/trigger/conversation.d.ts.map +1 -0
- package/dist/channels/trigger/conversation.js +72 -0
- package/dist/channels/trigger/conversation.js.map +1 -0
- package/dist/channels/trigger/http.d.ts +130 -4
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +408 -78
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/identity-context.d.ts.map +1 -1
- package/dist/channels/trigger/identity-context.js +2 -5
- package/dist/channels/trigger/identity-context.js.map +1 -1
- package/dist/channels/trigger/ingress.d.ts +70 -1
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +135 -21
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/channels/trigger/transport.d.ts +10 -0
- package/dist/channels/trigger/transport.d.ts.map +1 -1
- package/dist/channels/trigger/transport.js +25 -9
- package/dist/channels/trigger/transport.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +92 -3
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +37 -0
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/channels/types.d.ts +53 -4
- package/dist/channels/types.d.ts.map +1 -1
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -1
- package/dist/connections.d.ts +36 -12
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +125 -30
- 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/define-deep-agent.d.ts +2 -2
- package/dist/define-deep-agent.d.ts.map +1 -1
- package/dist/define-deep-agent.js +53 -2
- package/dist/define-deep-agent.js.map +1 -1
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +3 -1
- package/dist/identity/index.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 +3 -2
- package/dist/identity/loopback.js.map +1 -1
- package/dist/identity/options.d.ts +9 -0
- package/dist/identity/options.d.ts.map +1 -1
- package/dist/identity/options.js +1 -1
- package/dist/identity/options.js.map +1 -1
- package/dist/identity/slack/links.js +3 -2
- package/dist/identity/slack/links.js.map +1 -1
- package/dist/identity/types.d.ts +3 -0
- package/dist/identity/types.d.ts.map +1 -1
- package/dist/index.d.ts +19 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/loopback.d.ts +1 -0
- package/dist/ingress/loopback.d.ts.map +1 -1
- package/dist/ingress/loopback.js +7 -3
- package/dist/ingress/loopback.js.map +1 -1
- package/dist/ingress/runs.d.ts +74 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +184 -9
- package/dist/ingress/runs.js.map +1 -1
- package/dist/managed-composition.d.ts +3 -0
- package/dist/managed-composition.d.ts.map +1 -1
- package/dist/managed-composition.js +29 -13
- package/dist/managed-composition.js.map +1 -1
- package/dist/namespaces.d.ts +25 -21
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +4 -29
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/async-subagents.d.ts +27 -0
- package/dist/runtime/async-subagents.d.ts.map +1 -0
- package/dist/runtime/async-subagents.js +139 -0
- package/dist/runtime/async-subagents.js.map +1 -0
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +177 -8
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/backend.d.ts +7 -0
- package/dist/runtime/backend.d.ts.map +1 -1
- package/dist/runtime/backend.js +32 -7
- package/dist/runtime/backend.js.map +1 -1
- package/dist/runtime/browser-facade.d.ts +10 -0
- package/dist/runtime/browser-facade.d.ts.map +1 -0
- package/dist/runtime/browser-facade.js +23 -0
- package/dist/runtime/browser-facade.js.map +1 -0
- package/dist/runtime/browser-langsmith.d.ts +143 -0
- package/dist/runtime/browser-langsmith.d.ts.map +1 -0
- package/dist/runtime/browser-langsmith.js +508 -0
- package/dist/runtime/browser-langsmith.js.map +1 -0
- package/dist/runtime/browser-recorder.py +831 -0
- package/dist/runtime/browser-selection.d.ts +10 -0
- package/dist/runtime/browser-selection.d.ts.map +1 -0
- package/dist/runtime/browser-selection.js +21 -0
- package/dist/runtime/browser-selection.js.map +1 -0
- package/dist/runtime/browser.d.ts +128 -0
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +795 -0
- package/dist/runtime/browser.js.map +1 -0
- 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 +81 -0
- package/dist/runtime/channel-icon.js.map +1 -0
- package/dist/runtime/channel.d.ts +11 -0
- package/dist/runtime/channel.d.ts.map +1 -1
- package/dist/runtime/channel.js.map +1 -1
- package/dist/runtime/graph-build-timing.d.ts +30 -0
- package/dist/runtime/graph-build-timing.d.ts.map +1 -0
- package/dist/runtime/graph-build-timing.js +50 -0
- package/dist/runtime/graph-build-timing.js.map +1 -0
- 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 +38 -2
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +10 -0
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +22 -0
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts +38 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +97 -43
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/langsmith-env.d.ts +19 -0
- package/dist/runtime/langsmith-env.d.ts.map +1 -0
- package/dist/runtime/langsmith-env.js +38 -0
- package/dist/runtime/langsmith-env.js.map +1 -0
- package/dist/runtime/managed-thread.d.ts +61 -0
- package/dist/runtime/managed-thread.d.ts.map +1 -0
- package/dist/runtime/managed-thread.js +76 -0
- package/dist/runtime/managed-thread.js.map +1 -0
- package/dist/runtime/managed-tools.d.ts +10 -2
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +10 -8
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/policy.d.ts.map +1 -1
- package/dist/runtime/memory/policy.js +1 -3
- package/dist/runtime/memory/policy.js.map +1 -1
- package/dist/runtime/parent-run.d.ts +33 -0
- package/dist/runtime/parent-run.d.ts.map +1 -0
- package/dist/runtime/parent-run.js +114 -0
- package/dist/runtime/parent-run.js.map +1 -0
- package/dist/runtime/run-input.d.ts +14 -1
- package/dist/runtime/run-input.d.ts.map +1 -1
- package/dist/runtime/run-input.js +100 -7
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +15 -2
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +40 -18
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +79 -0
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +165 -7
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime/static-entry.d.ts.map +1 -1
- package/dist/runtime/static-entry.js +1 -0
- package/dist/runtime/static-entry.js.map +1 -1
- package/dist/runtime/thread-record.d.ts +88 -0
- package/dist/runtime/thread-record.d.ts.map +1 -0
- package/dist/runtime/thread-record.js +213 -0
- package/dist/runtime/thread-record.js.map +1 -0
- package/dist/runtime/types.d.ts +12 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime-schedules.d.ts +15 -0
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +83 -20
- package/dist/runtime-schedules.js.map +1 -1
- package/dist/sandbox.d.ts +0 -6
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +3 -7
- package/dist/sandbox.js.map +1 -1
- package/dist/schedule-channel.d.ts +5 -2
- package/dist/schedule-channel.d.ts.map +1 -1
- package/dist/schedule-channel.js +13 -12
- package/dist/schedule-channel.js.map +1 -1
- package/dist/telemetry/metadata.d.ts.map +1 -1
- package/dist/telemetry/metadata.js +4 -4
- package/dist/telemetry/metadata.js.map +1 -1
- package/dist/telemetry/otel/exporter.d.ts.map +1 -1
- package/dist/telemetry/otel/exporter.js +3 -3
- package/dist/telemetry/otel/exporter.js.map +1 -1
- package/dist/types.d.ts +19 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/values.d.ts +15 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +31 -0
- package/dist/values.js.map +1 -0
- package/package.json +26 -12
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { handledEventKeys } from "../http/provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* The App permission each event needs: read to receive it, write to also
|
|
4
|
+
* reply where it happened.
|
|
5
|
+
*/
|
|
6
|
+
const EVENT_PERMISSIONS = {
|
|
7
|
+
"issue_comment.created": { permission: "issues", level: "write" },
|
|
8
|
+
"issue_comment.edited": { permission: "issues", level: "write" },
|
|
9
|
+
"issues.edited": { permission: "issues", level: "write" },
|
|
10
|
+
"issues.labeled": { permission: "issues", level: "write" },
|
|
11
|
+
"issues.opened": { permission: "issues", level: "write" },
|
|
12
|
+
"issues.reopened": { permission: "issues", level: "write" },
|
|
13
|
+
"pull_request.closed": { permission: "pull_requests", level: "write" },
|
|
14
|
+
"pull_request.converted_to_draft": {
|
|
15
|
+
permission: "pull_requests",
|
|
16
|
+
level: "write",
|
|
17
|
+
},
|
|
18
|
+
"pull_request.edited": { permission: "pull_requests", level: "write" },
|
|
19
|
+
"pull_request.labeled": { permission: "pull_requests", level: "write" },
|
|
20
|
+
"pull_request.opened": { permission: "pull_requests", level: "write" },
|
|
21
|
+
"pull_request.ready_for_review": {
|
|
22
|
+
permission: "pull_requests",
|
|
23
|
+
level: "write",
|
|
24
|
+
},
|
|
25
|
+
"pull_request.reopened": { permission: "pull_requests", level: "write" },
|
|
26
|
+
"pull_request.synchronize": { permission: "pull_requests", level: "write" },
|
|
27
|
+
"pull_request_review.dismissed": {
|
|
28
|
+
permission: "pull_requests",
|
|
29
|
+
level: "write",
|
|
30
|
+
},
|
|
31
|
+
"pull_request_review.edited": {
|
|
32
|
+
permission: "pull_requests",
|
|
33
|
+
level: "write",
|
|
34
|
+
},
|
|
35
|
+
"pull_request_review.submitted": {
|
|
36
|
+
permission: "pull_requests",
|
|
37
|
+
level: "write",
|
|
38
|
+
},
|
|
39
|
+
"pull_request_review_comment.created": {
|
|
40
|
+
permission: "pull_requests",
|
|
41
|
+
level: "write",
|
|
42
|
+
},
|
|
43
|
+
"pull_request_review_comment.edited": {
|
|
44
|
+
permission: "pull_requests",
|
|
45
|
+
level: "write",
|
|
46
|
+
},
|
|
47
|
+
"check_run.completed": { permission: "checks", level: "read" },
|
|
48
|
+
"check_suite.completed": { permission: "checks", level: "read" },
|
|
49
|
+
push: { permission: "contents", level: "read" },
|
|
50
|
+
status: { permission: "statuses", level: "read" },
|
|
51
|
+
"workflow_run.completed": { permission: "actions", level: "read" },
|
|
52
|
+
};
|
|
53
|
+
const MAX_PERMISSIONS = 50;
|
|
54
|
+
/** Keeps the App manifest and the deploy report readable. */
|
|
55
|
+
const MAX_REPOSITORIES = 500;
|
|
56
|
+
const PERMISSION_NAME = /^[a-z][a-z_]{0,63}$/;
|
|
57
|
+
const GITHUB_LOGIN = /^(?!-)(?!.*--)[A-Za-z0-9-]{1,39}(?<!-)$/;
|
|
58
|
+
const REPOSITORY_NAME = /^[A-Za-z0-9._-]{1,100}$/;
|
|
59
|
+
/**
|
|
60
|
+
* The App the channel's handlers and `app` options need. The CLI reads it
|
|
61
|
+
* from the channel's manifest instead of working it out; the Python runtime
|
|
62
|
+
* mirrors these rules in `github_app_setup.py`.
|
|
63
|
+
*/
|
|
64
|
+
export function githubAppSetup(handlers, app) {
|
|
65
|
+
const events = handledEventKeys(handlers).filter(isSupportedEventKey);
|
|
66
|
+
// A misspelled option would silently widen what the agent's token reaches.
|
|
67
|
+
const unknown = Object.keys(app ?? {}).filter((key) => key !== "permissions" && key !== "repositories");
|
|
68
|
+
if (unknown.length)
|
|
69
|
+
throw new TypeError(`unknown GitHub app option ${unknown.join(", ")}; use permissions or repositories`);
|
|
70
|
+
const repositories = repositoryAllowlist(app?.repositories);
|
|
71
|
+
return {
|
|
72
|
+
events,
|
|
73
|
+
webhookEvents: [...new Set(events.map((key) => key.split(".")[0]))].sort(),
|
|
74
|
+
permissions: appPermissions(events, app?.permissions ?? {}),
|
|
75
|
+
...(repositories && { repositories }),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function isSupportedEventKey(key) {
|
|
79
|
+
return Object.hasOwn(EVENT_PERMISSIONS, key);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Every App gets `metadata: read`; each handled event raises its permission
|
|
83
|
+
* to the level it needs, and `app.permissions` can raise it further.
|
|
84
|
+
*/
|
|
85
|
+
function appPermissions(events, extra) {
|
|
86
|
+
checkPermissions(extra);
|
|
87
|
+
const permissions = new Map([
|
|
88
|
+
["metadata", { name: "metadata", level: "read", events: [] }],
|
|
89
|
+
]);
|
|
90
|
+
for (const key of events) {
|
|
91
|
+
const { permission, level } = EVENT_PERMISSIONS[key];
|
|
92
|
+
const current = permissions.get(permission);
|
|
93
|
+
if (!current || (current.level === "read" && level === "write"))
|
|
94
|
+
permissions.set(permission, { name: permission, level, events: [key] });
|
|
95
|
+
else if (current.level === level)
|
|
96
|
+
current.events.push(key);
|
|
97
|
+
}
|
|
98
|
+
for (const [name, level] of Object.entries(extra)) {
|
|
99
|
+
const current = permissions.get(name);
|
|
100
|
+
if (!current || (current.level === "read" && level === "write"))
|
|
101
|
+
permissions.set(name, { name, level, events: [] });
|
|
102
|
+
}
|
|
103
|
+
return [...permissions.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
104
|
+
}
|
|
105
|
+
/** JavaScript callers can pass anything, so check what types promise. */
|
|
106
|
+
function checkPermissions(permissions) {
|
|
107
|
+
const names = Object.keys(permissions).sort();
|
|
108
|
+
if (names.length > MAX_PERMISSIONS)
|
|
109
|
+
throw new TypeError(`GitHub app.permissions must list at most ${MAX_PERMISSIONS} permissions`);
|
|
110
|
+
for (const name of names) {
|
|
111
|
+
if (!PERMISSION_NAME.test(name))
|
|
112
|
+
throw new TypeError(`GitHub app.permissions has an invalid permission name '${name}'; use GitHub's names, such as contents`);
|
|
113
|
+
if (permissions[name] !== "read" && permissions[name] !== "write")
|
|
114
|
+
throw new TypeError(`GitHub app.permissions.${name} must be read or write`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The repositories the channel is limited to, lowercased since GitHub names
|
|
119
|
+
* are case-insensitive. One installation covers them, so they share an owner.
|
|
120
|
+
*/
|
|
121
|
+
export function repositoryAllowlist(repositories) {
|
|
122
|
+
if (repositories === undefined)
|
|
123
|
+
return undefined;
|
|
124
|
+
// An empty list could mean "none" or "all"; neither should be silent.
|
|
125
|
+
if (repositories.length === 0)
|
|
126
|
+
throw new TypeError("GitHub app.repositories must list at least one repository; omit it to allow every repository");
|
|
127
|
+
const valid = new Set();
|
|
128
|
+
for (const entry of repositories) {
|
|
129
|
+
const repository = entry.trim();
|
|
130
|
+
const [owner = "", name = "", ...rest] = repository.split("/");
|
|
131
|
+
if (rest.length > 0 ||
|
|
132
|
+
!GITHUB_LOGIN.test(owner) ||
|
|
133
|
+
!REPOSITORY_NAME.test(name) ||
|
|
134
|
+
name === "." ||
|
|
135
|
+
name === "..")
|
|
136
|
+
throw new TypeError(`GitHub app.repositories entry '${repository}' must be owner/name`);
|
|
137
|
+
valid.add(repository.toLowerCase());
|
|
138
|
+
}
|
|
139
|
+
if (valid.size > MAX_REPOSITORIES)
|
|
140
|
+
throw new TypeError(`GitHub app.repositories must list at most ${MAX_REPOSITORIES} repositories`);
|
|
141
|
+
const owners = [...new Set([...valid].map((r) => r.split("/")[0]))].sort();
|
|
142
|
+
if (owners.length > 1)
|
|
143
|
+
throw new TypeError(`GitHub app.repositories must all belong to one owner, because one installation covers them (found: ${owners.join(", ")})`);
|
|
144
|
+
return [...valid].sort();
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=app-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-setup.js","sourceRoot":"","sources":["../../../src/channels/github/app-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reserved agent connection for the deployment's GitHub App: reading it
|
|
3
|
+
* returns an installation token for the App `mda deploy` set up.
|
|
4
|
+
*/
|
|
5
|
+
export declare const GITHUB_TOKEN_SLUG = "mda/github-token";
|
|
6
|
+
/**
|
|
7
|
+
* The deployment's GitHub App connection, or one of the App values stored
|
|
8
|
+
* beside it (`webhook-secret`, `bot-id`) when `suffix` is given.
|
|
9
|
+
*/
|
|
10
|
+
export declare function githubAppConnectionSlug(deploymentId: string, suffix?: string): string;
|
|
11
|
+
//# sourceMappingURL=connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/channels/github/connections.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAER"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { appConnectionSlug } from "../http/provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reserved agent connection for the deployment's GitHub App: reading it
|
|
4
|
+
* returns an installation token for the App `mda deploy` set up.
|
|
5
|
+
*/
|
|
6
|
+
export const GITHUB_TOKEN_SLUG = "mda/github-token";
|
|
7
|
+
/**
|
|
8
|
+
* The deployment's GitHub App connection, or one of the App values stored
|
|
9
|
+
* beside it (`webhook-secret`, `bot-id`) when `suffix` is given.
|
|
10
|
+
*/
|
|
11
|
+
export function githubAppConnectionSlug(deploymentId, suffix) {
|
|
12
|
+
return appConnectionSlug("github", deploymentId, suffix);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/channels/github/connections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,MAAe;IAEf,OAAO,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type HttpChannel } from "../http/index.js";
|
|
2
|
+
import type { GitHubChannelOptions } from "./types.js";
|
|
3
|
+
export type { GitHubAppOptions, GitHubChannelOptions, GitHubChannelThread, GitHubEvent, GitHubEventCallback, GitHubEventResult, PayloadFor, SupportedEventKey, } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Adapt verified GitHub events into HTTP channel messages or skips.
|
|
6
|
+
*
|
|
7
|
+
* @experimental The GitHub channel may change in a minor release.
|
|
8
|
+
*/
|
|
9
|
+
export declare function githubChannel(options?: GitHubChannelOptions): HttpChannel;
|
|
10
|
+
/** Forget values read from Agent Auth; for tests. */
|
|
11
|
+
export declare function resetGitHubAppValues(): void;
|
|
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":"AAEA,OAAO,EAIL,KAAK,WAAW,EAKjB,MAAM,kBAAkB,CAAC;AAgC1B,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAWpB;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CAkD7E;AA2CD,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { channelThreadId, httpChannel, withAgentConnections, } from "../http/index.js";
|
|
2
|
+
import { withResolveUser } from "../resolve-user.js";
|
|
3
|
+
import { channelName, checkEventKeys, eventSnapshot, readDeploymentSecret, resetDeploymentSecrets, resolveEndpoints, runEventHandler, eventThread, finishEvents, receiveEvents, verifyHmacSha256, } from "../http/provider.js";
|
|
4
|
+
import { isEndpointCallback } from "../http/endpoint.js";
|
|
5
|
+
import { interruptedNotice, pendingDecision } from "../http/studio.js";
|
|
6
|
+
import { withPausedNotice } from "../messaging-registry.js";
|
|
7
|
+
import { logger } from "../../runtime/log.js";
|
|
8
|
+
import { connections } from "../../connections.js";
|
|
9
|
+
import { ConnectionsNotConfiguredError } from "../../agent-auth.js";
|
|
10
|
+
import { githubAppSetup } from "./app-setup.js";
|
|
11
|
+
import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug } from "./connections.js";
|
|
12
|
+
import { ENDPOINT_EVENT_FIELDS, SUPPORTED_EVENT_KEYS, githubReceiptSchema, githubIdentifierSchema, githubEventSchema, } from "./schema.js";
|
|
13
|
+
const EVENT_KEYS = new Set(SUPPORTED_EVENT_KEYS);
|
|
14
|
+
/**
|
|
15
|
+
* Adapt verified GitHub events into HTTP channel messages or skips.
|
|
16
|
+
*
|
|
17
|
+
* @experimental The GitHub channel may change in a minor release.
|
|
18
|
+
*/
|
|
19
|
+
export function githubChannel(options = {}) {
|
|
20
|
+
const handlers = resolveEndpoints("GitHub", options.onEvent, ENDPOINT_EVENT_FIELDS);
|
|
21
|
+
checkEventKeys("GitHub", handlers, EVENT_KEYS);
|
|
22
|
+
const appSetup = githubAppSetup(handlers, options.app);
|
|
23
|
+
const channel = httpChannel({
|
|
24
|
+
provider: "github",
|
|
25
|
+
...(options.multitaskStrategy && {
|
|
26
|
+
multitaskStrategy: options.multitaskStrategy,
|
|
27
|
+
}),
|
|
28
|
+
// mda deploy sets up the GitHub App from this.
|
|
29
|
+
providerConfig: appSetup,
|
|
30
|
+
verify: verifyGitHubRequest,
|
|
31
|
+
parse: (context) => parseGitHubRequest(context, handlers, channelName(channel), appSetup.repositories),
|
|
32
|
+
input: (message, rawEvent) => handlerInput(handlers, rawEvent, {
|
|
33
|
+
id: message.threadId,
|
|
34
|
+
channel: { name: channelName(channel) },
|
|
35
|
+
}),
|
|
36
|
+
onReceived: receiveEvents(options.onReceived, githubEvent, () => channelName(channel)),
|
|
37
|
+
onFinish: finishEvents((target, delivery) => notifyWaiting(handlers, target, delivery, channelName(channel)), options.onFinish, githubEvent, (delivery) => eventThread(delivery, channelName(channel))),
|
|
38
|
+
});
|
|
39
|
+
// A run that stops on interrupts says so itself (../delivery.ts): the
|
|
40
|
+
// handler accepted the event that started it.
|
|
41
|
+
// Deploy provides the App's token at this name.
|
|
42
|
+
withAgentConnections(channel, [GITHUB_TOKEN_SLUG]);
|
|
43
|
+
return withPausedNotice(withResolveUser(channel, options.resolveUser, "channels.github"), postInterruptedNotice);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Tell the issue or pull request that a new event found its thread waiting
|
|
47
|
+
* on a decision. Only for an event its handler would act on, so the handler's
|
|
48
|
+
* filters, such as trusted senders or mentions, decide who gets a notice. The
|
|
49
|
+
* handler knows it is only asked, so it can skip side effects.
|
|
50
|
+
*/
|
|
51
|
+
async function notifyWaiting(handlers, target, delivery, name) {
|
|
52
|
+
if (pendingDecision(delivery) !== "waiting")
|
|
53
|
+
return;
|
|
54
|
+
if ((await handlerInput(handlers, delivery.rawEvent, {
|
|
55
|
+
id: delivery.threadId,
|
|
56
|
+
channel: { name },
|
|
57
|
+
interrupted: true,
|
|
58
|
+
})) === undefined)
|
|
59
|
+
return;
|
|
60
|
+
await postInterruptedNotice(target, delivery, "waiting");
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The App's webhook secret or bot ID: the `GH_*` env override when set,
|
|
64
|
+
* otherwise the agent secret Agent Auth stored when `mda deploy` created the
|
|
65
|
+
* App, at `mda/github-app/{deployment}/{suffix}`. Only a missing connection
|
|
66
|
+
* reads as `undefined`; credential store failures propagate.
|
|
67
|
+
*/
|
|
68
|
+
function gitHubAppValue(envKey, suffix) {
|
|
69
|
+
return readDeploymentSecret(envKey, (deploymentId) => githubAppConnectionSlug(deploymentId, suffix), `GitHub App ${suffix}`);
|
|
70
|
+
}
|
|
71
|
+
/** Forget values read from Agent Auth; for tests. */
|
|
72
|
+
export function resetGitHubAppValues() {
|
|
73
|
+
resetDeploymentSecrets();
|
|
74
|
+
}
|
|
75
|
+
/** GitHub's delivery ID for a log line, or `unknown` when it is not one. */
|
|
76
|
+
function deliveryLabel(deliveryId) {
|
|
77
|
+
return deliveryId && /^[0-9a-fA-F-]{1,64}$/.test(deliveryId)
|
|
78
|
+
? deliveryId
|
|
79
|
+
: "unknown";
|
|
80
|
+
}
|
|
81
|
+
async function verifyGitHubRequest({ request, rawBody, }) {
|
|
82
|
+
// GitHub pings a new App before Agent Auth has its webhook secret, and a
|
|
83
|
+
// ping starts nothing, so it needs no secret. Reading it here would also
|
|
84
|
+
// remember the secret as missing and reject the first real events.
|
|
85
|
+
if (request.headers.get("x-github-event") === "ping")
|
|
86
|
+
return true;
|
|
87
|
+
// Reject unsigned deliveries before reading the secret from Agent Auth.
|
|
88
|
+
const signature = request.headers.get("x-hub-signature-256") ?? "";
|
|
89
|
+
if (!/^sha256=[a-fA-F0-9]{64}$/.test(signature))
|
|
90
|
+
return false;
|
|
91
|
+
let secret;
|
|
92
|
+
try {
|
|
93
|
+
secret = await gitHubAppValue("GH_WEBHOOK_SECRET", "webhook-secret");
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if (error instanceof ConnectionsNotConfiguredError) {
|
|
97
|
+
// The message names only the missing setting, so it is safe to log.
|
|
98
|
+
logger.error(`GitHub delivery ${deliveryLabel(request.headers.get("x-github-delivery"))} ` +
|
|
99
|
+
`cannot be verified: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
if (!secret)
|
|
104
|
+
return false;
|
|
105
|
+
return verifyHmacSha256(secret, rawBody, signature.slice(7));
|
|
106
|
+
}
|
|
107
|
+
async function parseGitHubRequest({ request }, handlers, channelName, repositories) {
|
|
108
|
+
const envelope = githubReceiptSchema.parse({
|
|
109
|
+
event: request.headers.get("x-github-event"),
|
|
110
|
+
deliveryId: request.headers.get("x-github-delivery"),
|
|
111
|
+
payload: await request.json(),
|
|
112
|
+
});
|
|
113
|
+
const { event, deliveryId, payload } = envelope;
|
|
114
|
+
logReceipt(envelope);
|
|
115
|
+
const response = Response.json({ status: "received" }, { status: event === "ping" ? 200 : 202 });
|
|
116
|
+
// Events nothing handles stop here, before run creation.
|
|
117
|
+
// Events without an action, such as `push`, are keyed by their name.
|
|
118
|
+
const key = (payload.action === undefined ? event : `${event}.${payload.action}`);
|
|
119
|
+
if (!Object.hasOwn(handlers, key) || handlers[key] === undefined)
|
|
120
|
+
return { type: "ignore", response };
|
|
121
|
+
const parsedEvent = githubEventSchema.parse({ key, payload, deliveryId });
|
|
122
|
+
// Events from repositories the channel is not limited to start nothing.
|
|
123
|
+
if (repositories &&
|
|
124
|
+
!repositories.includes(parsedEvent.repository.fullName.toLowerCase()))
|
|
125
|
+
return { type: "ignore", response };
|
|
126
|
+
// Ignore the App's own activity to avoid triggering ourselves.
|
|
127
|
+
const configuredBotId = (await gitHubAppValue("GH_APP_BOT_ID", "bot-id")) ?? "";
|
|
128
|
+
if (!/^[1-9][0-9]*$/.test(configuredBotId))
|
|
129
|
+
throw new TypeError("GitHub App bot ID is unavailable; run `mda deploy` to store it or set GH_APP_BOT_ID");
|
|
130
|
+
const botId = githubIdentifierSchema.parse(Number(configuredBotId));
|
|
131
|
+
if (parsedEvent.sender.id === botId)
|
|
132
|
+
return { type: "ignore", response };
|
|
133
|
+
// Preserve the original event even if a callback modifies its argument.
|
|
134
|
+
const snapshot = eventSnapshot(parsedEvent, "GitHub");
|
|
135
|
+
// One thread per issue or pull request, so the agent keeps the
|
|
136
|
+
// conversation. Other events get their own thread, keyed by the delivery so
|
|
137
|
+
// a redelivery still finds the run it started.
|
|
138
|
+
const number = conversationNumber(parsedEvent);
|
|
139
|
+
const threadId = channelThreadId(channelName, number === undefined
|
|
140
|
+
? `delivery/${deliveryId}`
|
|
141
|
+
: `${parsedEvent.repository.id}/${number}`);
|
|
142
|
+
const target = number === undefined
|
|
143
|
+
? null
|
|
144
|
+
: { repository: parsedEvent.repository.fullName, number };
|
|
145
|
+
// What the run starts with is decided once MDA knows the thread takes a
|
|
146
|
+
// new turn.
|
|
147
|
+
return {
|
|
148
|
+
type: "message",
|
|
149
|
+
message: {
|
|
150
|
+
threadId,
|
|
151
|
+
userId: senderUserId(parsedEvent.sender),
|
|
152
|
+
target,
|
|
153
|
+
deliveryKey: deliveryId,
|
|
154
|
+
// An endpoint may take longer to answer than GitHub waits.
|
|
155
|
+
...(isEndpointCallback(handlers[key]) && { background: true }),
|
|
156
|
+
},
|
|
157
|
+
rawEvent: snapshot,
|
|
158
|
+
actor: parsedEvent.actor,
|
|
159
|
+
response,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Who the run acts for. GitHub signs each delivery, so its sender is verified:
|
|
164
|
+
* a person acts as `github:<id>`, by the numeric ID that outlives login
|
|
165
|
+
* renames, and gets their own user memory where the agent allows it. Bots and
|
|
166
|
+
* organizations run as the channel.
|
|
167
|
+
*/
|
|
168
|
+
function senderUserId(sender) {
|
|
169
|
+
return sender.type === "User" ? `github:${sender.id}` : "mda:channel";
|
|
170
|
+
}
|
|
171
|
+
/** What the event's handler starts a run with; `undefined` when it skips or fails. */
|
|
172
|
+
async function handlerInput(handlers, rawEvent, thread) {
|
|
173
|
+
const event = githubEvent(rawEvent);
|
|
174
|
+
const handler = event && Object.hasOwn(handlers, event.key)
|
|
175
|
+
? handlers[event.key]
|
|
176
|
+
: undefined;
|
|
177
|
+
if (!event || !handler)
|
|
178
|
+
return undefined;
|
|
179
|
+
const outcome = await runEventHandler("GitHub", event, () => handler(event, thread));
|
|
180
|
+
return outcome.type === "input" ? outcome.input : undefined;
|
|
181
|
+
}
|
|
182
|
+
/** The parsed event a delivery carries, as handlers may change it. */
|
|
183
|
+
function githubEvent(rawEvent) {
|
|
184
|
+
if (!rawEvent || typeof rawEvent !== "object" || Array.isArray(rawEvent))
|
|
185
|
+
return undefined;
|
|
186
|
+
const event = structuredClone(rawEvent);
|
|
187
|
+
return EVENT_KEYS.has(event.key) ? event : undefined;
|
|
188
|
+
}
|
|
189
|
+
/** The issue or pull request an event is about, if any. */
|
|
190
|
+
function conversationNumber(event) {
|
|
191
|
+
const payload = event.payload;
|
|
192
|
+
for (const subject of ["issue", "pull_request"]) {
|
|
193
|
+
const number = payload[subject]
|
|
194
|
+
?.number;
|
|
195
|
+
if (isIssueNumber(number))
|
|
196
|
+
return number;
|
|
197
|
+
}
|
|
198
|
+
// A CI run belongs to a pull request only when it ran for exactly one.
|
|
199
|
+
for (const run of ["workflow_run", "check_run", "check_suite"]) {
|
|
200
|
+
const pullRequests = payload[run]?.pull_requests;
|
|
201
|
+
if (Array.isArray(pullRequests) && pullRequests.length === 1) {
|
|
202
|
+
const number = pullRequests[0]?.number;
|
|
203
|
+
if (isIssueNumber(number))
|
|
204
|
+
return number;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
function isIssueNumber(value) {
|
|
210
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
|
|
211
|
+
}
|
|
212
|
+
const REPOSITORY_PATTERN = /^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/;
|
|
213
|
+
const GITHUB_API_TIMEOUT_MS = 10_000;
|
|
214
|
+
/**
|
|
215
|
+
* The thread waits on an interrupt, so tell the issue or pull request where
|
|
216
|
+
* to continue it. Posts as the App; the notice is fixed text.
|
|
217
|
+
*/
|
|
218
|
+
async function postInterruptedNotice(target, delivery, outcome) {
|
|
219
|
+
if (!isGitHubTarget(target))
|
|
220
|
+
return;
|
|
221
|
+
const [owner, name] = target.repository.split("/");
|
|
222
|
+
const token = await connections.resolveDeploymentSecret(GITHUB_TOKEN_SLUG);
|
|
223
|
+
const response = await fetch(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(name)}/issues/${target.number}/comments`, {
|
|
224
|
+
method: "POST",
|
|
225
|
+
headers: {
|
|
226
|
+
Accept: "application/vnd.github+json",
|
|
227
|
+
Authorization: `Bearer ${token}`,
|
|
228
|
+
"Content-Type": "application/json",
|
|
229
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
230
|
+
},
|
|
231
|
+
body: JSON.stringify({
|
|
232
|
+
body: interruptedNotice(outcome, delivery, "comment again"),
|
|
233
|
+
}),
|
|
234
|
+
signal: AbortSignal.timeout(GITHUB_API_TIMEOUT_MS),
|
|
235
|
+
});
|
|
236
|
+
if (!response.ok)
|
|
237
|
+
throw new Error(`GitHub refused the interrupted notice (HTTP ${response.status})`);
|
|
238
|
+
}
|
|
239
|
+
function isGitHubTarget(value) {
|
|
240
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
241
|
+
return false;
|
|
242
|
+
const { repository, number } = value;
|
|
243
|
+
return (typeof repository === "string" &&
|
|
244
|
+
REPOSITORY_PATTERN.test(repository) &&
|
|
245
|
+
isIssueNumber(number));
|
|
246
|
+
}
|
|
247
|
+
function logReceipt({ event, deliveryId, payload, }) {
|
|
248
|
+
const receipt = {
|
|
249
|
+
event: logger.logIdentifier(event),
|
|
250
|
+
deliveryId: logger.logIdentifier(deliveryId),
|
|
251
|
+
};
|
|
252
|
+
if (payload.action !== undefined)
|
|
253
|
+
receipt.action = logger.logIdentifier(payload.action);
|
|
254
|
+
for (const [key, field] of [
|
|
255
|
+
["repository", "id"],
|
|
256
|
+
["issue", "number"],
|
|
257
|
+
["pull_request", "number"],
|
|
258
|
+
]) {
|
|
259
|
+
const id = payload[key]?.[field];
|
|
260
|
+
if (typeof id === "number")
|
|
261
|
+
receipt[key] = id;
|
|
262
|
+
}
|
|
263
|
+
logger.info(`github receipt ${JSON.stringify(receipt)}`);
|
|
264
|
+
return receipt;
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/github/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** The handles an event's text mentions: GitHub sends no event for a mention. */
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { githubDispatchSchema } from "./schema.js";
|
|
4
|
+
type DispatchEvent = z.output<typeof githubDispatchSchema>;
|
|
5
|
+
/**
|
|
6
|
+
* The handles, such as `@octocat`, the text the event wrote mentions:
|
|
7
|
+
* lowercased, each once, in order. As on GitHub, code, quotes and HTML
|
|
8
|
+
* comments mention no one. An edit lists only the handles it added.
|
|
9
|
+
*/
|
|
10
|
+
export declare function eventMentions(event: DispatchEvent): string[];
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=mentions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/channels/github/mentions.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD,KAAK,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAyD3D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CA0B5D"}
|