@nairon-ai/aegis 0.2.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 (167) hide show
  1. package/.agents/skills/bug-fix/SKILL.md +91 -0
  2. package/.flue/agents/bug-fix.ts +107 -0
  3. package/.flue/app.ts +16 -0
  4. package/Dockerfile +8 -0
  5. package/LICENSE +21 -0
  6. package/README.md +251 -0
  7. package/dist-node/agent/bug-fix-skill.d.ts +2 -0
  8. package/dist-node/agent/bug-fix-skill.d.ts.map +1 -0
  9. package/dist-node/agent/bug-fix-skill.js +64 -0
  10. package/dist-node/agent/bug-fix-skill.js.map +1 -0
  11. package/dist-node/agent/client.d.ts +14 -0
  12. package/dist-node/agent/client.d.ts.map +1 -0
  13. package/dist-node/agent/client.js +110 -0
  14. package/dist-node/agent/client.js.map +1 -0
  15. package/dist-node/cli/commands/deploy.d.ts +3 -0
  16. package/dist-node/cli/commands/deploy.d.ts.map +1 -0
  17. package/dist-node/cli/commands/deploy.js +94 -0
  18. package/dist-node/cli/commands/deploy.js.map +1 -0
  19. package/dist-node/cli/commands/init.d.ts +3 -0
  20. package/dist-node/cli/commands/init.d.ts.map +1 -0
  21. package/dist-node/cli/commands/init.js +115 -0
  22. package/dist-node/cli/commands/init.js.map +1 -0
  23. package/dist-node/cli/commands/pickup.d.ts +11 -0
  24. package/dist-node/cli/commands/pickup.d.ts.map +1 -0
  25. package/dist-node/cli/commands/pickup.js +43 -0
  26. package/dist-node/cli/commands/pickup.js.map +1 -0
  27. package/dist-node/cli/commands/setup.d.ts +3 -0
  28. package/dist-node/cli/commands/setup.d.ts.map +1 -0
  29. package/dist-node/cli/commands/setup.js +163 -0
  30. package/dist-node/cli/commands/setup.js.map +1 -0
  31. package/dist-node/cli/commands/status.d.ts +3 -0
  32. package/dist-node/cli/commands/status.d.ts.map +1 -0
  33. package/dist-node/cli/commands/status.js +26 -0
  34. package/dist-node/cli/commands/status.js.map +1 -0
  35. package/dist-node/cli/index.d.ts +3 -0
  36. package/dist-node/cli/index.d.ts.map +1 -0
  37. package/dist-node/cli/index.js +36 -0
  38. package/dist-node/cli/index.js.map +1 -0
  39. package/dist-node/cli/paths.d.ts +7 -0
  40. package/dist-node/cli/paths.d.ts.map +1 -0
  41. package/dist-node/cli/paths.js +29 -0
  42. package/dist-node/cli/paths.js.map +1 -0
  43. package/dist-node/cli/state.d.ts +16 -0
  44. package/dist-node/cli/state.d.ts.map +1 -0
  45. package/dist-node/cli/state.js +214 -0
  46. package/dist-node/cli/state.js.map +1 -0
  47. package/dist-node/core/pickup.d.ts +14 -0
  48. package/dist-node/core/pickup.d.ts.map +1 -0
  49. package/dist-node/core/pickup.js +42 -0
  50. package/dist-node/core/pickup.js.map +1 -0
  51. package/dist-node/github/index.d.ts +3 -0
  52. package/dist-node/github/index.d.ts.map +1 -0
  53. package/dist-node/github/index.js +2 -0
  54. package/dist-node/github/index.js.map +1 -0
  55. package/dist-node/github/manifest.d.ts +34 -0
  56. package/dist-node/github/manifest.d.ts.map +1 -0
  57. package/dist-node/github/manifest.js +71 -0
  58. package/dist-node/github/manifest.js.map +1 -0
  59. package/dist-node/integrations/github.d.ts +29 -0
  60. package/dist-node/integrations/github.d.ts.map +1 -0
  61. package/dist-node/integrations/github.js +199 -0
  62. package/dist-node/integrations/github.js.map +1 -0
  63. package/dist-node/integrations/linear.d.ts +15 -0
  64. package/dist-node/integrations/linear.d.ts.map +1 -0
  65. package/dist-node/integrations/linear.js +146 -0
  66. package/dist-node/integrations/linear.js.map +1 -0
  67. package/dist-node/integrations/telegram.d.ts +24 -0
  68. package/dist-node/integrations/telegram.d.ts.map +1 -0
  69. package/dist-node/integrations/telegram.js +39 -0
  70. package/dist-node/integrations/telegram.js.map +1 -0
  71. package/dist-node/integrations/webhooks.d.ts +3 -0
  72. package/dist-node/integrations/webhooks.d.ts.map +1 -0
  73. package/dist-node/integrations/webhooks.js +37 -0
  74. package/dist-node/integrations/webhooks.js.map +1 -0
  75. package/dist-node/sandbox/github-token.d.ts +7 -0
  76. package/dist-node/sandbox/github-token.d.ts.map +1 -0
  77. package/dist-node/sandbox/github-token.js +66 -0
  78. package/dist-node/sandbox/github-token.js.map +1 -0
  79. package/dist-node/sandbox/index.d.ts +2 -0
  80. package/dist-node/sandbox/index.d.ts.map +1 -0
  81. package/dist-node/sandbox/index.js +2 -0
  82. package/dist-node/sandbox/index.js.map +1 -0
  83. package/dist-node/server/app.d.ts +9 -0
  84. package/dist-node/server/app.d.ts.map +1 -0
  85. package/dist-node/server/app.js +216 -0
  86. package/dist-node/server/app.js.map +1 -0
  87. package/dist-node/shared/config.d.ts +5 -0
  88. package/dist-node/shared/config.d.ts.map +1 -0
  89. package/dist-node/shared/config.js +135 -0
  90. package/dist-node/shared/config.js.map +1 -0
  91. package/dist-node/shared/constants.d.ts +16 -0
  92. package/dist-node/shared/constants.d.ts.map +1 -0
  93. package/dist-node/shared/constants.js +29 -0
  94. package/dist-node/shared/constants.js.map +1 -0
  95. package/dist-node/shared/format.d.ts +12 -0
  96. package/dist-node/shared/format.d.ts.map +1 -0
  97. package/dist-node/shared/format.js +71 -0
  98. package/dist-node/shared/format.js.map +1 -0
  99. package/dist-node/shared/index.d.ts +7 -0
  100. package/dist-node/shared/index.d.ts.map +1 -0
  101. package/dist-node/shared/index.js +7 -0
  102. package/dist-node/shared/index.js.map +1 -0
  103. package/dist-node/shared/readiness.d.ts +3 -0
  104. package/dist-node/shared/readiness.d.ts.map +1 -0
  105. package/dist-node/shared/readiness.js +91 -0
  106. package/dist-node/shared/readiness.js.map +1 -0
  107. package/dist-node/shared/run-state.d.ts +5 -0
  108. package/dist-node/shared/run-state.d.ts.map +1 -0
  109. package/dist-node/shared/run-state.js +26 -0
  110. package/dist-node/shared/run-state.js.map +1 -0
  111. package/dist-node/shared/types.d.ts +230 -0
  112. package/dist-node/shared/types.d.ts.map +1 -0
  113. package/dist-node/shared/types.js +5 -0
  114. package/dist-node/shared/types.js.map +1 -0
  115. package/dist-node/sources/github.d.ts +15 -0
  116. package/dist-node/sources/github.d.ts.map +1 -0
  117. package/dist-node/sources/github.js +44 -0
  118. package/dist-node/sources/github.js.map +1 -0
  119. package/dist-node/sources/index.d.ts +6 -0
  120. package/dist-node/sources/index.d.ts.map +1 -0
  121. package/dist-node/sources/index.js +16 -0
  122. package/dist-node/sources/index.js.map +1 -0
  123. package/dist-node/sources/linear.d.ts +15 -0
  124. package/dist-node/sources/linear.d.ts.map +1 -0
  125. package/dist-node/sources/linear.js +32 -0
  126. package/dist-node/sources/linear.js.map +1 -0
  127. package/dist-node/sources/types.d.ts +15 -0
  128. package/dist-node/sources/types.d.ts.map +1 -0
  129. package/dist-node/sources/types.js +2 -0
  130. package/dist-node/sources/types.js.map +1 -0
  131. package/docs/RELEASING.md +52 -0
  132. package/docs/SETUP.md +439 -0
  133. package/package.json +64 -0
  134. package/src/agent/bug-fix-skill.ts +63 -0
  135. package/src/agent/client.ts +156 -0
  136. package/src/cli/commands/deploy.ts +106 -0
  137. package/src/cli/commands/init.ts +119 -0
  138. package/src/cli/commands/pickup.ts +44 -0
  139. package/src/cli/commands/setup.ts +217 -0
  140. package/src/cli/commands/status.ts +24 -0
  141. package/src/cli/index.ts +38 -0
  142. package/src/cli/paths.ts +29 -0
  143. package/src/cli/state.ts +228 -0
  144. package/src/core/pickup.ts +66 -0
  145. package/src/github/index.ts +2 -0
  146. package/src/github/manifest.ts +97 -0
  147. package/src/integrations/github.ts +241 -0
  148. package/src/integrations/linear.ts +195 -0
  149. package/src/integrations/telegram.ts +48 -0
  150. package/src/integrations/webhooks.ts +53 -0
  151. package/src/sandbox/github-token.ts +92 -0
  152. package/src/sandbox/index.ts +1 -0
  153. package/src/server/app.ts +292 -0
  154. package/src/shared/config.ts +154 -0
  155. package/src/shared/constants.ts +30 -0
  156. package/src/shared/format.ts +84 -0
  157. package/src/shared/index.ts +6 -0
  158. package/src/shared/readiness.ts +116 -0
  159. package/src/shared/run-state.ts +32 -0
  160. package/src/shared/types.ts +257 -0
  161. package/src/sources/github.ts +57 -0
  162. package/src/sources/index.ts +20 -0
  163. package/src/sources/linear.ts +44 -0
  164. package/src/sources/types.ts +16 -0
  165. package/tsconfig.json +25 -0
  166. package/tsconfig.node.json +16 -0
  167. package/wrangler.jsonc +43 -0
