@assemblyline-agents/github 2.0.0 → 3.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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 OpenEve contributors
3
+ Copyright (c) 2026 Assembly Line contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -2,7 +2,12 @@
2
2
 
3
3
  Official Assembly Line GitHub connection plugin.
4
4
 
5
- `defineGitHubConnection` and `defineGitHubMcpConnection` give agents authenticated GitHub access, and the bundled skill under `skills/` covers repository, issue, pull-request, and workflow tasks. GitHub is intentionally a tool connection rather than an inbound Assembly Line communication channel.
5
+ The package has two deliberately separate connections:
6
+
7
+ - `defineGitHubMcpConnection()` exposes structured GitHub tools with Assembly Line read/write policy and approvals.
8
+ - `defineGitHubAppConnection()` exposes no connection tools. It verifies a user- or deployment-owned GitHub App installation and materializes a one-hour credential for ordinary Git and `gh` commands in the active root sandbox.
9
+
10
+ The App private key stays in the runtime host secret store. Repository access and permissions come directly from the GitHub App installation; Assembly Line does not impose a contents-only or selected-repository policy. Installation tokens never enter prompts, model-facing connection tools, logs, or durable records. See the [GitHub App sandbox guide](../../docs/developers/github-app-sandbox.md).
6
11
 
7
12
  ## Install
8
13
 
