openclaw-channel-github 0.1.0

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 (46) hide show
  1. package/README.md +578 -0
  2. package/config.example.json +33 -0
  3. package/dist/index.d.ts +14 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +44 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/auth/auth.d.ts +22 -0
  8. package/dist/src/auth/auth.d.ts.map +1 -0
  9. package/dist/src/auth/auth.js +112 -0
  10. package/dist/src/auth/auth.js.map +1 -0
  11. package/dist/src/config/config.d.ts +60 -0
  12. package/dist/src/config/config.d.ts.map +1 -0
  13. package/dist/src/config/config.js +184 -0
  14. package/dist/src/config/config.js.map +1 -0
  15. package/dist/src/events/events.d.ts +234 -0
  16. package/dist/src/events/events.d.ts.map +1 -0
  17. package/dist/src/events/events.js +53 -0
  18. package/dist/src/events/events.js.map +1 -0
  19. package/dist/src/main.d.ts +2 -0
  20. package/dist/src/main.d.ts.map +1 -0
  21. package/dist/src/main.js +115 -0
  22. package/dist/src/main.js.map +1 -0
  23. package/dist/src/normalizer/normalizer.d.ts +94 -0
  24. package/dist/src/normalizer/normalizer.d.ts.map +1 -0
  25. package/dist/src/normalizer/normalizer.js +486 -0
  26. package/dist/src/normalizer/normalizer.js.map +1 -0
  27. package/dist/src/outbound/outbound.d.ts +24 -0
  28. package/dist/src/outbound/outbound.d.ts.map +1 -0
  29. package/dist/src/outbound/outbound.js +125 -0
  30. package/dist/src/outbound/outbound.js.map +1 -0
  31. package/dist/src/routing/routing.d.ts +22 -0
  32. package/dist/src/routing/routing.d.ts.map +1 -0
  33. package/dist/src/routing/routing.js +97 -0
  34. package/dist/src/routing/routing.js.map +1 -0
  35. package/dist/src/server/server.d.ts +20 -0
  36. package/dist/src/server/server.d.ts.map +1 -0
  37. package/dist/src/server/server.js +283 -0
  38. package/dist/src/server/server.js.map +1 -0
  39. package/dist/src/state/state.d.ts +17 -0
  40. package/dist/src/state/state.d.ts.map +1 -0
  41. package/dist/src/state/state.js +49 -0
  42. package/dist/src/state/state.js.map +1 -0
  43. package/docs/api.md +450 -0
  44. package/docs/usage.md +393 -0
  45. package/openclaw.plugin.json +104 -0
  46. package/package.json +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/auth/auth.ts"],"names":[],"mappings":"AAKA,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,WAAW,CAAqB;gBAE5B,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAKhD,qFAAqF;IACrF,WAAW,IAAI,MAAM;IAUrB,wDAAwD;IACxD,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI;IAKvD,+EAA+E;IAC/E,oBAAoB,IAAI,MAAM;CAQ/B;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAeT;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,CAE/F;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,CAEhG;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,MAAM,CAE/F"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ // Package auth provides GitHub App authentication and webhook signature verification.
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.GitHubAuth = void 0;
41
+ exports.verifyWebhookSignature = verifyWebhookSignature;
42
+ exports.extractSignature = extractSignature;
43
+ exports.extractDeliveryID = extractDeliveryID;
44
+ exports.extractEventType = extractEventType;
45
+ const crypto = __importStar(require("crypto"));
46
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
47
+ class GitHubAuth {
48
+ appId;
49
+ privateKey;
50
+ installationToken = '';
51
+ tokenExpiry = new Date(0);
52
+ constructor(appId, privateKeyPEM) {
53
+ this.appId = appId;
54
+ this.privateKey = privateKeyPEM;
55
+ }
56
+ /** Create a short-lived JWT for GitHub App authentication (valid for 10 minutes). */
57
+ generateJWT() {
58
+ const now = Math.floor(Date.now() / 1000);
59
+ const payload = {
60
+ iat: now - 60,
61
+ exp: now + 10 * 60,
62
+ iss: String(this.appId),
63
+ };
64
+ return jsonwebtoken_1.default.sign(payload, this.privateKey, { algorithm: 'RS256' });
65
+ }
66
+ /** Cache an installation token with its expiry time. */
67
+ setInstallationToken(token, expiry) {
68
+ this.installationToken = token;
69
+ this.tokenExpiry = expiry;
70
+ }
71
+ /** Return the cached installation token if still valid (with 1-min buffer). */
72
+ getInstallationToken() {
73
+ if (!this.installationToken)
74
+ return '';
75
+ const bufferMs = 60 * 1000;
76
+ if (Date.now() > this.tokenExpiry.getTime() - bufferMs) {
77
+ return '';
78
+ }
79
+ return this.installationToken;
80
+ }
81
+ }
82
+ exports.GitHubAuth = GitHubAuth;
83
+ /** Verify X-Hub-Signature-256 header against the payload using HMAC-SHA256. */
84
+ function verifyWebhookSignature(payload, secret, signature) {
85
+ if (!signature || !secret)
86
+ return false;
87
+ if (!signature.startsWith('sha256='))
88
+ return false;
89
+ const sig = signature.slice('sha256='.length);
90
+ const mac = crypto.createHmac('sha256', secret);
91
+ mac.update(payload);
92
+ const expected = mac.digest('hex');
93
+ try {
94
+ return crypto.timingSafeEqual(Buffer.from(sig, 'hex'), Buffer.from(expected, 'hex'));
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ /** Extract X-Hub-Signature-256 header from request headers. */
101
+ function extractSignature(headers) {
102
+ return headers['x-hub-signature-256'] ?? '';
103
+ }
104
+ /** Extract X-GitHub-Delivery header from request headers. */
105
+ function extractDeliveryID(headers) {
106
+ return headers['x-github-delivery'] ?? '';
107
+ }
108
+ /** Extract X-GitHub-Event header from request headers. */
109
+ function extractEventType(headers) {
110
+ return headers['x-github-event'] ?? '';
111
+ }
112
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/auth/auth.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CtF,wDAmBC;AAGD,4CAEC;AAGD,8CAEC;AAGD,4CAEC;AA7ED,+CAAiC;AACjC,gEAA+B;AAE/B,MAAa,UAAU;IACb,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,iBAAiB,GAAW,EAAE,CAAC;IAC/B,WAAW,GAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAExC,YAAY,KAAa,EAAE,aAAqB;QAC9C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC;IAClC,CAAC;IAED,qFAAqF;IACrF,WAAW;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,GAAG,GAAG,EAAE;YACb,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE;YAClB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACxB,CAAC;QACF,OAAO,sBAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,wDAAwD;IACxD,oBAAoB,CAAC,KAAa,EAAE,MAAY;QAC9C,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,CAAC;IAED,+EAA+E;IAC/E,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;CACF;AArCD,gCAqCC;AAED,+EAA+E;AAC/E,SAAgB,sBAAsB,CACpC,OAAwB,EACxB,MAAc,EACd,SAAiB;IAEjB,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAgB,gBAAgB,CAAC,OAAsD;IACrF,OAAQ,OAAO,CAAC,qBAAqB,CAAY,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,6DAA6D;AAC7D,SAAgB,iBAAiB,CAAC,OAAsD;IACtF,OAAQ,OAAO,CAAC,mBAAmB,CAAY,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,0DAA0D;AAC1D,SAAgB,gBAAgB,CAAC,OAAsD;IACrF,OAAQ,OAAO,CAAC,gBAAgB,CAAY,IAAI,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,60 @@
1
+ export interface ServerConfig {
2
+ addr: string;
3
+ }
4
+ export interface TriggerConfig {
5
+ requireMention: boolean;
6
+ botUsername: string;
7
+ commands: string[];
8
+ labels: string[];
9
+ }
10
+ export interface AutoTriggerConfig {
11
+ onPROpened?: boolean;
12
+ onIssueOpened?: boolean;
13
+ }
14
+ export interface OutboundConfig {
15
+ mode?: string;
16
+ outboundMarker?: string;
17
+ }
18
+ export interface RateLimitConfig {
19
+ maxEventsPerMinute?: number;
20
+ }
21
+ export interface AccountConfig {
22
+ mode: string;
23
+ appId: number;
24
+ installationId: number;
25
+ privateKeyPath: string;
26
+ webhookSecret: string;
27
+ repositories: string[];
28
+ }
29
+ export interface ChannelConfig {
30
+ enabled: boolean;
31
+ mode: string;
32
+ appId: number;
33
+ installationId: number;
34
+ privateKeyPath: string;
35
+ webhookSecret: string;
36
+ repositories: string[];
37
+ trigger: TriggerConfig;
38
+ ignoreBots: boolean;
39
+ accounts?: Record<string, AccountConfig>;
40
+ rateLimit?: RateLimitConfig;
41
+ outbound?: OutboundConfig;
42
+ autoTrigger?: AutoTriggerConfig;
43
+ }
44
+ export interface Config {
45
+ server: ServerConfig;
46
+ channel: ChannelConfig;
47
+ }
48
+ export declare function loadFromFile(path: string): Config;
49
+ export declare function parse(data: string): Config;
50
+ export declare function validate(cfg: Config): void;
51
+ /** Check if a repository is in the allowlist (case-insensitive). */
52
+ export declare function isRepoAllowed(cfg: Config, fullName: string): boolean;
53
+ /** Get account config by name. Falls back to flat config when no accounts map. */
54
+ export declare function getAccount(cfg: Config, name: string): AccountConfig | undefined;
55
+ /** Find the account that manages a given repository. */
56
+ export declare function getAccountForRepo(cfg: Config, repo: string): {
57
+ name: string;
58
+ account: AccountConfig;
59
+ } | undefined;
60
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAgD1C;AA6CD,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAgBpE;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAY/E;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GAAG,SAAS,CAuBtD"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ // Package config provides configuration types and loading for the OpenClaw GitHub Channel.
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.loadFromFile = loadFromFile;
38
+ exports.parse = parse;
39
+ exports.validate = validate;
40
+ exports.isRepoAllowed = isRepoAllowed;
41
+ exports.getAccount = getAccount;
42
+ exports.getAccountForRepo = getAccountForRepo;
43
+ const fs = __importStar(require("fs"));
44
+ function loadFromFile(path) {
45
+ const data = fs.readFileSync(path, 'utf-8');
46
+ return parse(data);
47
+ }
48
+ function parse(data) {
49
+ const cfg = JSON.parse(data);
50
+ validate(cfg);
51
+ return cfg;
52
+ }
53
+ function validate(cfg) {
54
+ const errs = [];
55
+ if (!cfg.server.addr) {
56
+ cfg.server.addr = ':8080';
57
+ }
58
+ if (!cfg.channel.enabled) {
59
+ return;
60
+ }
61
+ const accounts = cfg.channel.accounts;
62
+ if (accounts && Object.keys(accounts).length > 0) {
63
+ for (const [name, acct] of Object.entries(accounts)) {
64
+ errs.push(...validateAccountFields(`channel.accounts[${name}]`, acct));
65
+ }
66
+ }
67
+ else {
68
+ errs.push(...validateAccountFields('channel', {
69
+ mode: cfg.channel.mode,
70
+ appId: cfg.channel.appId,
71
+ installationId: cfg.channel.installationId,
72
+ privateKeyPath: cfg.channel.privateKeyPath,
73
+ webhookSecret: cfg.channel.webhookSecret,
74
+ repositories: cfg.channel.repositories,
75
+ }));
76
+ }
77
+ if (cfg.channel.trigger?.requireMention && !cfg.channel.trigger.botUsername) {
78
+ errs.push('channel.trigger.botUsername is required when requireMention is true');
79
+ }
80
+ const outboundMode = cfg.channel.outbound?.mode;
81
+ if (outboundMode && !['comment', 'review', 'auto'].includes(outboundMode)) {
82
+ errs.push(`channel.outbound.mode "${outboundMode}" is not supported (use 'comment', 'review', or 'auto')`);
83
+ }
84
+ const maxEvents = cfg.channel.rateLimit?.maxEventsPerMinute;
85
+ if (maxEvents !== undefined && maxEvents < 0) {
86
+ errs.push('channel.rateLimit.maxEventsPerMinute must not be negative');
87
+ }
88
+ if (errs.length > 0) {
89
+ throw new Error(errs.join('; '));
90
+ }
91
+ }
92
+ function validateAccountFields(prefix, acct) {
93
+ const errs = [];
94
+ switch (acct.mode) {
95
+ case 'app':
96
+ if (!acct.appId) {
97
+ errs.push(`${prefix}.appId is required when mode is 'app'`);
98
+ }
99
+ if (!acct.installationId) {
100
+ errs.push(`${prefix}.installationId is required when mode is 'app'`);
101
+ }
102
+ if (!acct.privateKeyPath) {
103
+ errs.push(`${prefix}.privateKeyPath is required when mode is 'app'`);
104
+ }
105
+ break;
106
+ case 'token':
107
+ break;
108
+ case undefined:
109
+ case '':
110
+ errs.push(`${prefix}.mode is required (use 'app' or 'token')`);
111
+ break;
112
+ default:
113
+ errs.push(`${prefix}.mode "${acct.mode}" is not supported (use 'app' or 'token')`);
114
+ }
115
+ if (!acct.webhookSecret) {
116
+ errs.push(`${prefix}.webhookSecret is required`);
117
+ }
118
+ if (!acct.repositories || acct.repositories.length === 0) {
119
+ errs.push(`${prefix}.repositories must contain at least one repository`);
120
+ }
121
+ else {
122
+ for (const repo of acct.repositories) {
123
+ const parts = repo.split('/');
124
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
125
+ errs.push(`${prefix}.repositories: "${repo}" must be in 'owner/repo' format`);
126
+ }
127
+ }
128
+ }
129
+ return errs;
130
+ }
131
+ /** Check if a repository is in the allowlist (case-insensitive). */
132
+ function isRepoAllowed(cfg, fullName) {
133
+ const lower = fullName.toLowerCase();
134
+ for (const repo of cfg.channel.repositories ?? []) {
135
+ if (repo.toLowerCase() === lower)
136
+ return true;
137
+ }
138
+ if (cfg.channel.accounts) {
139
+ for (const acct of Object.values(cfg.channel.accounts)) {
140
+ for (const repo of acct.repositories ?? []) {
141
+ if (repo.toLowerCase() === lower)
142
+ return true;
143
+ }
144
+ }
145
+ }
146
+ return false;
147
+ }
148
+ /** Get account config by name. Falls back to flat config when no accounts map. */
149
+ function getAccount(cfg, name) {
150
+ if (cfg.channel.accounts && Object.keys(cfg.channel.accounts).length > 0) {
151
+ return cfg.channel.accounts[name];
152
+ }
153
+ return {
154
+ mode: cfg.channel.mode,
155
+ appId: cfg.channel.appId,
156
+ installationId: cfg.channel.installationId,
157
+ privateKeyPath: cfg.channel.privateKeyPath,
158
+ webhookSecret: cfg.channel.webhookSecret,
159
+ repositories: cfg.channel.repositories,
160
+ };
161
+ }
162
+ /** Find the account that manages a given repository. */
163
+ function getAccountForRepo(cfg, repo) {
164
+ const lower = repo.toLowerCase();
165
+ if (cfg.channel.accounts) {
166
+ for (const [name, acct] of Object.entries(cfg.channel.accounts)) {
167
+ for (const r of acct.repositories ?? []) {
168
+ if (r.toLowerCase() === lower) {
169
+ return { name, account: acct };
170
+ }
171
+ }
172
+ }
173
+ }
174
+ if (!cfg.channel.accounts || Object.keys(cfg.channel.accounts).length === 0) {
175
+ for (const r of cfg.channel.repositories ?? []) {
176
+ if (r.toLowerCase() === lower) {
177
+ const account = getAccount(cfg, 'default');
178
+ return { name: 'default', account };
179
+ }
180
+ }
181
+ }
182
+ return undefined;
183
+ }
184
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ export declare const EventType: {
2
+ readonly Issues: "issues";
3
+ readonly IssueComment: "issue_comment";
4
+ readonly PullRequest: "pull_request";
5
+ readonly PullRequestReview: "pull_request_review";
6
+ readonly PullRequestReviewComment: "pull_request_review_comment";
7
+ readonly Discussion: "discussion";
8
+ readonly DiscussionComment: "discussion_comment";
9
+ readonly CheckRun: "check_run";
10
+ readonly WorkflowRun: "workflow_run";
11
+ };
12
+ export type EventTypeValue = (typeof EventType)[keyof typeof EventType];
13
+ export declare const Action: {
14
+ readonly Opened: "opened";
15
+ readonly Edited: "edited";
16
+ readonly Closed: "closed";
17
+ readonly Reopened: "reopened";
18
+ readonly Created: "created";
19
+ readonly Deleted: "deleted";
20
+ readonly Submitted: "submitted";
21
+ readonly Labeled: "labeled";
22
+ readonly Unlabeled: "unlabeled";
23
+ readonly Assigned: "assigned";
24
+ readonly Unassigned: "unassigned";
25
+ readonly Synchronize: "synchronize";
26
+ readonly Merged: "merged";
27
+ readonly Completed: "completed";
28
+ readonly Requested: "requested";
29
+ };
30
+ export type ActionValue = (typeof Action)[keyof typeof Action];
31
+ export interface User {
32
+ id: number;
33
+ login: string;
34
+ type: string;
35
+ }
36
+ export interface Repository {
37
+ id: number;
38
+ full_name: string;
39
+ name: string;
40
+ owner: User;
41
+ }
42
+ export interface Label {
43
+ name: string;
44
+ }
45
+ export interface Issue {
46
+ number: number;
47
+ title: string;
48
+ body: string;
49
+ state: string;
50
+ user: User;
51
+ labels: Label[];
52
+ assignees: User[];
53
+ html_url: string;
54
+ created_at: string;
55
+ updated_at: string;
56
+ closed_at?: string | null;
57
+ }
58
+ export interface GitRef {
59
+ ref: string;
60
+ sha: string;
61
+ }
62
+ export interface PullRequest {
63
+ number: number;
64
+ title: string;
65
+ body: string;
66
+ state: string;
67
+ merged: boolean;
68
+ user: User;
69
+ labels: Label[];
70
+ assignees: User[];
71
+ html_url: string;
72
+ diff_url: string;
73
+ head: GitRef;
74
+ base: GitRef;
75
+ created_at: string;
76
+ updated_at: string;
77
+ closed_at?: string | null;
78
+ merged_at?: string | null;
79
+ }
80
+ export interface Comment {
81
+ id: number;
82
+ body: string;
83
+ user: User;
84
+ html_url: string;
85
+ created_at: string;
86
+ updated_at: string;
87
+ }
88
+ export interface ReviewComment {
89
+ id: number;
90
+ body: string;
91
+ path: string;
92
+ line: number;
93
+ side: string;
94
+ in_reply_to_id?: number;
95
+ pull_request_review_id: number;
96
+ user: User;
97
+ html_url: string;
98
+ created_at: string;
99
+ }
100
+ export interface Review {
101
+ id: number;
102
+ body: string;
103
+ state: string;
104
+ user: User;
105
+ html_url: string;
106
+ submitted_at: string;
107
+ }
108
+ export interface Installation {
109
+ id: number;
110
+ }
111
+ export interface DiscussionCategory {
112
+ name: string;
113
+ slug: string;
114
+ }
115
+ export interface Discussion {
116
+ number: number;
117
+ title: string;
118
+ body: string;
119
+ state: string;
120
+ category: DiscussionCategory;
121
+ user: User;
122
+ html_url: string;
123
+ created_at: string;
124
+ }
125
+ export interface DiscussionComment {
126
+ id: number;
127
+ body: string;
128
+ user: User;
129
+ html_url: string;
130
+ created_at: string;
131
+ }
132
+ export interface PullRequestRef {
133
+ number: number;
134
+ url: string;
135
+ }
136
+ export interface CheckSuite {
137
+ id: number;
138
+ pull_requests: PullRequestRef[];
139
+ }
140
+ export interface CheckRun {
141
+ id: number;
142
+ name: string;
143
+ status: string;
144
+ conclusion: string;
145
+ html_url: string;
146
+ started_at: string;
147
+ completed_at?: string | null;
148
+ check_suite: CheckSuite;
149
+ }
150
+ export interface WorkflowRun {
151
+ id: number;
152
+ name: string;
153
+ status: string;
154
+ conclusion: string;
155
+ html_url: string;
156
+ created_at: string;
157
+ updated_at: string;
158
+ pull_requests: PullRequestRef[];
159
+ }
160
+ export interface IssueEvent {
161
+ action: string;
162
+ issue: Issue;
163
+ label?: Label;
164
+ assignee?: User;
165
+ repository: Repository;
166
+ sender: User;
167
+ installation: Installation;
168
+ }
169
+ export interface IssueCommentEvent {
170
+ action: string;
171
+ issue: Issue;
172
+ comment: Comment;
173
+ repository: Repository;
174
+ sender: User;
175
+ installation: Installation;
176
+ }
177
+ export interface PullRequestEvent {
178
+ action: string;
179
+ pull_request: PullRequest;
180
+ label?: Label;
181
+ assignee?: User;
182
+ repository: Repository;
183
+ sender: User;
184
+ installation: Installation;
185
+ }
186
+ export interface PullRequestReviewEvent {
187
+ action: string;
188
+ review: Review;
189
+ pull_request: PullRequest;
190
+ repository: Repository;
191
+ sender: User;
192
+ installation: Installation;
193
+ }
194
+ export interface PullRequestReviewCommentEvent {
195
+ action: string;
196
+ comment: ReviewComment;
197
+ pull_request: PullRequest;
198
+ repository: Repository;
199
+ sender: User;
200
+ installation: Installation;
201
+ }
202
+ export interface DiscussionEvent {
203
+ action: string;
204
+ discussion: Discussion;
205
+ repository: Repository;
206
+ sender: User;
207
+ installation: Installation;
208
+ }
209
+ export interface DiscussionCommentEvent {
210
+ action: string;
211
+ discussion: Discussion;
212
+ comment: DiscussionComment;
213
+ repository: Repository;
214
+ sender: User;
215
+ installation: Installation;
216
+ }
217
+ export interface CheckRunEvent {
218
+ action: string;
219
+ check_run: CheckRun;
220
+ repository: Repository;
221
+ sender: User;
222
+ installation: Installation;
223
+ }
224
+ export interface WorkflowRunEvent {
225
+ action: string;
226
+ workflow_run: WorkflowRun;
227
+ repository: Repository;
228
+ sender: User;
229
+ installation: Installation;
230
+ }
231
+ export type ParsedEvent = IssueEvent | IssueCommentEvent | PullRequestEvent | PullRequestReviewEvent | PullRequestReviewCommentEvent | DiscussionEvent | DiscussionCommentEvent | CheckRunEvent | WorkflowRunEvent;
232
+ /** Parse a webhook payload based on event type. */
233
+ export declare function parseEvent(eventType: string, payload: string | Buffer): ParsedEvent;
234
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/events/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ // Package events provides types for GitHub webhook events and payload parsing.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Action = exports.EventType = void 0;
5
+ exports.parseEvent = parseEvent;
6
+ // --- Event & Action constants ---
7
+ exports.EventType = {
8
+ Issues: 'issues',
9
+ IssueComment: 'issue_comment',
10
+ PullRequest: 'pull_request',
11
+ PullRequestReview: 'pull_request_review',
12
+ PullRequestReviewComment: 'pull_request_review_comment',
13
+ Discussion: 'discussion',
14
+ DiscussionComment: 'discussion_comment',
15
+ CheckRun: 'check_run',
16
+ WorkflowRun: 'workflow_run',
17
+ };
18
+ exports.Action = {
19
+ Opened: 'opened',
20
+ Edited: 'edited',
21
+ Closed: 'closed',
22
+ Reopened: 'reopened',
23
+ Created: 'created',
24
+ Deleted: 'deleted',
25
+ Submitted: 'submitted',
26
+ Labeled: 'labeled',
27
+ Unlabeled: 'unlabeled',
28
+ Assigned: 'assigned',
29
+ Unassigned: 'unassigned',
30
+ Synchronize: 'synchronize',
31
+ Merged: 'merged',
32
+ Completed: 'completed',
33
+ Requested: 'requested',
34
+ };
35
+ /** Parse a webhook payload based on event type. */
36
+ function parseEvent(eventType, payload) {
37
+ const data = typeof payload === 'string' ? payload : payload.toString('utf-8');
38
+ switch (eventType) {
39
+ case exports.EventType.Issues:
40
+ case exports.EventType.IssueComment:
41
+ case exports.EventType.PullRequest:
42
+ case exports.EventType.PullRequestReview:
43
+ case exports.EventType.PullRequestReviewComment:
44
+ case exports.EventType.Discussion:
45
+ case exports.EventType.DiscussionComment:
46
+ case exports.EventType.CheckRun:
47
+ case exports.EventType.WorkflowRun:
48
+ return JSON.parse(data);
49
+ default:
50
+ throw new Error(`unsupported event type: ${eventType}`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=events.js.map