@dual-os/github-api 6.0.3 → 6.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +35 -0
  3. package/Runner.js +342 -576
  4. package/Runner.js.map +5 -9
  5. package/bundle-inventory.json +1 -1
  6. package/dist/auth.d.ts +13 -1
  7. package/dist/auth.d.ts.map +1 -1
  8. package/dist/auth.js +5 -3
  9. package/dist/auth.js.map +1 -1
  10. package/dist/channel/github-app-client.d.ts +67 -0
  11. package/dist/channel/github-app-client.d.ts.map +1 -0
  12. package/dist/channel/github-app-client.js +18 -0
  13. package/dist/channel/github-app-client.js.map +9 -0
  14. package/dist/channel/github-app-definition.d.ts +190 -0
  15. package/dist/channel/github-app-definition.d.ts.map +1 -0
  16. package/dist/channel/github-app-definition.js +32 -0
  17. package/dist/channel/github-app-definition.js.map +9 -0
  18. package/dist/channel/github-app.d.ts +126 -0
  19. package/dist/channel/github-app.d.ts.map +1 -0
  20. package/dist/channel/github-app.js +17 -0
  21. package/dist/channel/github-app.js.map +9 -0
  22. package/dist/channel/internal/webhook.d.ts +38 -0
  23. package/dist/channel/internal/webhook.d.ts.map +1 -0
  24. package/dist/channel/internal/webhook.js +22 -0
  25. package/dist/channel/internal/webhook.js.map +9 -0
  26. package/dist/generated/http.js +7 -5
  27. package/dist/generated/http.js.map +1 -1
  28. package/dist/generated/operations.d.ts +1154 -1154
  29. package/dist/generated/operations.d.ts.map +1 -1
  30. package/dist/generated/operations.js +7 -5
  31. package/dist/generated/operations.js.map +1 -1
  32. package/dist/generated/plugin.js +14 -10515
  33. package/dist/generated/plugin.js.map +3 -4
  34. package/dist/plugin.d.ts +10 -0
  35. package/dist/plugin.d.ts.map +1 -0
  36. package/dist/plugin.js +33 -0
  37. package/dist/plugin.js.map +10 -0
  38. package/dist/triggers.d.ts +26 -2
  39. package/dist/triggers.d.ts.map +1 -1
  40. package/dist/triggers.js +8 -6
  41. package/dist/triggers.js.map +1 -1
  42. package/dual-plugin.json +1 -1
  43. package/package.json +1 -1
  44. package/{plugin-t4j28rxn.js → plugin-1b35jx9g.js} +6 -4
  45. package/{plugin-t4j28rxn.js.map → plugin-1b35jx9g.js.map} +2 -2
  46. package/plugin-2qqpmr67.js +108 -0
  47. package/plugin-2qqpmr67.js.map +10 -0
  48. package/{plugin-yzj02c6j.js → plugin-3ryytw13.js} +193 -308
  49. package/{plugin-yzj02c6j.js.map → plugin-3ryytw13.js.map} +5 -6
  50. package/{plugin-3mpmm6hc.js → plugin-5rkcrntd.js} +4 -4
  51. package/plugin-7hfrx1dg.js +167 -0
  52. package/plugin-7hfrx1dg.js.map +10 -0
  53. package/plugin-e0mt19z7.js +377 -0
  54. package/plugin-e0mt19z7.js.map +10 -0
  55. package/{plugin-ahctqzvj.js → plugin-gtd7vh23.js} +4 -4
  56. package/plugin-p1y3h7d7.js +10516 -0
  57. package/plugin-p1y3h7d7.js.map +10 -0
  58. package/plugin-p6f7n836.js +631 -0
  59. package/plugin-p6f7n836.js.map +12 -0
  60. package/plugin-r0m0v72b.js +156 -0
  61. package/plugin-r0m0v72b.js.map +10 -0
  62. package/{plugin-gajxsj3f.js → plugin-w0va8331.js} +2495 -2288
  63. package/{plugin-gajxsj3f.js.map → plugin-w0va8331.js.map} +12 -13
  64. /package/licenses/{@dual-os_sdk@0.8.1 → @dual-os_sdk@0.9.0}/LICENSE +0 -0
  65. /package/{plugin-3mpmm6hc.js.map → plugin-5rkcrntd.js.map} +0 -0
  66. /package/{plugin-ahctqzvj.js.map → plugin-gtd7vh23.js.map} +0 -0