@@ -0,0 +1,3 @@
1
+ import { type ConnectionPluginEventAdapter } from "@assemblyline-agents/core";
2
+ export declare const githubAppEvents: ConnectionPluginEventAdapter;
3
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,4BAA4B,EAClC,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,eAAe,EAAE,4BAkB7B,CAAC"}
package/dist/events.js ADDED
@@ -0,0 +1,24 @@
1
+ import { ConnectionEventError, headerValue, stringField } from "@assemblyline-agents/core";
2
+ import { verifyGitHubAppWebhook } from "./github-app-api.js";
3
+ export const githubAppEvents = {
4
+ ingress(request, context) {
5
+ if (request.method !== "POST")
6
+ throw new ConnectionEventError("GitHub webhooks require POST.");
7
+ const verified = verifyGitHubAppWebhook({
8
+ env: context.env,
9
+ headers: request.headers,
10
+ body: request.body
11
+ });
12
+ const action = stringField(verified.payload, "action");
13
+ const event = verified.event === "push" ? "push" : action ? `${verified.event}.${action}` : verified.event;
14
+ const eventId = headerValue(request.headers, "x-github-delivery");
15
+ if (!eventId)
16
+ throw new ConnectionEventError("GitHub webhook delivery id is missing.");
17
+ return {
18
+ events: [{ event, eventId, payload: verified.payload }],
19
+ response: { status: 200, body: { ok: true } },
20
+ audit: verified.audit
21
+ };
22
+ }
23
+ };
24
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,WAAW,EAEZ,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAA6B,MAAM,qBAAqB,CAAC;AAExF,MAAM,CAAC,MAAM,eAAe,GAAiC;IAC3D,OAAO,CAAC,OAAO,EAAE,OAAO;QACtB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,IAAI,oBAAoB,CAAC,+BAA+B,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAG,sBAAsB,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,GAA2B;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3G,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,oBAAoB,CAAC,wCAAwC,CAAC,CAAC;QACvF,OAAO;YACL,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvD,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YAC7C,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { type JsonObject } from "@assemblyline-agents/core";
2
+ export declare const GITHUB_API_VERSION = "2022-11-28";
3
+ export declare const GITHUB_INSTALLATION_TOKEN_TTL_MS: number;
4
+ export type GitHubRepositorySelection = "all" | "selected";
5
+ export interface GitHubAppEnvironment {
6
+ GITHUB_APP_ID?: string;
7
+ GITHUB_APP_SLUG?: string;
8
+ GITHUB_APP_PRIVATE_KEY?: string;
9
+ GITHUB_APP_CLIENT_ID?: string;
10
+ GITHUB_APP_CLIENT_SECRET?: string;
11
+ GITHUB_APP_WEBHOOK_SECRET?: string;
12
+ GITHUB_APP_INSTALLATION_ID?: string;
13
+ GITHUB_API_URL?: string;
14
+ GITHUB_OAUTH_URL?: string;
15
+ }
16
+ export interface GitHubAppIdentityConfig {
17
+ appId: string;
18
+ privateKey: string;
19
+ apiUrl: string;
20
+ }
21
+ export interface GitHubAppConfig extends GitHubAppIdentityConfig {
22
+ appSlug: string;
23
+ clientId: string;
24
+ clientSecret: string;
25
+ oauthUrl: string;
26
+ }
27
+ export interface GitHubInstallationGrant {
28
+ installationId: number;
29
+ account: string;
30
+ repositorySelection: GitHubRepositorySelection;
31
+ repositoryCount: number;
32
+ verifiedAt: string;
33
+ }
34
+ export interface MintedGitHubInstallationToken {
35
+ token: string;
36
+ expiresAt: number;
37
+ installationId: number;
38
+ account: string;
39
+ repositorySelection: GitHubRepositorySelection;
40
+ permissions: Record<string, string>;
41
+ verifiedAt: string;
42
+ issuedAt: string;
43
+ requestId?: string;
44
+ }
45
+ export declare class GitHubAppError extends Error {
46
+ readonly code: string;
47
+ constructor(code: string, message: string);
48
+ }
49
+ export declare function githubAppIdentityConfig(env: GitHubAppEnvironment): GitHubAppIdentityConfig;
50
+ export declare function githubAppConfig(env: GitHubAppEnvironment): GitHubAppConfig;
51
+ export declare function createGitHubAppJwt(env: GitHubAppEnvironment, nowSeconds?: number): string;
52
+ export declare function githubAppInstallUrl(config: Pick<GitHubAppConfig, "appSlug">, state: string): string;
53
+ export declare function resolveGitHubInstallationGrant(input: {
54
+ env: GitHubAppEnvironment;
55
+ installationId: number;
56
+ code: string;
57
+ redirectUri: string;
58
+ fetch?: typeof fetch;
59
+ now?: number;
60
+ }): Promise<GitHubInstallationGrant>;
61
+ export declare function mintGitHubInstallationToken(input: {
62
+ env: GitHubAppEnvironment;
63
+ installationId: number;
64
+ fetch?: typeof fetch;
65
+ now?: number;
66
+ }): Promise<MintedGitHubInstallationToken>;
67
+ export declare function verifyGitHubAppWebhook(input: {
68
+ env: GitHubAppEnvironment;
69
+ headers: Record<string, string>;
70
+ body: string;
71
+ now?: number;
72
+ }): {
73
+ event: string;
74
+ audit: JsonObject;
75
+ payload: JsonObject;
76
+ };
77
+ //# sourceMappingURL=github-app-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-api.d.ts","sourceRoot":"","sources":["../src/github-app-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,292 @@
1
+ import { createHmac, createSign, timingSafeEqual } from "node:crypto";
2
+ import { ConnectionEventError } from "@assemblyline-agents/core";
3
+ import { fetchWithPolicy } from "@assemblyline-agents/runtime";
4
+ export const GITHUB_API_VERSION = "2022-11-28";
5
+ export const GITHUB_INSTALLATION_TOKEN_TTL_MS = 60 * 60_000;
6
+ export class GitHubAppError extends Error {
7
+ code;
8
+ constructor(code, message) {
9
+ super(message);
10
+ this.code = code;
11
+ this.name = "GitHubAppError";
12
+ }
13
+ }
14
+ export function githubAppIdentityConfig(env) {
15
+ const appId = env.GITHUB_APP_ID?.trim() ?? "";
16
+ const privateKey = env.GITHUB_APP_PRIVATE_KEY?.trim().replace(/\\n/gu, "\n") ?? "";
17
+ const missing = [
18
+ ...(!appId ? ["GITHUB_APP_ID"] : []),
19
+ ...(!privateKey ? ["GITHUB_APP_PRIVATE_KEY"] : [])
20
+ ];
21
+ if (missing.length > 0) {
22
+ throw new GitHubAppError("github_app_not_configured", `GitHub App host configuration is missing: ${missing.join(", ")}.`);
23
+ }
24
+ return {
25
+ appId,
26
+ privateKey,
27
+ apiUrl: (env.GITHUB_API_URL?.trim() || "https://api.github.com").replace(/\/+$/u, "")
28
+ };
29
+ }
30
+ export function githubAppConfig(env) {
31
+ const identity = githubAppIdentityConfig(env);
32
+ const appSlug = env.GITHUB_APP_SLUG?.trim() ?? "";
33
+ const clientId = env.GITHUB_APP_CLIENT_ID?.trim() ?? "";
34
+ const clientSecret = env.GITHUB_APP_CLIENT_SECRET?.trim() ?? "";
35
+ const missing = [
36
+ ...(!appSlug ? ["GITHUB_APP_SLUG"] : []),
37
+ ...(!clientId ? ["GITHUB_APP_CLIENT_ID"] : []),
38
+ ...(!clientSecret ? ["GITHUB_APP_CLIENT_SECRET"] : [])
39
+ ];
40
+ if (missing.length > 0) {
41
+ throw new GitHubAppError("github_app_not_configured", `Interactive GitHub App authorization is missing: ${missing.join(", ")}.`);
42
+ }
43
+ if (!/^[A-Za-z0-9-]+$/u.test(appSlug)) {
44
+ throw new GitHubAppError("github_app_slug_invalid", "GITHUB_APP_SLUG is invalid.");
45
+ }
46
+ return {
47
+ ...identity,
48
+ appSlug,
49
+ clientId,
50
+ clientSecret,
51
+ oauthUrl: (env.GITHUB_OAUTH_URL?.trim() || "https://github.com/login/oauth/access_token").replace(/\/+$/u, "")
52
+ };
53
+ }
54
+ export function createGitHubAppJwt(env, nowSeconds = Math.floor(Date.now() / 1_000)) {
55
+ const { appId, privateKey } = githubAppIdentityConfig(env);
56
+ const header = base64Url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
57
+ const payload = base64Url(JSON.stringify({
58
+ iat: nowSeconds - 60,
59
+ exp: nowSeconds + 9 * 60,
60
+ iss: appId
61
+ }));
62
+ const signingInput = `${header}.${payload}`;
63
+ let signature;
64
+ try {
65
+ signature = createSign("RSA-SHA256").update(signingInput).sign(privateKey);
66
+ }
67
+ catch {
68
+ throw new GitHubAppError("github_app_private_key_invalid", "GITHUB_APP_PRIVATE_KEY is not a valid RSA private key.");
69
+ }
70
+ return `${signingInput}.${base64Url(signature)}`;
71
+ }
72
+ export function githubAppInstallUrl(config, state) {
73
+ const url = new URL(`https://github.com/apps/${config.appSlug}/installations/new`);
74
+ url.searchParams.set("state", state);
75
+ return url.toString();
76
+ }
77
+ export async function resolveGitHubInstallationGrant(input) {
78
+ const config = githubAppConfig(input.env);
79
+ const fetchImpl = input.fetch ?? fetch;
80
+ const installation = await fetchInstallation(config, input.installationId, fetchImpl, input.now);
81
+ const live = requireLiveInstallation(config, installation, input.installationId);
82
+ const userToken = await exchangeGitHubUserCode(config, input.code, input.redirectUri, fetchImpl);
83
+ const repositoryCount = await countUserInstallationRepositories(config, input.installationId, userToken, fetchImpl);
84
+ return {
85
+ installationId: input.installationId,
86
+ account: live.account,
87
+ repositorySelection: live.repositorySelection,
88
+ repositoryCount,
89
+ verifiedAt: new Date(input.now ?? Date.now()).toISOString()
90
+ };
91
+ }
92
+ export async function mintGitHubInstallationToken(input) {
93
+ const config = githubAppIdentityConfig(input.env);
94
+ const fetchImpl = input.fetch ?? fetch;
95
+ const now = input.now ?? Date.now();
96
+ const installation = await fetchInstallation(config, input.installationId, fetchImpl, now);
97
+ const live = requireLiveInstallation(config, installation, input.installationId);
98
+ const minted = await githubJson(config, fetchImpl, `/app/installations/${input.installationId}/access_tokens`, {
99
+ method: "POST",
100
+ headers: githubHeaders(githubJwt(config, now)),
101
+ body: JSON.stringify({})
102
+ });
103
+ const token = stringValue(minted.value.token);
104
+ const expiresAt = Date.parse(stringValue(minted.value.expires_at));
105
+ if (!token)
106
+ throw new GitHubAppError("github_installation_token_missing", "GitHub did not return an installation token.");
107
+ if (!Number.isFinite(expiresAt) || expiresAt <= now + 50 * 60_000 || expiresAt > now + GITHUB_INSTALLATION_TOKEN_TTL_MS + 60_000) {
108
+ throw new GitHubAppError("github_installation_token_expiry_invalid", "GitHub returned a missing, expired, or non-one-hour installation token.");
109
+ }
110
+ return {
111
+ token,
112
+ expiresAt,
113
+ installationId: input.installationId,
114
+ account: live.account,
115
+ repositorySelection: live.repositorySelection,
116
+ permissions: stringRecord(minted.value.permissions),
117
+ verifiedAt: new Date(now).toISOString(),
118
+ issuedAt: new Date(now).toISOString(),
119
+ ...(minted.requestId ? { requestId: minted.requestId } : {})
120
+ };
121
+ }
122
+ export function verifyGitHubAppWebhook(input) {
123
+ const config = githubAppIdentityConfig(input.env);
124
+ const webhookSecret = input.env.GITHUB_APP_WEBHOOK_SECRET?.trim();
125
+ if (!webhookSecret)
126
+ throw new ConnectionEventError("GitHub webhook secret is not configured.", 403);
127
+ const signature = input.headers["x-hub-signature-256"]?.trim() ?? "";
128
+ if (!signature.startsWith("sha256="))
129
+ throw new ConnectionEventError("GitHub webhook signature is missing.", 401);
130
+ const expected = `sha256=${createHmac("sha256", webhookSecret).update(input.body).digest("hex")}`;
131
+ const actualBytes = Buffer.from(signature);
132
+ const expectedBytes = Buffer.from(expected);
133
+ if (actualBytes.length !== expectedBytes.length || !timingSafeEqual(actualBytes, expectedBytes)) {
134
+ throw new ConnectionEventError("GitHub webhook signature is invalid.", 401);
135
+ }
136
+ let payload;
137
+ try {
138
+ payload = recordValue(JSON.parse(input.body)) ?? {};
139
+ }
140
+ catch {
141
+ throw new ConnectionEventError("GitHub webhook body must be valid JSON.", 400);
142
+ }
143
+ const event = input.headers["x-github-event"]?.trim() || "unknown";
144
+ const installation = recordValue(payload.installation);
145
+ const installationId = numericId(installation?.id);
146
+ if (!installationId)
147
+ throw new ConnectionEventError("GitHub webhook is missing an installation id.", 400);
148
+ const appId = stringValue(installation?.app_id);
149
+ if (!appId || appId !== config.appId)
150
+ throw new ConnectionEventError("GitHub webhook App identity does not match this deployment.", 403);
151
+ const account = stringValue(recordValue(installation?.account)?.login) || "unknown";
152
+ const audit = {
153
+ deliveryId: input.headers["x-github-delivery"]?.trim() || "unknown",
154
+ event,
155
+ action: stringValue(payload.action) || "unknown",
156
+ installationId,
157
+ account,
158
+ repositorySelection: stringValue(installation?.repository_selection) || "unknown",
159
+ addedRepositories: repositoryNames(payload.repositories_added),
160
+ removedRepositories: repositoryNames(payload.repositories_removed),
161
+ receivedAt: new Date(input.now ?? Date.now()).toISOString()
162
+ };
163
+ return { event, audit, payload };
164
+ }
165
+ function requireLiveInstallation(config, installation, expectedId) {
166
+ if (numericId(installation.id) !== expectedId) {
167
+ throw new GitHubAppError("github_installation_mismatch", "GitHub resolved a different installation than the configured grant.");
168
+ }
169
+ if (stringValue(installation.app_id) !== config.appId) {
170
+ throw new GitHubAppError("github_installation_app_mismatch", "The GitHub installation belongs to a different App.");
171
+ }
172
+ if (installation.suspended_at !== null && installation.suspended_at !== undefined) {
173
+ throw new GitHubAppError("github_installation_suspended", "The GitHub App installation is suspended.");
174
+ }
175
+ const account = stringValue(recordValue(installation.account)?.login);
176
+ if (!account)
177
+ throw new GitHubAppError("github_installation_account_missing", "GitHub did not return the installation account.");
178
+ const repositorySelection = stringValue(installation.repository_selection);
179
+ if (repositorySelection !== "all" && repositorySelection !== "selected") {
180
+ throw new GitHubAppError("github_installation_repository_selection_invalid", "GitHub returned an invalid installation repository selection.");
181
+ }
182
+ return { account, repositorySelection };
183
+ }
184
+ async function fetchInstallation(config, installationId, fetchImpl, now = Date.now()) {
185
+ return (await githubJson(config, fetchImpl, `/app/installations/${installationId}`, {
186
+ headers: githubHeaders(githubJwt(config, now))
187
+ })).value;
188
+ }
189
+ async function exchangeGitHubUserCode(config, code, redirectUri, fetchImpl) {
190
+ if (!code.trim())
191
+ throw new GitHubAppError("github_oauth_code_missing", "GitHub App authorization did not return a code.");
192
+ const response = await fetchWithPolicy(fetchImpl, config.oauthUrl, {
193
+ method: "POST",
194
+ headers: {
195
+ accept: "application/json",
196
+ "content-type": "application/json",
197
+ "user-agent": "assembly-line-github-app"
198
+ },
199
+ body: JSON.stringify({
200
+ client_id: config.clientId,
201
+ client_secret: config.clientSecret,
202
+ code,
203
+ redirect_uri: redirectUri
204
+ })
205
+ });
206
+ const value = await responseJson(response);
207
+ const token = stringValue(value.access_token);
208
+ if (!response.ok || !token)
209
+ throw githubHttpError("github_oauth_exchange_failed", response, value);
210
+ return token;
211
+ }
212
+ async function countUserInstallationRepositories(config, installationId, userToken, fetchImpl) {
213
+ const response = await fetchWithPolicy(fetchImpl, `${config.apiUrl}/user/installations/${installationId}/repositories?per_page=1&page=1`, { headers: githubHeaders(userToken) });
214
+ const value = await responseJson(response);
215
+ if (!response.ok)
216
+ throw githubHttpError("github_user_installation_unverified", response, value);
217
+ const totalCount = Number(value.total_count);
218
+ if (Number.isSafeInteger(totalCount) && totalCount >= 0)
219
+ return totalCount;
220
+ return arrayValue(value.repositories).length;
221
+ }
222
+ async function githubJson(config, fetchImpl, path, init) {
223
+ const response = await fetchWithPolicy(fetchImpl, `${config.apiUrl}${path}`, init);
224
+ const value = await responseJson(response);
225
+ if (!response.ok)
226
+ throw githubHttpError("github_api_request_failed", response, value);
227
+ const requestId = response.headers.get("x-github-request-id")?.trim();
228
+ return { value, ...(requestId ? { requestId } : {}) };
229
+ }
230
+ function githubHttpError(code, response, value) {
231
+ const message = stringValue(value.message);
232
+ return new GitHubAppError(code, `GitHub request failed with HTTP ${response.status}${message ? `: ${message.slice(0, 300)}` : ""}.`);
233
+ }
234
+ async function responseJson(response) {
235
+ const text = await response.text();
236
+ if (!text)
237
+ return {};
238
+ try {
239
+ return recordValue(JSON.parse(text)) ?? {};
240
+ }
241
+ catch {
242
+ throw new GitHubAppError("github_response_invalid", `GitHub returned a non-JSON response with HTTP ${response.status}.`);
243
+ }
244
+ }
245
+ function githubHeaders(token) {
246
+ return {
247
+ accept: "application/vnd.github+json",
248
+ authorization: `Bearer ${token}`,
249
+ "content-type": "application/json",
250
+ "user-agent": "assembly-line-github-app",
251
+ "x-github-api-version": GITHUB_API_VERSION
252
+ };
253
+ }
254
+ function githubJwt(config, now) {
255
+ return createGitHubAppJwt({
256
+ GITHUB_APP_ID: config.appId,
257
+ GITHUB_APP_PRIVATE_KEY: config.privateKey,
258
+ GITHUB_API_URL: config.apiUrl
259
+ }, Math.floor(now / 1_000));
260
+ }
261
+ function repositoryNames(value) {
262
+ return arrayValue(value)
263
+ .map(recordValue)
264
+ .map((repository) => stringValue(repository?.full_name))
265
+ .filter((name) => Boolean(name));
266
+ }
267
+ function stringRecord(value) {
268
+ const record = recordValue(value);
269
+ if (!record)
270
+ return {};
271
+ return Object.fromEntries(Object.entries(record)
272
+ .filter((entry) => typeof entry[1] === "string"));
273
+ }
274
+ function numericId(value) {
275
+ const number = typeof value === "number" ? value : Number(value);
276
+ return Number.isSafeInteger(number) && number > 0 ? number : 0;
277
+ }
278
+ function stringValue(value) {
279
+ if (typeof value === "number" && Number.isFinite(value))
280
+ return String(value);
281
+ return typeof value === "string" ? value.trim() : "";
282
+ }
283
+ function recordValue(value) {
284
+ return Boolean(value && typeof value === "object" && !Array.isArray(value)) ? value : undefined;
285
+ }
286
+ function arrayValue(value) {
287
+ return Array.isArray(value) ? value : [];
288
+ }
289
+ function base64Url(value) {
290
+ return Buffer.from(value).toString("base64url");
291
+ }
292
+ //# sourceMappingURL=github-app-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-api.js","sourceRoot":"","sources":["../src/github-app-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type CredentialConnectionDefinition, type ConnectionEventSelection, type JsonObject } from "@assemblyline-agents/core";
2
+ export type GitHubAppInstallationMode = "user" | "environment";
3
+ export interface GitHubAppConnectionOptions {
4
+ /** User-installed grants are interactive. Environment installations belong to the deployment. */
5
+ installation?: GitHubAppInstallationMode;
6
+ /** Environment variable containing the installation id in environment mode. */
7
+ installationIdEnv?: string;
8
+ required?: boolean;
9
+ metadata?: JsonObject;
10
+ events?: ConnectionEventSelection;
11
+ }
12
+ export declare function defineGitHubAppConnection(options?: GitHubAppConnectionOptions): CredentialConnectionDefinition;
13
+ //# sourceMappingURL=github-app-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-connection.d.ts","sourceRoot":"","sources":["../src/github-app-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,UAAU,EAChB,MAAM,2BAA2B,CAAC;AAenC,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,aAAa,CAAC;AAE/D,MAAM,WAAW,0BAA0B;IACzC,iGAAiG;IACjG,YAAY,CAAC,EAAE,yBAAyB,CAAC;IACzC,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,MAAM,CAAC,EAAE,wBAAwB,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,8BAA8B,CAsFhC"}
@@ -0,0 +1,213 @@
1
+ import { ConnectionAuthorizationRequiredError, connectionPluginMetadata, defineConnectionPluginEvents, defineCredentialConnection, shellQuote } from "@assemblyline-agents/core";
2
+ import { GitHubAppError, githubAppConfig, githubAppInstallUrl, mintGitHubInstallationToken, resolveGitHubInstallationGrant } from "./github-app-api.js";
3
+ import { githubAppEvents } from "./events.js";
4
+ const GITHUB_APP_PLUGIN = connectionPluginMetadata("github-app");
5
+ const DEFAULT_INSTALLATION_ID_ENV = "GITHUB_APP_INSTALLATION_ID";
6
+ export function defineGitHubAppConnection(options = {}) {
7
+ const installation = options.installation ?? "user";
8
+ const installationIdEnv = options.installationIdEnv ?? DEFAULT_INSTALLATION_ID_ENV;
9
+ requireInstallationMode(installation);
10
+ requireEnvironmentName(installationIdEnv);
11
+ if (installation === "user" && options.installationIdEnv) {
12
+ throw new GitHubAppError("github_installation_mode_invalid", "installationIdEnv is available only for environment installations.");
13
+ }
14
+ const definition = defineCredentialConnection({
15
+ description: GITHUB_APP_PLUGIN.description,
16
+ required: options.required ?? true,
17
+ subject: installation,
18
+ metadata: {
19
+ provider: "github",
20
+ plugin: "@assemblyline-agents/github",
21
+ mode: "github-app-sandbox",
22
+ installation,
23
+ ...(installation === "environment" ? { installationIdEnv } : {}),
24
+ ...(options.metadata ?? {})
25
+ },
26
+ auth: (context) => installation === "environment"
27
+ ? environmentAuthorization(context.env, installationIdEnv)
28
+ : userAuthorization(context.env, context.fetch ?? fetch),
29
+ materialize: {
30
+ resolve: async (context) => {
31
+ if (!context.agentId) {
32
+ throw new GitHubAppError("github_agent_id_required", "GitHub sandbox credentials require a stable Assembly Line agent id.");
33
+ }
34
+ if (!context.run.id) {
35
+ throw new GitHubAppError("github_run_id_required", "GitHub sandbox credentials require a durable run id.");
36
+ }
37
+ const grant = await context.getToken();
38
+ const installationId = positiveInteger(grant.credential?.installationId);
39
+ if (!installationId || grant.token !== `github-installation:${installationId}`) {
40
+ throw new GitHubAppError("github_installation_grant_invalid", "The stored GitHub App installation grant is missing or mismatched.");
41
+ }
42
+ const minted = await mintGitHubInstallationToken({
43
+ env: context.env,
44
+ installationId,
45
+ fetch: context.fetch
46
+ });
47
+ const helperPath = credentialHelperPath(context.connectionName);
48
+ const ghHostsPath = ghHostsFilePath(context.connectionName);
49
+ return {
50
+ files: [
51
+ {
52
+ path: helperPath,
53
+ content: credentialHelper(minted),
54
+ mode: 0o700
55
+ },
56
+ {
57
+ path: ghHostsPath,
58
+ content: ghHostsFile(minted),
59
+ mode: 0o600
60
+ }
61
+ ],
62
+ commands: [
63
+ "git config --global --replace-all url.https://github.com/.insteadOf git@github.com:",
64
+ "git config --global --add url.https://github.com/.insteadOf ssh://git@github.com/",
65
+ "git config --global credential.interactive never",
66
+ "git config --global --unset-all credential.https://github.com.helper || true",
67
+ `git config --global --add credential.https://github.com.helper ${shellQuote(helperPath)}`,
68
+ "mkdir -p \"$HOME/.config/gh\"",
69
+ `ln -sfn ${shellQuote(ghHostsPath)} \"$HOME/.config/gh/hosts.yml\"`
70
+ ],
71
+ audit: {
72
+ principal: context.principal.type,
73
+ ...(context.principal.type === "user" ? { userId: context.principal.id } : {}),
74
+ agentId: context.agentId,
75
+ runId: context.run.id,
76
+ installationId: minted.installationId,
77
+ account: minted.account,
78
+ repositorySelection: minted.repositorySelection,
79
+ permissions: minted.permissions,
80
+ verifiedAt: minted.verifiedAt,
81
+ issuedAt: minted.issuedAt,
82
+ expiresAt: new Date(minted.expiresAt).toISOString(),
83
+ ...(minted.requestId ? { requestId: minted.requestId } : {})
84
+ }
85
+ };
86
+ }
87
+ }
88
+ });
89
+ const events = defineConnectionPluginEvents(GITHUB_APP_PLUGIN, options.events, githubAppEvents);
90
+ if (events)
91
+ definition.events = events;
92
+ return definition;
93
+ }
94
+ function userAuthorization(env, fetchImpl) {
95
+ const config = githubAppConfig(env);
96
+ return {
97
+ principalType: "user",
98
+ displayName: "GitHub App installation",
99
+ getToken: async () => {
100
+ throw new ConnectionAuthorizationRequiredError("github-app", {
101
+ reason: "github_app_installation_required",
102
+ message: "Install and authorize the GitHub App for the repositories selected in GitHub."
103
+ });
104
+ },
105
+ startAuthorization: async ({ state }) => ({
106
+ challenge: {
107
+ url: githubAppInstallUrl(config, state),
108
+ instructions: "Install the GitHub App, choose its repository access in GitHub, then approve user authorization."
109
+ }
110
+ }),
111
+ completeAuthorization: async ({ callback, callbackUrl }) => {
112
+ const installationId = positiveInteger(callback.params.installation_id);
113
+ if (!installationId) {
114
+ throw new GitHubAppError("github_installation_id_missing", "GitHub App authorization did not return an installation id.");
115
+ }
116
+ const grant = await resolveGitHubInstallationGrant({
117
+ env,
118
+ installationId,
119
+ code: callback.params.code ?? "",
120
+ redirectUri: callbackUrl,
121
+ fetch: fetchImpl
122
+ });
123
+ return installationGrantToken(grant);
124
+ }
125
+ };
126
+ }
127
+ function environmentAuthorization(env, installationIdEnv) {
128
+ return {
129
+ principalType: "app",
130
+ displayName: "GitHub App installation",
131
+ getToken: async () => {
132
+ const installationId = positiveInteger(env[installationIdEnv]);
133
+ if (!installationId) {
134
+ throw new GitHubAppError("github_installation_id_missing", `${installationIdEnv} must contain a positive GitHub App installation id.`);
135
+ }
136
+ return {
137
+ token: `github-installation:${installationId}`,
138
+ credential: { installationId }
139
+ };
140
+ }
141
+ };
142
+ }
143
+ function installationGrantToken(grant) {
144
+ return {
145
+ // This non-secret marker lets Assembly Line reuse its encrypted,
146
+ // user-scoped grant store without persisting a provider token.
147
+ token: `github-installation:${grant.installationId}`,
148
+ credential: {
149
+ installationId: grant.installationId,
150
+ account: grant.account,
151
+ repositorySelection: grant.repositorySelection,
152
+ repositoryCount: grant.repositoryCount,
153
+ verifiedAt: grant.verifiedAt
154
+ }
155
+ };
156
+ }
157
+ function credentialRoot(connectionName) {
158
+ const safeName = connectionName.replace(/[^A-Za-z0-9_.-]/gu, "-");
159
+ return `/workspace/.assembly-line/credentials/${safeName}`;
160
+ }
161
+ function credentialHelperPath(connectionName) {
162
+ return `${credentialRoot(connectionName)}/git-credential-github-app`;
163
+ }
164
+ function ghHostsFilePath(connectionName) {
165
+ return `${credentialRoot(connectionName)}/gh/hosts.yml`;
166
+ }
167
+ function credentialHelper(minted) {
168
+ return [
169
+ "#!/bin/sh",
170
+ "protocol=",
171
+ "host=",
172
+ "while IFS='=' read -r key value; do",
173
+ " case \"$key\" in",
174
+ " protocol) protocol=$value ;;",
175
+ " host) host=$value ;;",
176
+ " esac",
177
+ "done",
178
+ "[ \"$protocol\" = https ] || exit 0",
179
+ "[ \"$host\" = github.com ] || exit 0",
180
+ `printf '%s\\n' 'username=x-access-token' ${shellLiteral(`password=${minted.token}`)}`,
181
+ ""
182
+ ].join("\n");
183
+ }
184
+ function ghHostsFile(minted) {
185
+ return [
186
+ "github.com:",
187
+ ` oauth_token: ${yamlSingleQuoted(minted.token)}`,
188
+ " git_protocol: https",
189
+ " user: x-access-token",
190
+ ""
191
+ ].join("\n");
192
+ }
193
+ function shellLiteral(value) {
194
+ return `'${value.replace(/'/gu, `'"'"'`)}'`;
195
+ }
196
+ function yamlSingleQuoted(value) {
197
+ return `'${value.replace(/'/gu, "''")}'`;
198
+ }
199
+ function requireInstallationMode(value) {
200
+ if (value === "user" || value === "environment")
201
+ return value;
202
+ throw new GitHubAppError("github_installation_mode_invalid", "GitHub App installation must be user or environment.");
203
+ }
204
+ function requireEnvironmentName(value) {
205
+ if (/^[A-Z_][A-Z0-9_]*$/u.test(value))
206
+ return value;
207
+ throw new GitHubAppError("github_installation_id_env_invalid", "installationIdEnv must be an uppercase environment variable name.");
208
+ }
209
+ function positiveInteger(value) {
210
+ const parsed = typeof value === "number" ? value : Number(value);
211
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : 0;
212
+ }
213
+ //# sourceMappingURL=github-app-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-connection.js","sourceRoot":"","sources":["../src/github-app-connection.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,20 +1,7 @@
1
- import { type ConnectionDefinition, type McpPluginConnectionOptions } from "@assemblyline-agents/core";
2
- export declare const GITHUB_APP_REQUIRED_ENV: readonly ["GITHUB_APP_ID", "GITHUB_PRIVATE_KEY"];
3
- export interface GitHubConnectionOptions {
4
- name?: string;
5
- description?: string;
6
- scopes?: string[];
7
- capabilities?: string[];
8
- required?: boolean;
9
- }
10
- export interface GitHubAppEnvironment {
11
- GITHUB_APP_ID?: string;
12
- GITHUB_PRIVATE_KEY?: string;
13
- GITHUB_API_URL?: string;
14
- GITHUB_TOKEN?: string;
15
- }
16
- /** GitHub App installation connection for authenticated repository tooling. */
17
- export declare function defineGitHubConnection(options?: GitHubConnectionOptions): ConnectionDefinition;
1
+ import { type McpPluginConnectionOptions } from "@assemblyline-agents/core";
2
+ import { type GitHubAppEnvironment } from "./github-app-api.js";
3
+ export * from "./github-app-api.js";
4
+ export * from "./github-app-connection.js";
18
5
  export type GitHubMcpConnectionOptions = McpPluginConnectionOptions;