@@ -0,0 +1,199 @@
1
+ import { getInstallationToken } from "../sandbox/github-token.js";
2
+ export class GitHubClient {
3
+ config;
4
+ token;
5
+ ensuredLabels = new Set();
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async listReadyIssues() {
10
+ const repo = this.config.monitoredRepo;
11
+ const labels = encodeURIComponent(`${this.config.readyLabel},${this.config.bugLabel}`);
12
+ const issues = await this.request(`/repos/${repo}/issues?state=open&labels=${labels}&per_page=50`);
13
+ return issues
14
+ .filter((issue) => !issue.pull_request)
15
+ .filter((issue) => {
16
+ const labels = extractLabels(issue.labels);
17
+ return ![
18
+ this.config.inProgressLabel,
19
+ this.config.needsInfoLabel,
20
+ this.config.blockedLabel,
21
+ this.config.prOpenedLabel,
22
+ ].some((label) => labels.includes(label));
23
+ })
24
+ .map((issue) => ({
25
+ source: "github",
26
+ id: String(issue.id),
27
+ number: issue.number,
28
+ identifier: `#${issue.number}`,
29
+ title: issue.title,
30
+ body: issue.body ?? "",
31
+ url: issue.html_url,
32
+ repo,
33
+ labels: extractLabels(issue.labels),
34
+ createdAt: issue.created_at,
35
+ updatedAt: issue.updated_at,
36
+ author: issue.user?.login,
37
+ }));
38
+ }
39
+ async getIssue(repo, issueNumber) {
40
+ const issue = await this.request(`/repos/${repo}/issues/${issueNumber}`);
41
+ return {
42
+ source: "github",
43
+ id: String(issue.id),
44
+ number: issue.number,
45
+ identifier: `#${issue.number}`,
46
+ title: issue.title,
47
+ body: issue.body ?? "",
48
+ url: issue.html_url,
49
+ repo,
50
+ labels: extractLabels(issue.labels),
51
+ createdAt: issue.created_at,
52
+ updatedAt: issue.updated_at,
53
+ author: issue.user?.login,
54
+ };
55
+ }
56
+ async findAegisBranch(repo, runId) {
57
+ const branches = await this.request(`/repos/${repo}/branches?protected=false&per_page=100`);
58
+ return branches.find((branch) => branch.name.includes(runId) || branch.name.endsWith(runId))
59
+ ?.name;
60
+ }
61
+ async addLabels(repo, issueNumber, labels) {
62
+ const uniqueLabels = [...new Set(labels.filter(Boolean))];
63
+ if (!uniqueLabels.length)
64
+ return;
65
+ await Promise.all(uniqueLabels.map((label) => this.ensureLabel(repo, label)));
66
+ await this.request(`/repos/${repo}/issues/${issueNumber}/labels`, {
67
+ method: "POST",
68
+ body: JSON.stringify({ labels: uniqueLabels }),
69
+ });
70
+ }
71
+ async removeLabel(repo, issueNumber, label) {
72
+ try {
73
+ await this.request(`/repos/${repo}/issues/${issueNumber}/labels/${encodeURIComponent(label)}`, {
74
+ method: "DELETE",
75
+ });
76
+ }
77
+ catch (error) {
78
+ if (error instanceof Error && error.message.includes("404"))
79
+ return;
80
+ throw error;
81
+ }
82
+ }
83
+ async comment(repo, issueNumber, body) {
84
+ await this.request(`/repos/${repo}/issues/${issueNumber}/comments`, {
85
+ method: "POST",
86
+ body: JSON.stringify({ body }),
87
+ });
88
+ }
89
+ async createPullRequest(params) {
90
+ const pr = await this.request(`/repos/${params.repo}/pulls`, {
91
+ method: "POST",
92
+ body: JSON.stringify({
93
+ title: params.title,
94
+ body: params.body,
95
+ head: params.head,
96
+ base: params.base,
97
+ }),
98
+ });
99
+ return { url: pr.html_url, number: pr.number, headSha: pr.head.sha };
100
+ }
101
+ async getCloneUrl(repo) {
102
+ const token = await this.getToken();
103
+ return `https://x-access-token:${token}@github.com/${repo}.git`;
104
+ }
105
+ async getToken() {
106
+ if (this.token)
107
+ return this.token;
108
+ if (this.config.github?.token) {
109
+ this.token = this.config.github.token;
110
+ return this.token;
111
+ }
112
+ const appId = this.config.github?.appId;
113
+ const privateKey = this.config.github?.privateKey;
114
+ const installationId = this.config.github?.installationId;
115
+ if (!appId || !privateKey || !installationId) {
116
+ throw new Error("GitHub credentials are not configured");
117
+ }
118
+ this.token = await getInstallationToken(appId, normalizePrivateKey(privateKey), installationId);
119
+ return this.token;
120
+ }
121
+ async request(path, init = {}) {
122
+ const token = await this.getToken();
123
+ const response = await fetch(`https://api.github.com${path}`, {
124
+ ...init,
125
+ headers: {
126
+ Authorization: `Bearer ${token}`,
127
+ Accept: "application/vnd.github+json",
128
+ "X-GitHub-Api-Version": "2022-11-28",
129
+ "User-Agent": "aegis-afk-bug-agent",
130
+ "Content-Type": "application/json",
131
+ ...init.headers,
132
+ },
133
+ });
134
+ if (!response.ok) {
135
+ const text = await response.text();
136
+ throw new Error(`GitHub ${path}: ${response.status} ${text}`);
137
+ }
138
+ if (response.status === 204)
139
+ return undefined;
140
+ return (await response.json());
141
+ }
142
+ async ensureLabel(repo, label) {
143
+ const cacheKey = `${repo}:${label.toLowerCase()}`;
144
+ if (this.ensuredLabels.has(cacheKey))
145
+ return;
146
+ try {
147
+ await this.request(`/repos/${repo}/labels/${encodeURIComponent(label)}`);
148
+ this.ensuredLabels.add(cacheKey);
149
+ return;
150
+ }
151
+ catch (error) {
152
+ if (!(error instanceof Error) || !error.message.includes("404"))
153
+ throw error;
154
+ }
155
+ try {
156
+ await this.request(`/repos/${repo}/labels`, {
157
+ method: "POST",
158
+ body: JSON.stringify({
159
+ name: label,
160
+ color: labelColor(label),
161
+ description: "Managed by Aegis",
162
+ }),
163
+ });
164
+ }
165
+ catch (error) {
166
+ if (!(error instanceof Error) || !error.message.includes("422"))
167
+ throw error;
168
+ }
169
+ this.ensuredLabels.add(cacheKey);
170
+ }
171
+ }
172
+ function extractLabels(labels) {
173
+ return labels
174
+ .map((label) => (typeof label === "string" ? label : label.name))
175
+ .filter((label) => Boolean(label));
176
+ }
177
+ function normalizePrivateKey(value) {
178
+ if (value.includes("BEGIN"))
179
+ return value;
180
+ try {
181
+ return atob(value);
182
+ }
183
+ catch {
184
+ return value;
185
+ }
186
+ }
187
+ function labelColor(label) {
188
+ const normalized = label.toLowerCase();
189
+ if (normalized.includes("in-progress"))
190
+ return "1d76db";
191
+ if (normalized.includes("needs-info"))
192
+ return "fbca04";
193
+ if (normalized.includes("blocked"))
194
+ return "d73a4a";
195
+ if (normalized.includes("pr-opened"))
196
+ return "0e8a16";
197
+ return "6f42c1";
198
+ }
199
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/integrations/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AegisConfig, WorkItem } from "../shared/types.js";
2
+ export declare class LinearClient {
3
+ private readonly config;
4
+ constructor(config: AegisConfig);
5
+ isConfigured(): boolean;
6
+ listReadyIssues(): Promise<WorkItem[]>;
7
+ getIssue(issueIdOrIdentifier: string): Promise<WorkItem>;
8
+ comment(issueId: string, body: string): Promise<void>;
9
+ moveToStatus(issueId: string, statusName: string | undefined): Promise<void>;
10
+ linkPullRequest(issueId: string, prUrl: string): Promise<void>;
11
+ private findStateId;
12
+ private requireConfig;
13
+ private graphql;
14
+ }
15
+ //# sourceMappingURL=linear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/integrations/linear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAoBhE,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,EAAE,WAAW;IAI/B,YAAY,IAAI,OAAO;IAIjB,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0DtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkCxD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrD,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5E,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAItD,WAAW;IAezB,OAAO,CAAC,aAAa;YAQP,OAAO;CAqBrB"}
@@ -0,0 +1,146 @@
1
+ export class LinearClient {
2
+ config;
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ isConfigured() {
7
+ return Boolean(this.config.linear?.apiKey && this.config.linear.teamId);
8
+ }
9
+ async listReadyIssues() {
10
+ if (!this.isConfigured())
11
+ return [];
12
+ const linear = this.requireConfig();
13
+ const result = await this.graphql(`query ReadyIssues($filter: IssueFilter, $first: Int!) {
14
+ issues(filter: $filter, first: $first, orderBy: updatedAt) {
15
+ nodes {
16
+ id
17
+ identifier
18
+ title
19
+ description
20
+ url
21
+ createdAt
22
+ updatedAt
23
+ state { id name }
24
+ team { id key }
25
+ labels { nodes { name } }
26
+ }
27
+ }
28
+ }`, {
29
+ first: 50,
30
+ filter: {
31
+ team: { id: { eq: linear.teamId } },
32
+ ...(linear.projectId ? { project: { id: { eq: linear.projectId } } } : {}),
33
+ state: { name: { eq: linear.readyStatusName } },
34
+ labels: { some: { name: { eq: linear.bugLabel } } },
35
+ },
36
+ });
37
+ return result.issues.nodes
38
+ .filter((issue) => {
39
+ const labels = issue.labels?.nodes.map((label) => label.name.toLowerCase()) ?? [];
40
+ return ![
41
+ this.config.inProgressLabel,
42
+ this.config.needsInfoLabel,
43
+ this.config.blockedLabel,
44
+ this.config.prOpenedLabel,
45
+ ].some((label) => labels.includes(label.toLowerCase()));
46
+ })
47
+ .map((issue) => ({
48
+ source: "linear",
49
+ id: issue.id,
50
+ identifier: issue.identifier,
51
+ title: issue.title,
52
+ body: issue.description ?? "",
53
+ url: issue.url,
54
+ repo: this.config.monitoredRepo,
55
+ labels: issue.labels?.nodes.map((label) => label.name) ?? [],
56
+ statusName: issue.state?.name,
57
+ createdAt: issue.createdAt,
58
+ updatedAt: issue.updatedAt,
59
+ }));
60
+ }
61
+ async getIssue(issueIdOrIdentifier) {
62
+ const result = await this.graphql(`query Issue($id: String!) {
63
+ issue(id: $id) {
64
+ id
65
+ identifier
66
+ title
67
+ description
68
+ url
69
+ createdAt
70
+ updatedAt
71
+ state { id name }
72
+ team { id key }
73
+ labels { nodes { name } }
74
+ }
75
+ }`, { id: issueIdOrIdentifier });
76
+ const issue = result.issue;
77
+ return {
78
+ source: "linear",
79
+ id: issue.id,
80
+ identifier: issue.identifier,
81
+ title: issue.title,
82
+ body: issue.description ?? "",
83
+ url: issue.url,
84
+ repo: this.config.monitoredRepo,
85
+ labels: issue.labels?.nodes.map((label) => label.name) ?? [],
86
+ statusName: issue.state?.name,
87
+ createdAt: issue.createdAt,
88
+ updatedAt: issue.updatedAt,
89
+ };
90
+ }
91
+ async comment(issueId, body) {
92
+ await this.graphql(`mutation CreateComment($issueId: String!, $body: String!) {
93
+ commentCreate(input: { issueId: $issueId, body: $body }) {
94
+ success
95
+ }
96
+ }`, { issueId, body });
97
+ }
98
+ async moveToStatus(issueId, statusName) {
99
+ if (!statusName)
100
+ return;
101
+ const stateId = await this.findStateId(statusName);
102
+ if (!stateId)
103
+ return;
104
+ await this.graphql(`mutation UpdateIssue($id: String!, $stateId: String!) {
105
+ issueUpdate(id: $id, input: { stateId: $stateId }) { success }
106
+ }`, { id: issueId, stateId });
107
+ }
108
+ async linkPullRequest(issueId, prUrl) {
109
+ await this.comment(issueId, `Aegis opened a PR: ${prUrl}`);
110
+ }
111
+ async findStateId(name) {
112
+ const linear = this.requireConfig();
113
+ const result = await this.graphql(`query WorkflowStates($teamId: String!) {
114
+ workflowStates(filter: { team: { id: { eq: $teamId } } }) {
115
+ nodes { id name }
116
+ }
117
+ }`, { teamId: linear.teamId });
118
+ return result.workflowStates.nodes.find((state) => state.name.toLowerCase() === name.toLowerCase())?.id;
119
+ }
120
+ requireConfig() {
121
+ const linear = this.config.linear;
122
+ if (!linear?.apiKey || !linear.teamId) {
123
+ throw new Error("Linear API key and team ID are required");
124
+ }
125
+ return linear;
126
+ }
127
+ async graphql(query, variables) {
128
+ const linear = this.requireConfig();
129
+ const response = await fetch("https://api.linear.app/graphql", {
130
+ method: "POST",
131
+ headers: {
132
+ Authorization: linear.apiKey ?? "",
133
+ "Content-Type": "application/json",
134
+ },
135
+ body: JSON.stringify({ query, variables }),
136
+ });
137
+ const payload = (await response.json());
138
+ if (!response.ok || payload.errors?.length) {
139
+ throw new Error(`Linear GraphQL failed: ${response.status} ${payload.errors?.map((error) => error.message).join("; ") ?? ""}`);
140
+ }
141
+ if (!payload.data)
142
+ throw new Error("Linear GraphQL returned no data");
143
+ return payload.data;
144
+ }
145
+ }
146
+ //# sourceMappingURL=linear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/integrations/linear.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,YAAY;IACP,MAAM,CAAc;IAErC,YAAY,MAAmB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,YAAY;QACX,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAGhC;;;;;;;;;;;;;;;KAeE,EACF;YACC,KAAK,EAAE,EAAE;YACT,MAAM,EAAE;gBACP,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE;gBACnC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,eAAe,EAAE,EAAE;gBAC/C,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;aACnD;SACD,CACD,CAAC;QAEF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK;aACxB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAClF,OAAO,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,eAAe;gBAC3B,IAAI,CAAC,MAAM,CAAC,cAAc;gBAC1B,IAAI,CAAC,MAAM,CAAC,YAAY;gBACxB,IAAI,CAAC,MAAM,CAAC,aAAa;aACzB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,MAAM,EAAE,QAAiB;YACzB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;YAC7B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAC5D,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;YAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,mBAA2B;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAChC;;;;;;;;;;;;;KAaE,EACF,EAAE,EAAE,EAAE,mBAAmB,EAAE,CAC3B,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,OAAO;YACN,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;YAC7B,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;YAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAC5D,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;YAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,IAAY;QAC1C,MAAM,IAAI,CAAC,OAAO,CACjB;;;;KAIE,EACF,EAAE,OAAO,EAAE,IAAI,EAAE,CACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,UAA8B;QACjE,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,CAAC,OAAO,CACjB;;KAEE,EACF,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAa;QACnD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAChC;;;;KAIE,EACF,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CACzB,CAAC;QACF,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAC1D,EAAE,EAAE,CAAC;IACP,CAAC;IAEO,aAAa;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,KAAa,EAAE,SAAkC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gCAAgC,EAAE;YAC9D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,aAAa,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;gBAClC,cAAc,EAAE,kBAAkB;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC1C,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsD,CAAC;QAC7F,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACd,0BAA0B,QAAQ,CAAC,MAAM,IACxC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAC7D,EAAE,CACF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC,IAAI,CAAC;IACrB,CAAC;CACD"}
@@ -0,0 +1,24 @@
1
+ import type { AegisConfig } from "../shared/types.js";
2
+ export declare function sendTelegramMessage(config: AegisConfig, text: string): Promise<void>;
3
+ export type TelegramCommand = {
4
+ action: "proceed";
5
+ runId: string;
6
+ text?: string;
7
+ actor: string;
8
+ } | {
9
+ action: "stop";
10
+ runId: string;
11
+ text?: string;
12
+ actor: string;
13
+ } | {
14
+ action: "ask";
15
+ runId: string;
16
+ text: string;
17
+ actor: string;
18
+ } | {
19
+ action: "ignore";
20
+ actor: string;
21
+ };
22
+ export declare function parseTelegramUpdate(update: unknown): TelegramCommand;
23
+ export declare function parseAegisCommand(text: string, actor: string): TelegramCommand;
24
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/integrations/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1F;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAMpE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAU9E"}
@@ -0,0 +1,39 @@
1
+ export async function sendTelegramMessage(config, text) {
2
+ const token = config.telegram?.botToken;
3
+ const chatId = config.telegram?.chatId;
4
+ if (!token || !chatId)
5
+ return;
6
+ const response = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
7
+ method: "POST",
8
+ headers: { "Content-Type": "application/json" },
9
+ body: JSON.stringify({
10
+ chat_id: chatId,
11
+ text,
12
+ disable_web_page_preview: true,
13
+ }),
14
+ });
15
+ if (!response.ok) {
16
+ const body = await response.text();
17
+ throw new Error(`Telegram sendMessage failed: ${response.status} ${body}`);
18
+ }
19
+ }
20
+ export function parseTelegramUpdate(update) {
21
+ const message = update.message;
22
+ const actor = message?.from?.username ?? String(message?.from?.id ?? "telegram");
23
+ return parseAegisCommand(message?.text ?? "", actor);
24
+ }
25
+ export function parseAegisCommand(text, actor) {
26
+ const trimmed = text.trim();
27
+ if (!trimmed.startsWith("/aegis"))
28
+ return { action: "ignore", actor };
29
+ const [, command, runId, ...rest] = trimmed.split(/\s+/);
30
+ if (command === "proceed" && runId)
31
+ return { action: "proceed", runId, actor };
32
+ if (command === "stop" && runId)
33
+ return { action: "stop", runId, actor };
34
+ if (command === "ask" && runId) {
35
+ return { action: "ask", runId, text: rest.join(" ").trim(), actor };
36
+ }
37
+ return { action: "ignore", actor };
38
+ }
39
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/integrations/telegram.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAmB,EAAE,IAAY;IAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO;IAE9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,KAAK,cAAc,EAAE;QAChF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,MAAM;YACf,IAAI;YACJ,wBAAwB,EAAE,IAAI;SAC9B,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC;AAQD,MAAM,UAAU,mBAAmB,CAAC,MAAe;IAClD,MAAM,OAAO,GACZ,MACA,CAAC,OAAO,CAAC;IACV,MAAM,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,UAAU,CAAC,CAAC;IACjF,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC/E,IAAI,OAAO,KAAK,MAAM,IAAI,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzE,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function verifyGitHubWebhook(body: string, signature: string | null | undefined, secret: string | undefined): Promise<boolean>;
2
+ export declare function verifyLinearWebhook(body: string, signature: string | null | undefined, secret: string | undefined): Promise<boolean>;
3
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/integrations/webhooks.ts"],"names":[],"mappings":"AAAA,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
@@ -0,0 +1,37 @@
1
+ export async function verifyGitHubWebhook(body, signature, secret) {
2
+ if (!secret)
3
+ return true;
4
+ if (!signature?.startsWith("sha256="))
5
+ return false;
6
+ const expected = signature.slice("sha256=".length);
7
+ const encoder = new TextEncoder();
8
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
9
+ const digest = await crypto.subtle.sign("HMAC", key, encoder.encode(body));
10
+ const actual = [...new Uint8Array(digest)]
11
+ .map((byte) => byte.toString(16).padStart(2, "0"))
12
+ .join("");
13
+ return timingSafeEqual(actual, expected);
14
+ }
15
+ export async function verifyLinearWebhook(body, signature, secret) {
16
+ if (!secret)
17
+ return true;
18
+ if (!signature)
19
+ return false;
20
+ const encoder = new TextEncoder();
21
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
22
+ const digest = await crypto.subtle.sign("HMAC", key, encoder.encode(body));
23
+ const actual = [...new Uint8Array(digest)]
24
+ .map((byte) => byte.toString(16).padStart(2, "0"))
25
+ .join("");
26
+ return timingSafeEqual(actual, signature);
27
+ }
28
+ function timingSafeEqual(a, b) {
29
+ if (a.length !== b.length)
30
+ return false;
31
+ let result = 0;
32
+ for (let i = 0; i < a.length; i++) {
33
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
34
+ }
35
+ return result === 0;
36
+ }
37
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/integrations/webhooks.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,IAAY,EACZ,SAAoC,EACpC,MAA0B;IAE1B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACxC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACR,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,IAAY,EACZ,SAAoC,EACpC,MAA0B;IAE1B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACxC,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACR,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,KAAK,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * GitHub App JWT + installation token generation.
3
+ * Uses Web Crypto API (works in Cloudflare Workers).
4
+ */
5
+ export declare function createAppJwt(appId: string, privateKey: string): Promise<string>;
6
+ export declare function getInstallationToken(appId: string, privateKey: string, installationId: string): Promise<string>;
7
+ //# sourceMappingURL=github-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-token.d.ts","sourceRoot":"","sources":["../../src/sandbox/github-token.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrF;AAED,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * GitHub App JWT + installation token generation.
3
+ * Uses Web Crypto API (works in Cloudflare Workers).
4
+ */
5
+ export async function createAppJwt(appId, privateKey) {
6
+ const now = Math.floor(Date.now() / 1000);
7
+ const payload = {
8
+ iat: now - 60,
9
+ exp: now + 600,
10
+ iss: appId,
11
+ };
12
+ const header = { alg: "RS256", typ: "JWT" };
13
+ const encodedHeader = base64url(JSON.stringify(header));
14
+ const encodedPayload = base64url(JSON.stringify(payload));
15
+ const signingInput = `${encodedHeader}.${encodedPayload}`;
16
+ const keyData = pemToArrayBuffer(privateKey);
17
+ const key = await crypto.subtle.importKey("pkcs8", keyData, { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, false, ["sign"]);
18
+ const signature = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", key, new TextEncoder().encode(signingInput));
19
+ return `${signingInput}.${base64url(signature)}`;
20
+ }
21
+ export async function getInstallationToken(appId, privateKey, installationId) {
22
+ const jwt = await createAppJwt(appId, privateKey);
23
+ const response = await fetch(`https://api.github.com/app/installations/${installationId}/access_tokens`, {
24
+ method: "POST",
25
+ headers: {
26
+ Authorization: `Bearer ${jwt}`,
27
+ Accept: "application/vnd.github+json",
28
+ "X-GitHub-Api-Version": "2022-11-28",
29
+ "User-Agent": "aegis-bot",
30
+ },
31
+ });
32
+ if (!response.ok) {
33
+ const text = await response.text();
34
+ throw new Error(`Failed to get installation token: ${response.status} ${text}`);
35
+ }
36
+ const data = (await response.json());
37
+ return data.token;
38
+ }
39
+ function base64url(input) {
40
+ let base64;
41
+ if (typeof input === "string") {
42
+ base64 = btoa(input);
43
+ }
44
+ else {
45
+ const bytes = new Uint8Array(input);
46
+ let binary = "";
47
+ for (const byte of bytes) {
48
+ binary += String.fromCharCode(byte);
49
+ }
50
+ base64 = btoa(binary);
51
+ }
52
+ return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
53
+ }
54
+ function pemToArrayBuffer(pem) {
55
+ const lines = pem
56
+ .replace(/-----BEGIN .+-----/, "")
57
+ .replace(/-----END .+-----/, "")
58
+ .replace(/\s/g, "");
59
+ const binary = atob(lines);
60
+ const bytes = new Uint8Array(binary.length);
61
+ for (let i = 0; i < binary.length; i++) {
62
+ bytes[i] = binary.charCodeAt(i);
63
+ }
64
+ return bytes.buffer;
65
+ }
66
+ //# sourceMappingURL=github-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-token.js","sourceRoot":"","sources":["../../src/sandbox/github-token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { getInstallationToken, createAppJwt } from "./github-token.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { getInstallationToken, createAppJwt } from "./github-token.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Hono } from "hono";
2
+ import type { Bindings } from "../shared/types.js";
3
+ type HonoBindings = {
4
+ Bindings: Bindings;
5
+ };
6
+ export declare function createAegisApp(): Hono<HonoBindings, import("hono/types").BlankSchema, "/">;
7
+ export declare function scheduledPickup(_controller: ScheduledController, env: Bindings, ctx: ExecutionContext): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,OAAO,KAAK,EAAE,QAAQ,EAAwC,MAAM,oBAAoB,CAAC;AAGzF,KAAK,YAAY,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE3C,wBAAgB,cAAc,8DA2J7B;AAED,wBAAsB,eAAe,CACpC,WAAW,EAAE,mBAAmB,EAChC,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,gBAAgB,GACnB,OAAO,CAAC,IAAI,CAAC,CASf"}