@@ -0,0 +1,167 @@
1
+ // @bun
2
+ import {
3
+ pipe,
4
+ none,
5
+ fromNullishOr,
6
+ fromUndefinedOr,
7
+ map,
8
+ flatMap,
9
+ filter,
10
+ getSuccess,
11
+ toEntries,
12
+ head,
13
+ filter2,
14
+ some2,
15
+ join,
16
+ decode,
17
+ toLowerCase,
18
+ trim,
19
+ trimStart,
20
+ slice,
21
+ split,
22
+ startsWith,
23
+ succeed5,
24
+ fromOption2,
25
+ map4,
26
+ mapError2,
27
+ fn,
28
+ is,
29
+ decodeEffect,
30
+ optionalKey,
31
+ String3,
32
+ Struct,
33
+ NullOr,
34
+ isPattern,
35
+ isGreaterThan,
36
+ Int,
37
+ NonEmptyString,
38
+ fromJsonString,
39
+ value2,
40
+ when,
41
+ orElse2,
42
+ AgentChannel_exports,
43
+ Trigger_exports
44
+ } from "./plugin-w0va8331.js";
45
+
46
+ // dist/channel/internal/webhook.js
47
+ var NumericId2 = Int.check(isGreaterThan(0));
48
+ var Author = NullOr(Struct({
49
+ id: NumericId2,
50
+ login: NonEmptyString
51
+ }));
52
+ var Discussion = Struct({
53
+ body: NullOr(String3),
54
+ created_at: AgentChannel_exports.Timestamp,
55
+ number: NumericId2,
56
+ title: String3,
57
+ user: Author
58
+ });
59
+ var Comment = Struct({
60
+ body: String3,
61
+ created_at: AgentChannel_exports.Timestamp,
62
+ id: NumericId2,
63
+ user: Author
64
+ });
65
+ var Envelope = {
66
+ installation: Struct({ id: NumericId2 }),
67
+ repository: Struct({
68
+ name: NonEmptyString,
69
+ owner: Struct({ login: NonEmptyString })
70
+ })
71
+ };
72
+ var Action$1 = Struct({
73
+ action: optionalKey(String3),
74
+ installation: optionalKey(Struct({ id: NumericId2 }))
75
+ });
76
+ var Opened = Struct({
77
+ ...Envelope,
78
+ issue: optionalKey(Discussion),
79
+ pull_request: optionalKey(Discussion)
80
+ });
81
+ var IssueComment = Struct({
82
+ ...Envelope,
83
+ comment: Comment,
84
+ issue: Discussion
85
+ });
86
+ var ReviewComment = Struct({
87
+ ...Envelope,
88
+ comment: Struct({
89
+ ...Comment.fields,
90
+ line: optionalKey(NullOr(NumericId2)),
91
+ path: String3
92
+ }),
93
+ pull_request: Discussion
94
+ });
95
+ var Signature = String3.check(isPattern(/^sha256=[0-9a-f]{64}$/u));
96
+ function header2(request, name) {
97
+ const values = filter2(toEntries(request.headers), (entry) => toLowerCase(entry[0]) === name);
98
+ if (values.length !== 1)
99
+ return none();
100
+ return map(head(values), (entry) => entry[1]);
101
+ }
102
+ var verify2 = fn("GitHubApp.verify")(function* (request, secret) {
103
+ const expected = yield* pipe(header2(request, "x-hub-signature-256"), filter((value) => request.method === "POST" && is(Signature)(value)), flatMap((value) => getSuccess(decode(slice(7)(value)))), fromOption2, mapError2(() => AgentChannel_exports.HandlerError.make({ code: "unauthorized" })));
104
+ if (!(yield* Trigger_exports.verifyHmacSha256(secret, request.body, Uint8Array.from(expected))))
105
+ return yield* AgentChannel_exports.HandlerError.make({ code: "unauthorized" });
106
+ return { verified: true };
107
+ });
108
+ function decode2(schema, body) {
109
+ return pipe(decodeEffect(fromJsonString(schema))(body), mapError2(() => AgentChannel_exports.HandlerError.make({ code: "rejected" })));
110
+ }
111
+ function reviewCommentText(comment) {
112
+ if (comment.line === undefined || comment.line === null)
113
+ return `On \`${comment.path}\`:
114
+
115
+ ${comment.body}`;
116
+ return `On \`${comment.path}\` line ${comment.line}:
117
+
118
+ ${comment.body}`;
119
+ }
120
+ function conversationKey2(owner, repository, number) {
121
+ return `${owner}/${repository}#${number}`;
122
+ }
123
+ function inbound(envelope, discussion, message) {
124
+ return map(fromNullishOr(message.author), (author) => ({
125
+ author,
126
+ installationId: envelope.installation.id,
127
+ messageKey: message.key,
128
+ number: discussion.number,
129
+ owner: envelope.repository.owner.login,
130
+ repository: envelope.repository.name,
131
+ text: slice(0, 65536)(message.text),
132
+ timestamp: message.timestamp
133
+ }));
134
+ }
135
+ function opened(body, field) {
136
+ return map4(decode2(Opened, body), (payload) => flatMap(fromUndefinedOr(payload[field]), (discussion) => inbound(payload, discussion, {
137
+ author: discussion.user,
138
+ key: conversationKey2(payload.repository.owner.login, payload.repository.name, discussion.number),
139
+ text: trim(join([discussion.title, discussion.body ?? ""], `
140
+
141
+ `)),
142
+ timestamp: discussion.created_at
143
+ })));
144
+ }
145
+ var parse2 = fn("GitHubApp.parse")(function* (event, body) {
146
+ const action = (yield* decode2(Action$1, body)).action;
147
+ return yield* pipe(value2(`${event}/${action ?? ""}`), when("issues/opened", () => opened(body, "issue")), when("pull_request/opened", () => opened(body, "pull_request")), when("issue_comment/created", () => map4(decode2(IssueComment, body), (payload) => inbound(payload, payload.issue, {
148
+ author: payload.comment.user,
149
+ key: `comment/${payload.comment.id}`,
150
+ text: payload.comment.body,
151
+ timestamp: payload.comment.created_at
152
+ }))), when("pull_request_review_comment/created", () => map4(decode2(ReviewComment, body), (payload) => inbound(payload, payload.pull_request, {
153
+ author: payload.comment.user,
154
+ key: `review-comment/${payload.comment.id}`,
155
+ text: reviewCommentText(payload.comment),
156
+ timestamp: payload.comment.created_at
157
+ }))), orElse2(() => succeed5(none())));
158
+ });
159
+ function mentions2(text, slug) {
160
+ const pattern = new RegExp(`(?:^|[^A-Za-z0-9_])@${slug}(?![A-Za-z0-9_-])`, "iu");
161
+ return some2(split(`
162
+ `)(text), (line) => !startsWith(">")(trimStart(line)) && pattern.test(line));
163
+ }
164
+ export { NumericId2, header2, verify2, conversationKey2, parse2, mentions2 };
165
+
166
+ //# debugId=7306CCD63DA1B8D164756E2164756E21
167
+ //# sourceMappingURL=plugin-7hfrx1dg.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../bundle-input/dist/channel/internal/webhook.js"],
4
+ "sourcesContent": [
5
+ "import { Array, Effect, Match, Option, Record, Result, Schema, String, pipe } from \"effect\";\nimport { AgentChannel, Trigger } from \"@dual-os/sdk\";\nimport { Hex } from \"effect/encoding\";\n//#region src/channel/internal/webhook.ts\nconst NumericId = Schema.Int.check(Schema.isGreaterThan(0));\nconst Author = Schema.NullOr(Schema.Struct({\n\tid: NumericId,\n\tlogin: Schema.NonEmptyString\n}));\nconst Discussion = Schema.Struct({\n\tbody: Schema.NullOr(Schema.String),\n\tcreated_at: AgentChannel.Timestamp,\n\tnumber: NumericId,\n\ttitle: Schema.String,\n\tuser: Author\n});\nconst Comment = Schema.Struct({\n\tbody: Schema.String,\n\tcreated_at: AgentChannel.Timestamp,\n\tid: NumericId,\n\tuser: Author\n});\nconst Envelope = {\n\tinstallation: Schema.Struct({ id: NumericId }),\n\trepository: Schema.Struct({\n\t\tname: Schema.NonEmptyString,\n\t\towner: Schema.Struct({ login: Schema.NonEmptyString })\n\t})\n};\nconst Action$1 = Schema.Struct({\n\taction: Schema.optionalKey(Schema.String),\n\tinstallation: Schema.optionalKey(Schema.Struct({ id: NumericId }))\n});\nconst Opened = Schema.Struct({\n\t...Envelope,\n\tissue: Schema.optionalKey(Discussion),\n\tpull_request: Schema.optionalKey(Discussion)\n});\nconst IssueComment = Schema.Struct({\n\t...Envelope,\n\tcomment: Comment,\n\tissue: Discussion\n});\nconst ReviewComment = Schema.Struct({\n\t...Envelope,\n\tcomment: Schema.Struct({\n\t\t...Comment.fields,\n\t\tline: Schema.optionalKey(Schema.NullOr(NumericId)),\n\t\tpath: Schema.String\n\t}),\n\tpull_request: Discussion\n});\nconst Signature = Schema.String.check(Schema.isPattern(/^sha256=[0-9a-f]{64}$/u));\n/** The value of a request header, when it appears exactly once in any letter case. */\nfunction header(request, name) {\n\tconst values = Array.filter(Record.toEntries(request.headers), (entry) => String.toLowerCase(entry[0]) === name);\n\tif (values.length !== 1) return Option.none();\n\treturn Option.map(Array.head(values), (entry) => entry[1]);\n}\n/** Check `X-Hub-Signature-256`, the HMAC-SHA256 of the raw body under the webhook secret. */\nconst verify = Effect.fn(\"GitHubApp.verify\")(function* (request, secret) {\n\tconst expected = yield* pipe(header(request, \"x-hub-signature-256\"), Option.filter((value) => request.method === \"POST\" && Schema.is(Signature)(value)), Option.flatMap((value) => Result.getSuccess(Hex.decode(String.slice(7)(value)))), Effect.fromOption, Effect.mapError(() => AgentChannel.HandlerError.make({ code: \"unauthorized\" })));\n\tif (!(yield* Trigger.verifyHmacSha256(secret, request.body, Uint8Array.from(expected)))) return yield* AgentChannel.HandlerError.make({ code: \"unauthorized\" });\n\treturn { verified: true };\n});\nfunction decode(schema, body) {\n\treturn pipe(Schema.decodeEffect(Schema.fromJsonString(schema))(body), Effect.mapError(() => AgentChannel.HandlerError.make({ code: \"rejected\" })));\n}\nfunction reviewCommentText(comment) {\n\tif (comment.line === void 0 || comment.line === null) return `On \\`${comment.path}\\`:\\n\\n${comment.body}`;\n\treturn `On \\`${comment.path}\\` line ${comment.line}:\\n\\n${comment.body}`;\n}\nfunction conversationKey(owner, repository, number) {\n\treturn `${owner}/${repository}#${number}`;\n}\nfunction inbound(envelope, discussion, message) {\n\treturn Option.map(Option.fromNullishOr(message.author), (author) => ({\n\t\tauthor,\n\t\tinstallationId: envelope.installation.id,\n\t\tmessageKey: message.key,\n\t\tnumber: discussion.number,\n\t\towner: envelope.repository.owner.login,\n\t\trepository: envelope.repository.name,\n\t\ttext: String.slice(0, 65536)(message.text),\n\t\ttimestamp: message.timestamp\n\t}));\n}\nfunction opened(body, field) {\n\treturn Effect.map(decode(Opened, body), (payload) => Option.flatMap(Option.fromUndefinedOr(payload[field]), (discussion) => inbound(payload, discussion, {\n\t\tauthor: discussion.user,\n\t\tkey: conversationKey(payload.repository.owner.login, payload.repository.name, discussion.number),\n\t\ttext: String.trim(Array.join([discussion.title, discussion.body ?? \"\"], \"\\n\\n\")),\n\t\ttimestamp: discussion.created_at\n\t})));\n}\n/** The message of an issue or pull request opened, or of a comment created on one; nothing for any other event. */\nconst parse = Effect.fn(\"GitHubApp.parse\")(function* (event, body) {\n\tconst action = (yield* decode(Action$1, body)).action;\n\treturn yield* pipe(Match.value(`${event}/${action ?? \"\"}`), Match.when(\"issues/opened\", () => opened(body, \"issue\")), Match.when(\"pull_request/opened\", () => opened(body, \"pull_request\")), Match.when(\"issue_comment/created\", () => Effect.map(decode(IssueComment, body), (payload) => inbound(payload, payload.issue, {\n\t\tauthor: payload.comment.user,\n\t\tkey: `comment/${payload.comment.id}`,\n\t\ttext: payload.comment.body,\n\t\ttimestamp: payload.comment.created_at\n\t}))), Match.when(\"pull_request_review_comment/created\", () => Effect.map(decode(ReviewComment, body), (payload) => inbound(payload, payload.pull_request, {\n\t\tauthor: payload.comment.user,\n\t\tkey: `review-comment/${payload.comment.id}`,\n\t\ttext: reviewCommentText(payload.comment),\n\t\ttimestamp: payload.comment.created_at\n\t}))), Match.orElse(() => Effect.succeed(Option.none())));\n});\n/** Whether `@slug` (also `@slug[bot]` or a link) appears outside quoted lines, which repeat an earlier mention. */\nfunction mentions(text, slug) {\n\tconst pattern = new RegExp(`(?:^|[^A-Za-z0-9_])@${slug}(?![A-Za-z0-9_-])`, \"iu\");\n\treturn Array.some(String.split(\"\\n\")(text), (line) => !String.startsWith(\">\")(String.trimStart(line)) && pattern.test(line));\n}\n//#endregion\nexport { NumericId, conversationKey, header, mentions, parse, verify };\n\n//# sourceMappingURL=webhook.js.map"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAM,aAAY,IAAW,MAAM,cAAqB,CAAC,CAAC;AAC1D,IAAM,SAAS,OAAc,OAAc;AAAA,EAC1C,IAAI;AAAA,EACJ,OAAO;AACR,CAAC,CAAC;AACF,IAAM,aAAa,OAAc;AAAA,EAChC,MAAM,OAAc,OAAa;AAAA,EACjC,YAAY,qBAAa;AAAA,EACzB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACP,CAAC;AACD,IAAM,UAAU,OAAc;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY,qBAAa;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM;AACP,CAAC;AACD,IAAM,WAAW;AAAA,EAChB,cAAc,OAAc,EAAE,IAAI,WAAU,CAAC;AAAA,EAC7C,YAAY,OAAc;AAAA,IACzB,MAAM;AAAA,IACN,OAAO,OAAc,EAAE,OAAO,eAAsB,CAAC;AAAA,EACtD,CAAC;AACF;AACA,IAAM,WAAW,OAAc;AAAA,EAC9B,QAAQ,YAAmB,OAAa;AAAA,EACxC,cAAc,YAAmB,OAAc,EAAE,IAAI,WAAU,CAAC,CAAC;AAClE,CAAC;AACD,IAAM,SAAS,OAAc;AAAA,KACzB;AAAA,EACH,OAAO,YAAmB,UAAU;AAAA,EACpC,cAAc,YAAmB,UAAU;AAC5C,CAAC;AACD,IAAM,eAAe,OAAc;AAAA,KAC/B;AAAA,EACH,SAAS;AAAA,EACT,OAAO;AACR,CAAC;AACD,IAAM,gBAAgB,OAAc;AAAA,KAChC;AAAA,EACH,SAAS,OAAc;AAAA,OACnB,QAAQ;AAAA,IACX,MAAM,YAAmB,OAAc,UAAS,CAAC;AAAA,IACjD,MAAM;AAAA,EACP,CAAC;AAAA,EACD,cAAc;AACf,CAAC;AACD,IAAM,YAAY,QAAc,MAAM,UAAiB,wBAAwB,CAAC;AAEhF,SAAS,OAAM,CAAC,SAAS,MAAM;AAAA,EAC9B,MAAM,SAAS,QAAa,UAAiB,QAAQ,OAAO,GAAG,CAAC,UAAU,YAAmB,MAAM,EAAE,MAAM,IAAI;AAAA,EAC/G,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO,KAAY;AAAA,EAC5C,OAAO,IAAW,KAAW,MAAM,GAAG,CAAC,UAAU,MAAM,EAAE;AAAA;AAG1D,IAAM,UAAS,GAAU,kBAAkB,EAAE,UAAU,CAAC,SAAS,QAAQ;AAAA,EACxE,MAAM,WAAW,OAAO,KAAK,QAAO,SAAS,qBAAqB,GAAG,OAAc,CAAC,UAAU,QAAQ,WAAW,UAAU,GAAU,SAAS,EAAE,KAAK,CAAC,GAAG,QAAe,CAAC,UAAU,WAAkB,OAAW,MAAa,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,aAAmB,UAAgB,MAAM,qBAAa,aAAa,KAAK,EAAE,MAAM,eAAe,CAAC,CAAC,CAAC;AAAA,EAC7U,IAAI,EAAE,OAAO,gBAAQ,iBAAiB,QAAQ,QAAQ,MAAM,WAAW,KAAK,QAAQ,CAAC;AAAA,IAAI,OAAO,OAAO,qBAAa,aAAa,KAAK,EAAE,MAAM,eAAe,CAAC;AAAA,EAC9J,OAAO,EAAE,UAAU,KAAK;AAAA,CACxB;AACD,SAAS,OAAM,CAAC,QAAQ,MAAM;AAAA,EAC7B,OAAO,KAAK,aAAoB,eAAsB,MAAM,CAAC,EAAE,IAAI,GAAG,UAAgB,MAAM,qBAAa,aAAa,KAAK,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC;AAAA;AAElJ,SAAS,iBAAiB,CAAC,SAAS;AAAA,EACnC,IAAI,QAAQ,SAAc,aAAK,QAAQ,SAAS;AAAA,IAAM,OAAO,QAAQ,QAAQ;AAAA;AAAA,EAAc,QAAQ;AAAA,EACnG,OAAO,QAAQ,QAAQ,eAAe,QAAQ;AAAA;AAAA,EAAY,QAAQ;AAAA;AAEnE,SAAS,gBAAe,CAAC,OAAO,YAAY,QAAQ;AAAA,EACnD,OAAO,GAAG,SAAS,cAAc;AAAA;AAElC,SAAS,OAAO,CAAC,UAAU,YAAY,SAAS;AAAA,EAC/C,OAAO,IAAW,cAAqB,QAAQ,MAAM,GAAG,CAAC,YAAY;AAAA,IACpE;AAAA,IACA,gBAAgB,SAAS,aAAa;AAAA,IACtC,YAAY,QAAQ;AAAA,IACpB,QAAQ,WAAW;AAAA,IACnB,OAAO,SAAS,WAAW,MAAM;AAAA,IACjC,YAAY,SAAS,WAAW;AAAA,IAChC,MAAM,MAAa,GAAG,KAAK,EAAE,QAAQ,IAAI;AAAA,IACzC,WAAW,QAAQ;AAAA,EACpB,EAAE;AAAA;AAEH,SAAS,MAAM,CAAC,MAAM,OAAO;AAAA,EAC5B,OAAO,KAAW,QAAO,QAAQ,IAAI,GAAG,CAAC,YAAY,QAAe,gBAAuB,QAAQ,MAAM,GAAG,CAAC,eAAe,QAAQ,SAAS,YAAY;AAAA,IACxJ,QAAQ,WAAW;AAAA,IACnB,KAAK,iBAAgB,QAAQ,WAAW,MAAM,OAAO,QAAQ,WAAW,MAAM,WAAW,MAAM;AAAA,IAC/F,MAAM,KAAY,KAAW,CAAC,WAAW,OAAO,WAAW,QAAQ,EAAE,GAAG;AAAA;AAAA,CAAM,CAAC;AAAA,IAC/E,WAAW,WAAW;AAAA,EACvB,CAAC,CAAC,CAAC;AAAA;AAGJ,IAAM,SAAQ,GAAU,iBAAiB,EAAE,UAAU,CAAC,OAAO,MAAM;AAAA,EAClE,MAAM,UAAU,OAAO,QAAO,UAAU,IAAI,GAAG;AAAA,EAC/C,OAAO,OAAO,KAAK,OAAY,GAAG,SAAS,UAAU,IAAI,GAAG,KAAW,iBAAiB,MAAM,OAAO,MAAM,OAAO,CAAC,GAAG,KAAW,uBAAuB,MAAM,OAAO,MAAM,cAAc,CAAC,GAAG,KAAW,yBAAyB,MAAM,KAAW,QAAO,cAAc,IAAI,GAAG,CAAC,YAAY,QAAQ,SAAS,QAAQ,OAAO;AAAA,IAC1T,QAAQ,QAAQ,QAAQ;AAAA,IACxB,KAAK,WAAW,QAAQ,QAAQ;AAAA,IAChC,MAAM,QAAQ,QAAQ;AAAA,IACtB,WAAW,QAAQ,QAAQ;AAAA,EAC5B,CAAC,CAAC,CAAC,GAAG,KAAW,uCAAuC,MAAM,KAAW,QAAO,eAAe,IAAI,GAAG,CAAC,YAAY,QAAQ,SAAS,QAAQ,cAAc;AAAA,IACzJ,QAAQ,QAAQ,QAAQ;AAAA,IACxB,KAAK,kBAAkB,QAAQ,QAAQ;AAAA,IACvC,MAAM,kBAAkB,QAAQ,OAAO;AAAA,IACvC,WAAW,QAAQ,QAAQ;AAAA,EAC5B,CAAC,CAAC,CAAC,GAAG,QAAa,MAAM,SAAe,KAAY,CAAC,CAAC,CAAC;AAAA,CACvD;AAED,SAAS,SAAQ,CAAC,MAAM,MAAM;AAAA,EAC7B,MAAM,UAAU,IAAI,OAAO,uBAAuB,yBAAyB,IAAI;AAAA,EAC/E,OAAO,MAAW,MAAa;AAAA,CAAI,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,WAAkB,GAAG,EAAE,UAAiB,IAAI,CAAC,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA;",
8
+ "debugId": "7306CCD63DA1B8D164756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,377 @@
1
+ // @bun
2
+ import {
3
+ pipe,
4
+ none,
5
+ some,
6
+ match2,
7
+ fromNullishOr,
8
+ fromUndefinedOr,
9
+ map,
10
+ flatMap,
11
+ toArray,
12
+ filter,
13
+ liftPredicate,
14
+ exists,
15
+ fromIterable,
16
+ appendAll,
17
+ isReadonlyArrayEmpty,
18
+ takeRight,
19
+ contains,
20
+ map3,
21
+ getSomes,
22
+ some2,
23
+ join,
24
+ provide,
25
+ parse3,
26
+ toLowerCase,
27
+ trim,
28
+ slice,
29
+ isEmpty,
30
+ split,
31
+ replaceAll,
32
+ succeed5,
33
+ fail5,
34
+ fromOption2,
35
+ map4,
36
+ mapError2,
37
+ fnUntraced,
38
+ fn,
39
+ is,
40
+ encodeEffect,
41
+ String3,
42
+ Tuple,
43
+ isPattern,
44
+ Natural,
45
+ fromJsonString,
46
+ value2,
47
+ when,
48
+ discriminatorsExhaustive,
49
+ orElse2,
50
+ exhaustive,
51
+ layer2,
52
+ AgentChannel_exports,
53
+ Plugin_exports
54
+ } from "./plugin-w0va8331.js";
55
+ import {
56
+ GitHubId2,
57
+ ConversationKey2,
58
+ gitHubAppPluginBase2
59
+ } from "./plugin-2qqpmr67.js";
60
+ import {
61
+ header2,
62
+ verify2,
63
+ conversationKey2,
64
+ parse2,
65
+ mentions2
66
+ } from "./plugin-7hfrx1dg.js";
67
+ import {
68
+ GitHubAppClient2
69
+ } from "./plugin-p6f7n836.js";
70
+
71
+ // dist/channel/github-app.js
72
+ var CommentKey = String3.check(isPattern(/^(?:comment|review-comment)\/[1-9][0-9]{0,19}$/u));
73
+ var rank = {
74
+ admin: 5,
75
+ maintain: 4,
76
+ none: 0,
77
+ read: 1,
78
+ triage: 2,
79
+ write: 3
80
+ };
81
+ var reactions = {
82
+ confused: "confused",
83
+ eyes: "eyes",
84
+ heart: "heart",
85
+ hooray: "hooray",
86
+ laugh: "laugh",
87
+ rocket: "rocket",
88
+ thumbs_down: "-1",
89
+ thumbs_up: "+1"
90
+ };
91
+ var marks = {
92
+ completed: "\u2705",
93
+ failed: "\u274C",
94
+ in_progress: "\uD83D\uDD04",
95
+ pending: "\u2B1C"
96
+ };
97
+ function rejected() {
98
+ return AgentChannel_exports.HandlerError.make({ code: "rejected" });
99
+ }
100
+ function installationKey(appId, installationId) {
101
+ return `${appId}/${installationId}`;
102
+ }
103
+ function issueOf(destination) {
104
+ if (destination.kind !== "group" || destination.threadKey !== undefined || !is(ConversationKey2)(destination.conversationKey))
105
+ return none();
106
+ const [path = "", number = ""] = split("#")(destination.conversationKey);
107
+ const [owner = "", name = ""] = split("/")(path);
108
+ return map(parse3(number), (parsed) => ({
109
+ name,
110
+ number: parsed,
111
+ owner
112
+ }));
113
+ }
114
+ function reactionTarget(issue, key) {
115
+ if (key === `${issue.owner}/${issue.name}#${issue.number}`)
116
+ return some({ kind: "issue" });
117
+ if (is(GitHubId2)(key))
118
+ return some({
119
+ id: key,
120
+ kind: "comment"
121
+ });
122
+ if (!is(CommentKey)(key))
123
+ return none();
124
+ const [kind = "", id = ""] = split("/")(key);
125
+ if (kind === "review-comment")
126
+ return some({
127
+ id,
128
+ kind: "review-comment"
129
+ });
130
+ return some({
131
+ id,
132
+ kind: "comment"
133
+ });
134
+ }
135
+ var oneLine = replaceAll(/\s*\n\s*/gu, " ");
136
+ function planMarkdown(plan) {
137
+ const items = map3(plan.items, (item) => {
138
+ const entry = `- ${marks[item.state]} ${oneLine(item.title)}`;
139
+ if (item.note === undefined)
140
+ return entry;
141
+ return `${entry}: ${oneLine(item.note)}`;
142
+ });
143
+ if (isReadonlyArrayEmpty(items))
144
+ return `**${oneLine(plan.title ?? "Plan")}**
145
+
146
+ _No steps yet._`;
147
+ return join([
148
+ `**${oneLine(plan.title ?? "Plan")}**`,
149
+ "",
150
+ ...items
151
+ ], `
152
+ `);
153
+ }
154
+ function outcomeText(operation) {
155
+ if (operation.options === undefined || isReadonlyArrayEmpty(operation.options))
156
+ return operation.text;
157
+ const options = join(map3(operation.options, (option) => `- ${option}`), `
158
+ `);
159
+ if (isEmpty(operation.text))
160
+ return options;
161
+ return `${operation.text}
162
+
163
+ ${options}`;
164
+ }
165
+ function inScope(owner, name, settings) {
166
+ return isReadonlyArrayEmpty(settings.repositories) || some2(settings.repositories, (repository) => toLowerCase(repository) === toLowerCase(`${owner}/${name}`));
167
+ }
168
+ function checkAccess(identity, context) {
169
+ const settings = context.deploymentSettings;
170
+ return succeed5({ decision: pipe(value2(exists(issueOf(identity.conversation), (issue) => inScope(issue.owner, issue.name, settings)) && is(GitHubId2)(identity.senderKey) && (settings.access === "open" || contains(settings.allowedSenderKeys, identity.senderKey))), when(true, () => "allow"), orElse2(() => "deny")) });
171
+ }
172
+ var receive = fn("GitHubApp.receive")(function* (command, installation, context) {
173
+ const result = {
174
+ events: [],
175
+ kind: "receive",
176
+ operationKey: command.operationKey,
177
+ response: {
178
+ body: "",
179
+ status: 200
180
+ },
181
+ verified: true
182
+ };
183
+ const event = yield* pipe(header2(command.request, "x-github-event"), fromOption2, mapError2(rejected));
184
+ const settings = context.deploymentSettings;
185
+ const found = filter(yield* parse2(event, command.request.body), (message) => `${message.installationId}` === installation.installationId && `${message.author.id}` !== command.state.botUserId && !isEmpty(message.text) && inScope(message.owner, message.repository, settings));
186
+ const client = yield* GitHubAppClient2;
187
+ return yield* match2(found, {
188
+ onNone: () => succeed5(result),
189
+ onSome: fnUntraced(function* (message) {
190
+ const respond = (settings.access === "open" || contains(settings.allowedSenderKeys, `${message.author.id}`)) && (settings.respondTo === "all_messages" || mentions2(message.text, command.state.slug)) && rank[yield* client.permission(installation, {
191
+ name: message.repository,
192
+ owner: message.owner
193
+ }, message.author.login)] >= rank[settings.mentionPermission];
194
+ return {
195
+ ...result,
196
+ events: [{
197
+ content: { text: message.text },
198
+ conversation: {
199
+ conversationKey: conversationKey2(message.owner, message.repository, message.number),
200
+ kind: "group"
201
+ },
202
+ eventKey: yield* pipe(encodeEffect(fromJsonString(Tuple([
203
+ String3,
204
+ String3,
205
+ Natural,
206
+ String3,
207
+ AgentChannel_exports.Timestamp
208
+ ])))([
209
+ message.owner,
210
+ message.repository,
211
+ message.number,
212
+ message.messageKey,
213
+ message.timestamp
214
+ ]), mapError2(rejected)),
215
+ kind: "message",
216
+ messageKey: message.messageKey,
217
+ respond,
218
+ senderKey: `${message.author.id}`,
219
+ timestamp: message.timestamp
220
+ }]
221
+ };
222
+ })
223
+ });
224
+ });
225
+ var deliver = fn("GitHubApp.deliver")(function* (command, installation) {
226
+ const issue = yield* pipe(issueOf(command.destination), fromOption2, mapError2(rejected));
227
+ const client = yield* GitHubAppClient2;
228
+ function succeeded(providerDeliveryKey) {
229
+ return {
230
+ deliveryKey: command.deliveryKey,
231
+ kind: "deliver",
232
+ operationKey: command.operationKey,
233
+ providerDeliveryKey,
234
+ status: "succeeded"
235
+ };
236
+ }
237
+ const post = fnUntraced(function* (text) {
238
+ if (fromIterable(text).length > 65536)
239
+ return yield* rejected();
240
+ return yield* client.postComment(installation, issue, text);
241
+ });
242
+ const ownedComment = fnUntraced(function* (reference) {
243
+ const id = yield* pipe(liftPredicate(reference, is(GitHubId2)), fromOption2, mapError2(rejected));
244
+ return {
245
+ exists: yield* client.checkOwnComment(installation, issue, id, command.state.botUserId),
246
+ id
247
+ };
248
+ });
249
+ const activation = fromUndefinedOr(command.activationMessageKey);
250
+ return yield* pipe(value2(command.operation), discriminatorsExhaustive("kind")({
251
+ create_message: (operation) => map4(post(operation.text), succeeded),
252
+ delete_message: fnUntraced(function* (operation) {
253
+ const found = yield* ownedComment(operation.reference);
254
+ if (found.exists)
255
+ yield* client.deleteComment(installation, issue, found.id);
256
+ return succeeded(operation.reference);
257
+ }),
258
+ present_outcome: fnUntraced(function* (operation) {
259
+ const text = outcomeText(operation);
260
+ return succeeded(yield* pipe(value2(isEmpty(text)), when(true, () => succeed5(command.deliveryKey)), orElse2(() => post(text))));
261
+ }),
262
+ render_plan: fnUntraced(function* (operation) {
263
+ const text = planMarkdown(operation.plan);
264
+ if (fromIterable(text).length > 65536)
265
+ return yield* rejected();
266
+ if (operation.reference === undefined)
267
+ return succeeded(yield* post(text));
268
+ const reference = yield* ownedComment(operation.reference);
269
+ if (reference.exists && (yield* client.editComment(installation, issue, reference.id, text)))
270
+ return succeeded(reference.id);
271
+ return succeeded(yield* post(text));
272
+ }),
273
+ set_activity: () => rejected(),
274
+ set_reaction: fnUntraced(function* (operation) {
275
+ const found = yield* pipe(value2(operation.target), when({ kind: "activation" }, () => pipe(activation, flatMap((value) => reactionTarget(issue, value)), fromOption2, mapError2(rejected))), when({ kind: "message" }, fnUntraced(function* (message) {
276
+ const owned = yield* ownedComment(message.reference);
277
+ if (!owned.exists)
278
+ return yield* rejected();
279
+ return {
280
+ id: owned.id,
281
+ kind: "comment"
282
+ };
283
+ })), exhaustive);
284
+ yield* client.react(installation, issue, found, reactions[operation.reaction], operation.active);
285
+ return succeeded(command.deliveryKey);
286
+ }),
287
+ update_message: fnUntraced(function* (operation) {
288
+ const reference = yield* ownedComment(operation.reference);
289
+ if (!reference.exists)
290
+ return yield* rejected();
291
+ if (fromIterable(operation.text).length > 65536)
292
+ return yield* rejected();
293
+ if (!(yield* client.editComment(installation, issue, reference.id, operation.text)))
294
+ return yield* rejected();
295
+ return succeeded(reference.id);
296
+ })
297
+ }));
298
+ });
299
+ var readContext = fn("GitHubApp.readContext")(function* (command, installation) {
300
+ const issue = yield* pipe(issueOf(command.destination), fromOption2, mapError2(rejected));
301
+ const found = yield* (yield* GitHubAppClient2).readComments(installation, issue, command.limit);
302
+ function own(id) {
303
+ return `${id}` === command.state.botUserId;
304
+ }
305
+ const opening = map(fromNullishOr(found.issue.user), (user) => ({
306
+ messageKey: conversationKey2(issue.owner, issue.name, issue.number),
307
+ own: own(user.id),
308
+ senderKey: `${user.id}`,
309
+ senderName: user.login,
310
+ text: slice(0, 65536)(trim(join([found.issue.title, found.issue.body ?? ""], `
311
+
312
+ `))),
313
+ timestamp: found.issue.created_at
314
+ }));
315
+ const comments = getSomes(map3(found.comments, (comment) => map(fromNullishOr(comment.user), (user) => ({
316
+ messageKey: `comment/${comment.id}`,
317
+ own: own(user.id),
318
+ senderKey: `${user.id}`,
319
+ senderName: user.login,
320
+ text: comment.body ?? "",
321
+ timestamp: comment.created_at
322
+ }))));
323
+ const messages = pipe(value2(found.comments.length === found.issue.comments), when(true, () => appendAll(toArray(opening), comments)), orElse2(() => comments));
324
+ return AgentChannel_exports.contextResult(command.operationKey, takeRight(messages, command.limit));
325
+ });
326
+ var execute = fn("GitHubApp.execute")(function* (command, context) {
327
+ const auth = context.auth;
328
+ const settings = context.deploymentSettings;
329
+ if (command.kind === "activate") {
330
+ if (command.state !== undefined && (command.state.appId !== auth.value.appId || command.state.installationId !== settings.installationId))
331
+ return yield* AgentChannel_exports.HandlerError.make({ code: "unauthorized" });
332
+ const client = yield* GitHubAppClient2;
333
+ const found = yield* client.checkInstallation({
334
+ auth: auth.value,
335
+ installationId: settings.installationId
336
+ });
337
+ yield* client.registerWebhook(auth.value, command.ingressUrl);
338
+ return {
339
+ installationKey: installationKey(auth.value.appId, settings.installationId),
340
+ kind: "activate",
341
+ operationKey: command.operationKey,
342
+ state: {
343
+ appId: auth.value.appId,
344
+ botUserId: found.botUserId,
345
+ ingressUrl: command.ingressUrl,
346
+ installationId: settings.installationId,
347
+ slug: found.slug
348
+ }
349
+ };
350
+ }
351
+ if (command.installationKey !== installationKey(auth.value.appId, settings.installationId) || command.state.appId !== auth.value.appId || command.state.installationId !== settings.installationId)
352
+ return yield* AgentChannel_exports.HandlerError.make({ code: "unauthorized" });
353
+ const installation = {
354
+ auth: auth.value,
355
+ installationId: settings.installationId
356
+ };
357
+ return yield* pipe(value2(command), discriminatorsExhaustive("kind")({
358
+ deactivate: (deactivated) => succeed5({
359
+ kind: "deactivate",
360
+ operationKey: deactivated.operationKey
361
+ }),
362
+ deliver: (delivery) => deliver(delivery, installation),
363
+ read_asset: () => fail5(rejected()),
364
+ read_context: (read) => readContext(read, installation),
365
+ receive: (received) => receive(received, installation, context)
366
+ }));
367
+ });
368
+ var gitHubAppHandlers2 = Plugin_exports.toLayer(gitHubAppPluginBase2, (handlers) => handlers.channel("agent-issues", {
369
+ checkAccess,
370
+ execute,
371
+ verify: (request, context) => verify2(request, context.auth.value.webhookSecret)
372
+ }));
373
+ var githubChannelLayer2 = gitHubAppHandlers2.pipe(provide(GitHubAppClient2.layer), provide(layer2));
374
+ export { gitHubAppHandlers2, githubChannelLayer2 };
375
+
376
+ //# debugId=1571922E5014769064756E2164756E21
377
+ //# sourceMappingURL=plugin-e0mt19z7.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../bundle-input/dist/channel/github-app.js"],
4
+ "sourcesContent": [
5
+ "import { ConversationKey, GitHubId, gitHubAppPluginBase } from \"./github-app-definition.js\";\nimport { conversationKey, header, mentions, parse, verify } from \"./internal/webhook.js\";\nimport { GitHubAppClient } from \"./github-app-client.js\";\nimport { Array, Effect, Layer, Match, Number, Option, Schema, String, pipe } from \"effect\";\nimport { FetchHttpClient } from \"effect/http\";\nimport { AgentChannel, Plugin } from \"@dual-os/sdk\";\n//#region src/channel/github-app.ts\nconst CommentKey = Schema.String.check(Schema.isPattern(/^(?:comment|review-comment)\\/[1-9][0-9]{0,19}$/u));\nconst rank = {\n\tadmin: 5,\n\tmaintain: 4,\n\tnone: 0,\n\tread: 1,\n\ttriage: 2,\n\twrite: 3\n};\nconst reactions = {\n\tconfused: \"confused\",\n\teyes: \"eyes\",\n\theart: \"heart\",\n\thooray: \"hooray\",\n\tlaugh: \"laugh\",\n\trocket: \"rocket\",\n\tthumbs_down: \"-1\",\n\tthumbs_up: \"+1\"\n};\nconst marks = {\n\tcompleted: \"✅\",\n\tfailed: \"❌\",\n\tin_progress: \"🔄\",\n\tpending: \"⬜\"\n};\nfunction rejected() {\n\treturn AgentChannel.HandlerError.make({ code: \"rejected\" });\n}\nfunction installationKey(appId, installationId) {\n\treturn `${appId}/${installationId}`;\n}\nfunction issueOf(destination) {\n\tif (destination.kind !== \"group\" || destination.threadKey !== void 0 || !Schema.is(ConversationKey)(destination.conversationKey)) return Option.none();\n\tconst [path = \"\", number = \"\"] = String.split(\"#\")(destination.conversationKey);\n\tconst [owner = \"\", name = \"\"] = String.split(\"/\")(path);\n\treturn Option.map(Number.parse(number), (parsed) => ({\n\t\tname,\n\t\tnumber: parsed,\n\t\towner\n\t}));\n}\nfunction reactionTarget(issue, key) {\n\tif (key === `${issue.owner}/${issue.name}#${issue.number}`) return Option.some({ kind: \"issue\" });\n\tif (Schema.is(GitHubId)(key)) return Option.some({\n\t\tid: key,\n\t\tkind: \"comment\"\n\t});\n\tif (!Schema.is(CommentKey)(key)) return Option.none();\n\tconst [kind = \"\", id = \"\"] = String.split(\"/\")(key);\n\tif (kind === \"review-comment\") return Option.some({\n\t\tid,\n\t\tkind: \"review-comment\"\n\t});\n\treturn Option.some({\n\t\tid,\n\t\tkind: \"comment\"\n\t});\n}\nconst oneLine = String.replaceAll(/\\s*\\n\\s*/gu, \" \");\nfunction planMarkdown(plan) {\n\tconst items = Array.map(plan.items, (item) => {\n\t\tconst entry = `- ${marks[item.state]} ${oneLine(item.title)}`;\n\t\tif (item.note === void 0) return entry;\n\t\treturn `${entry}: ${oneLine(item.note)}`;\n\t});\n\tif (Array.isReadonlyArrayEmpty(items)) return `**${oneLine(plan.title ?? \"Plan\")}**\\n\\n_No steps yet._`;\n\treturn Array.join([\n\t\t`**${oneLine(plan.title ?? \"Plan\")}**`,\n\t\t\"\",\n\t\t...items\n\t], \"\\n\");\n}\nfunction outcomeText(operation) {\n\tif (operation.options === void 0 || Array.isReadonlyArrayEmpty(operation.options)) return operation.text;\n\tconst options = Array.join(Array.map(operation.options, (option) => `- ${option}`), \"\\n\");\n\tif (String.isEmpty(operation.text)) return options;\n\treturn `${operation.text}\\n\\n${options}`;\n}\nfunction inScope(owner, name, settings) {\n\treturn Array.isReadonlyArrayEmpty(settings.repositories) || Array.some(settings.repositories, (repository) => String.toLowerCase(repository) === String.toLowerCase(`${owner}/${name}`));\n}\nfunction checkAccess(identity, context) {\n\tconst settings = context.deploymentSettings;\n\treturn Effect.succeed({ decision: pipe(Match.value(Option.exists(issueOf(identity.conversation), (issue) => inScope(issue.owner, issue.name, settings)) && Schema.is(GitHubId)(identity.senderKey) && (settings.access === \"open\" || Array.contains(settings.allowedSenderKeys, identity.senderKey))), Match.when(true, () => \"allow\"), Match.orElse(() => \"deny\")) });\n}\nconst receive = Effect.fn(\"GitHubApp.receive\")(function* (command, installation, context) {\n\tconst result = {\n\t\tevents: [],\n\t\tkind: \"receive\",\n\t\toperationKey: command.operationKey,\n\t\tresponse: {\n\t\t\tbody: \"\",\n\t\t\tstatus: 200\n\t\t},\n\t\tverified: true\n\t};\n\tconst event = yield* pipe(header(command.request, \"x-github-event\"), Effect.fromOption, Effect.mapError(rejected));\n\tconst settings = context.deploymentSettings;\n\tconst found = Option.filter(yield* parse(event, command.request.body), (message) => `${message.installationId}` === installation.installationId && `${message.author.id}` !== command.state.botUserId && !String.isEmpty(message.text) && inScope(message.owner, message.repository, settings));\n\tconst client = yield* GitHubAppClient;\n\treturn yield* Option.match(found, {\n\t\tonNone: () => Effect.succeed(result),\n\t\tonSome: Effect.fnUntraced(function* (message) {\n\t\t\tconst respond = (settings.access === \"open\" || Array.contains(settings.allowedSenderKeys, `${message.author.id}`)) && (settings.respondTo === \"all_messages\" || mentions(message.text, command.state.slug)) && rank[yield* client.permission(installation, {\n\t\t\t\tname: message.repository,\n\t\t\t\towner: message.owner\n\t\t\t}, message.author.login)] >= rank[settings.mentionPermission];\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\tevents: [{\n\t\t\t\t\tcontent: { text: message.text },\n\t\t\t\t\tconversation: {\n\t\t\t\t\t\tconversationKey: conversationKey(message.owner, message.repository, message.number),\n\t\t\t\t\t\tkind: \"group\"\n\t\t\t\t\t},\n\t\t\t\t\teventKey: yield* pipe(Schema.encodeEffect(Schema.fromJsonString(Schema.Tuple([\n\t\t\t\t\t\tSchema.String,\n\t\t\t\t\t\tSchema.String,\n\t\t\t\t\t\tSchema.Natural,\n\t\t\t\t\t\tSchema.String,\n\t\t\t\t\t\tAgentChannel.Timestamp\n\t\t\t\t\t])))([\n\t\t\t\t\t\tmessage.owner,\n\t\t\t\t\t\tmessage.repository,\n\t\t\t\t\t\tmessage.number,\n\t\t\t\t\t\tmessage.messageKey,\n\t\t\t\t\t\tmessage.timestamp\n\t\t\t\t\t]), Effect.mapError(rejected)),\n\t\t\t\t\tkind: \"message\",\n\t\t\t\t\tmessageKey: message.messageKey,\n\t\t\t\t\trespond,\n\t\t\t\t\tsenderKey: `${message.author.id}`,\n\t\t\t\t\ttimestamp: message.timestamp\n\t\t\t\t}]\n\t\t\t};\n\t\t})\n\t});\n});\nconst deliver = Effect.fn(\"GitHubApp.deliver\")(function* (command, installation) {\n\tconst issue = yield* pipe(issueOf(command.destination), Effect.fromOption, Effect.mapError(rejected));\n\tconst client = yield* GitHubAppClient;\n\tfunction succeeded(providerDeliveryKey) {\n\t\treturn {\n\t\t\tdeliveryKey: command.deliveryKey,\n\t\t\tkind: \"deliver\",\n\t\t\toperationKey: command.operationKey,\n\t\t\tproviderDeliveryKey,\n\t\t\tstatus: \"succeeded\"\n\t\t};\n\t}\n\tconst post = Effect.fnUntraced(function* (text) {\n\t\tif (Array.fromIterable(text).length > 65536) return yield* rejected();\n\t\treturn yield* client.postComment(installation, issue, text);\n\t});\n\tconst ownedComment = Effect.fnUntraced(function* (reference) {\n\t\tconst id = yield* pipe(Option.liftPredicate(reference, Schema.is(GitHubId)), Effect.fromOption, Effect.mapError(rejected));\n\t\treturn {\n\t\t\texists: yield* client.checkOwnComment(installation, issue, id, command.state.botUserId),\n\t\t\tid\n\t\t};\n\t});\n\tconst activation = Option.fromUndefinedOr(command.activationMessageKey);\n\treturn yield* pipe(Match.value(command.operation), Match.discriminatorsExhaustive(\"kind\")({\n\t\tcreate_message: (operation) => Effect.map(post(operation.text), succeeded),\n\t\tdelete_message: Effect.fnUntraced(function* (operation) {\n\t\t\tconst found = yield* ownedComment(operation.reference);\n\t\t\tif (found.exists) yield* client.deleteComment(installation, issue, found.id);\n\t\t\treturn succeeded(operation.reference);\n\t\t}),\n\t\tpresent_outcome: Effect.fnUntraced(function* (operation) {\n\t\t\tconst text = outcomeText(operation);\n\t\t\treturn succeeded(yield* pipe(Match.value(String.isEmpty(text)), Match.when(true, () => Effect.succeed(command.deliveryKey)), Match.orElse(() => post(text))));\n\t\t}),\n\t\trender_plan: Effect.fnUntraced(function* (operation) {\n\t\t\tconst text = planMarkdown(operation.plan);\n\t\t\tif (Array.fromIterable(text).length > 65536) return yield* rejected();\n\t\t\tif (operation.reference === void 0) return succeeded(yield* post(text));\n\t\t\tconst reference = yield* ownedComment(operation.reference);\n\t\t\tif (reference.exists && (yield* client.editComment(installation, issue, reference.id, text))) return succeeded(reference.id);\n\t\t\treturn succeeded(yield* post(text));\n\t\t}),\n\t\tset_activity: () => rejected(),\n\t\tset_reaction: Effect.fnUntraced(function* (operation) {\n\t\t\tconst found = yield* pipe(Match.value(operation.target), Match.when({ kind: \"activation\" }, () => pipe(activation, Option.flatMap((value) => reactionTarget(issue, value)), Effect.fromOption, Effect.mapError(rejected))), Match.when({ kind: \"message\" }, Effect.fnUntraced(function* (message) {\n\t\t\t\tconst owned = yield* ownedComment(message.reference);\n\t\t\t\tif (!owned.exists) return yield* rejected();\n\t\t\t\treturn {\n\t\t\t\t\tid: owned.id,\n\t\t\t\t\tkind: \"comment\"\n\t\t\t\t};\n\t\t\t})), Match.exhaustive);\n\t\t\tyield* client.react(installation, issue, found, reactions[operation.reaction], operation.active);\n\t\t\treturn succeeded(command.deliveryKey);\n\t\t}),\n\t\tupdate_message: Effect.fnUntraced(function* (operation) {\n\t\t\tconst reference = yield* ownedComment(operation.reference);\n\t\t\tif (!reference.exists) return yield* rejected();\n\t\t\tif (Array.fromIterable(operation.text).length > 65536) return yield* rejected();\n\t\t\tif (!(yield* client.editComment(installation, issue, reference.id, operation.text))) return yield* rejected();\n\t\t\treturn succeeded(reference.id);\n\t\t})\n\t}));\n});\nconst readContext = Effect.fn(\"GitHubApp.readContext\")(function* (command, installation) {\n\tconst issue = yield* pipe(issueOf(command.destination), Effect.fromOption, Effect.mapError(rejected));\n\tconst found = yield* (yield* GitHubAppClient).readComments(installation, issue, command.limit);\n\tfunction own(id) {\n\t\treturn `${id}` === command.state.botUserId;\n\t}\n\tconst opening = Option.map(Option.fromNullishOr(found.issue.user), (user) => ({\n\t\tmessageKey: conversationKey(issue.owner, issue.name, issue.number),\n\t\town: own(user.id),\n\t\tsenderKey: `${user.id}`,\n\t\tsenderName: user.login,\n\t\ttext: String.slice(0, 65536)(String.trim(Array.join([found.issue.title, found.issue.body ?? \"\"], \"\\n\\n\"))),\n\t\ttimestamp: found.issue.created_at\n\t}));\n\tconst comments = Array.getSomes(Array.map(found.comments, (comment) => Option.map(Option.fromNullishOr(comment.user), (user) => ({\n\t\tmessageKey: `comment/${comment.id}`,\n\t\town: own(user.id),\n\t\tsenderKey: `${user.id}`,\n\t\tsenderName: user.login,\n\t\ttext: comment.body ?? \"\",\n\t\ttimestamp: comment.created_at\n\t}))));\n\tconst messages = pipe(Match.value(found.comments.length === found.issue.comments), Match.when(true, () => Array.appendAll(Option.toArray(opening), comments)), Match.orElse(() => comments));\n\treturn AgentChannel.contextResult(command.operationKey, Array.takeRight(messages, command.limit));\n});\nconst execute = Effect.fn(\"GitHubApp.execute\")(function* (command, context) {\n\tconst auth = context.auth;\n\tconst settings = context.deploymentSettings;\n\tif (command.kind === \"activate\") {\n\t\tif (command.state !== void 0 && (command.state.appId !== auth.value.appId || command.state.installationId !== settings.installationId)) return yield* AgentChannel.HandlerError.make({ code: \"unauthorized\" });\n\t\tconst client = yield* GitHubAppClient;\n\t\tconst found = yield* client.checkInstallation({\n\t\t\tauth: auth.value,\n\t\t\tinstallationId: settings.installationId\n\t\t});\n\t\tyield* client.registerWebhook(auth.value, command.ingressUrl);\n\t\treturn {\n\t\t\tinstallationKey: installationKey(auth.value.appId, settings.installationId),\n\t\t\tkind: \"activate\",\n\t\t\toperationKey: command.operationKey,\n\t\t\tstate: {\n\t\t\t\tappId: auth.value.appId,\n\t\t\t\tbotUserId: found.botUserId,\n\t\t\t\tingressUrl: command.ingressUrl,\n\t\t\t\tinstallationId: settings.installationId,\n\t\t\t\tslug: found.slug\n\t\t\t}\n\t\t};\n\t}\n\tif (command.installationKey !== installationKey(auth.value.appId, settings.installationId) || command.state.appId !== auth.value.appId || command.state.installationId !== settings.installationId) return yield* AgentChannel.HandlerError.make({ code: \"unauthorized\" });\n\tconst installation = {\n\t\tauth: auth.value,\n\t\tinstallationId: settings.installationId\n\t};\n\treturn yield* pipe(Match.value(command), Match.discriminatorsExhaustive(\"kind\")({\n\t\tdeactivate: (deactivated) => Effect.succeed({\n\t\t\tkind: \"deactivate\",\n\t\t\toperationKey: deactivated.operationKey\n\t\t}),\n\t\tdeliver: (delivery) => deliver(delivery, installation),\n\t\tread_asset: () => Effect.fail(rejected()),\n\t\tread_context: (read) => readContext(read, installation),\n\t\treceive: (received) => receive(received, installation, context)\n\t}));\n});\nconst gitHubAppHandlers = Plugin.toLayer(gitHubAppPluginBase, (handlers) => handlers.channel(\"agent-issues\", {\n\tcheckAccess,\n\texecute,\n\tverify: (request, context) => verify(request, context.auth.value.webhookSecret)\n}));\nconst githubChannelLayer = gitHubAppHandlers.pipe(Layer.provide(GitHubAppClient.layer), Layer.provide(FetchHttpClient.layer));\n//#endregion\nexport { gitHubAppHandlers, githubChannelLayer };\n\n//# sourceMappingURL=github-app.js.map"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "1571922E5014769064756E2164756E21",
9
+ "names": []
10
+ }