19
6
  export declare function defineGitHubMcpConnection(options: GitHubMcpConnectionOptions): import("@assemblyline-agents/core").McpHttpClientConnectionDefinition;
20
7
  export declare const assemblyLinePlugin: import("@assemblyline-agents/core").PluginModule;
@@ -24,7 +11,6 @@ export declare function createGitHubInstallationToken(options: {
24
11
  fetch?: typeof fetch;
25
12
  }): Promise<{
26
13
  token: string;
27
- expiresAt?: string;
14
+ expiresAt: string;
28
15
  }>;
29
- export declare function createGitHubAppJwt(env: GitHubAppEnvironment, nowSeconds?: number): string;
30
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,oBAAoB,EAEzB,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,uBAAuB,kDAAmD,CAAC;AAExF,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,oBAAoB,CAclG;AAID,MAAM,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAEpE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,yEAE5E;AAED,eAAO,MAAM,kBAAkB,kDAAqD,CAAC;AAErF,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,GAAG,EAAE,oBAAoB,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE,UAAU,SAAgC,GAAG,MAAM,CAahH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,0BAA0B,EAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAA+B,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE7F,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAK3C,MAAM,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAEpE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,yEAE5E;AAED,eAAO,MAAM,kBAAkB,kDAAwE,CAAC;AAExG,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,GAAG,EAAE,oBAAoB,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhD"}
package/dist/index.js CHANGED
@@ -1,92 +1,15 @@
1
- import { createSign } from "node:crypto";
2
- import { adapter, connectionPluginMetadata, defineConnection, defineMcpPluginConnection, definePlugin } from "@assemblyline-agents/core";
3
- import { fetchWithPolicy } from "@assemblyline-agents/runtime";
4
- export const GITHUB_APP_REQUIRED_ENV = ["GITHUB_APP_ID", "GITHUB_PRIVATE_KEY"];
5
- /** GitHub App installation connection for authenticated repository tooling. */
6
- export function defineGitHubConnection(options = {}) {
7
- return defineConnection({
8
- description: options.description ?? "GitHub App installation connection for repository, issue, pull request, and workflow capabilities.",
9
- provider: "github",
10
- binding: adapter("github-app"),
11
- scopes: options.scopes ?? ["issues:write", "pull_requests:write", "contents:read"],
12
- capabilities: options.capabilities ?? ["issues", "pull_requests", "repository"],
13
- subject: "installation",
14
- required: options.required ?? false,
15
- metadata: {
16
- appAuth: "installation-token",
17
- ...(options.name ? { name: options.name } : {})
18
- }
19
- });
20
- }
1
+ import { connectionPluginMetadata, defineMcpPluginConnection, definePlugin } from "@assemblyline-agents/core";
2
+ import { mintGitHubInstallationToken } from "./github-app-api.js";
3
+ export * from "./github-app-api.js";
4
+ export * from "./github-app-connection.js";
21
5
  const GITHUB_MCP_PLUGIN = connectionPluginMetadata("github");
6
+ const GITHUB_APP_PLUGIN = connectionPluginMetadata("github-app");
22
7
  export function defineGitHubMcpConnection(options) {
23
8
  return defineMcpPluginConnection(GITHUB_MCP_PLUGIN, options);
24
9
  }
25
- export const assemblyLinePlugin = definePlugin({ connections: [GITHUB_MCP_PLUGIN] });
10
+ export const assemblyLinePlugin = definePlugin({ connections: [GITHUB_MCP_PLUGIN, GITHUB_APP_PLUGIN] });
26
11
  export async function createGitHubInstallationToken(options) {
27
- const apiUrl = options.env.GITHUB_API_URL ?? "https://api.github.com";
28
- const jwt = createGitHubAppJwt(options.env);
29
- const response = await fetchWithPolicy(options.fetch ?? fetch, `${apiUrl}/app/installations/${options.installationId}/access_tokens`, {
30
- method: "POST",
31
- headers: githubHeaders(jwt)
32
- });
33
- const parsed = await parseJson(response);
34
- if (!response.ok)
35
- throw new Error(`GitHub installation token request failed: ${response.status} ${JSON.stringify(parsed)}`);
36
- const record = recordValue(parsed);
37
- const token = stringValue(record?.token);
38
- if (!token)
39
- throw new Error("GitHub installation token response did not include a token.");
40
- const out = { token };
41
- const expiresAt = stringValue(record?.expires_at);
42
- if (expiresAt)
43
- out.expiresAt = expiresAt;
44
- return out;
45
- }
46
- export function createGitHubAppJwt(env, nowSeconds = Math.floor(Date.now() / 1000)) {
47
- const appId = env.GITHUB_APP_ID;
48
- const privateKey = env.GITHUB_PRIVATE_KEY?.replace(/\\n/g, "\n");
49
- if (!appId || !privateKey)
50
- throw new Error("GitHub App auth requires GITHUB_APP_ID and GITHUB_PRIVATE_KEY.");
51
- const header = base64Url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
52
- const payload = base64Url(JSON.stringify({
53
- iat: nowSeconds - 60,
54
- exp: nowSeconds + 9 * 60,
55
- iss: appId
56
- }));
57
- const signingInput = `${header}.${payload}`;
58
- const signature = createSign("RSA-SHA256").update(signingInput).sign(privateKey);
59
- return `${signingInput}.${base64Url(signature)}`;
60
- }
61
- function githubHeaders(token) {
62
- return {
63
- accept: "application/vnd.github+json",
64
- authorization: `Bearer ${token}`,
65
- "content-type": "application/json",
66
- "user-agent": "openeve-github-adapter",
67
- "x-github-api-version": "2022-11-28"
68
- };
69
- }
70
- function base64Url(value) {
71
- return Buffer.from(value).toString("base64url");
72
- }
73
- function stringValue(value) {
74
- return typeof value === "string" && value.length > 0 ? value : undefined;
75
- }
76
- function recordValue(value) {
77
- return Boolean(value && typeof value === "object" && !Array.isArray(value))
78
- ? value
79
- : undefined;
80
- }
81
- async function parseJson(response) {
82
- const text = await response.text();
83
- if (!text)
84
- return {};
85
- try {
86
- return JSON.parse(text);
87
- }
88
- catch {
89
- return { text };
90
- }
12
+ const minted = await mintGitHubInstallationToken(options);
13
+ return { token: minted.token, expiresAt: new Date(minted.expiresAt).toISOString() };
91
14
  }
92
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EAEb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,2BAA2B,EAA6B,MAAM,qBAAqB,CAAC;AAE7F,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAE3C,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,QAAQ,CAAE,CAAC;AAC9D,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,YAAY,CAAE,CAAC;AAIlE,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,OAAO,yBAAyB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;AAExG,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,OAInD;IACC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AACtF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assemblyline-agents/github",
3
- "version": "2.0.0",
3
+ "version": "3.1.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9,13 +9,12 @@
9
9
  }
10
10
  },
11
11
  "dependencies": {
12
- "@assemblyline-agents/runtime": "2.0.0",
13
- "@assemblyline-agents/core": "2.0.0"
12
+ "@assemblyline-agents/core": "3.1.0",
13
+ "@assemblyline-agents/runtime": "3.1.0"
14
14
  },
15
15
  "description": "Official Assembly Line GitHub connection plugin.",
16
16
  "files": [
17
- "dist",
18
- "skills"
17
+ "dist"
19
18
  ],
20
19
  "engines": {
21
20
  "node": ">=22.19.0"
@@ -1,8 +0,0 @@
1
- ---
2
- name: github
3
- description: Use configured GitHub MCP tools for repositories, issues, pull requests, and Actions.
4
- ---
5
- # GitHub
6
- Resolve the owner and repository before searching. Read the current issue, pull request, review, or workflow state before proposing a change.
7
-
8
- The deployment owner configures the GitHub OAuth application or token. The scaffold is read-only; issue, pull request, repository, and workflow mutations require writes to be enabled with the configured approval gate.