@framers/agentos-ext-github 0.1.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -1
- package/dist/GitHubRepoIndexer.d.ts +20 -8
- package/dist/GitHubRepoIndexer.d.ts.map +1 -1
- package/dist/GitHubRepoIndexer.js +11 -6
- package/dist/GitHubRepoIndexer.js.map +1 -1
- package/dist/__tests__/app.test.d.ts +7 -0
- package/dist/__tests__/app.test.d.ts.map +1 -0
- package/dist/__tests__/app.test.js +248 -0
- package/dist/__tests__/app.test.js.map +1 -0
- package/dist/__tests__/documents.test.d.ts +7 -0
- package/dist/__tests__/documents.test.d.ts.map +1 -0
- package/dist/__tests__/documents.test.js +235 -0
- package/dist/__tests__/documents.test.js.map +1 -0
- package/dist/__tests__/indexer.test.js +14 -0
- package/dist/__tests__/indexer.test.js.map +1 -1
- package/dist/app/credential.d.ts +43 -0
- package/dist/app/credential.d.ts.map +1 -0
- package/dist/app/credential.js +74 -0
- package/dist/app/credential.js.map +1 -0
- package/dist/app/http.d.ts +61 -0
- package/dist/app/http.d.ts.map +1 -0
- package/dist/app/http.js +128 -0
- package/dist/app/http.js.map +1 -0
- package/dist/app/installations.d.ts +48 -0
- package/dist/app/installations.d.ts.map +1 -0
- package/dist/app/installations.js +61 -0
- package/dist/app/installations.js.map +1 -0
- package/dist/app/reconcile.d.ts +61 -0
- package/dist/app/reconcile.d.ts.map +1 -0
- package/dist/app/reconcile.js +89 -0
- package/dist/app/reconcile.js.map +1 -0
- package/dist/app/userFlow.d.ts +43 -0
- package/dist/app/userFlow.d.ts.map +1 -0
- package/dist/app/userFlow.js +54 -0
- package/dist/app/userFlow.js.map +1 -0
- package/dist/app/webhook.d.ts +15 -0
- package/dist/app/webhook.d.ts.map +1 -0
- package/dist/app/webhook.js +23 -0
- package/dist/app/webhook.js.map +1 -0
- package/dist/documents/GitHubDocumentsConnector.d.ts +80 -0
- package/dist/documents/GitHubDocumentsConnector.d.ts.map +1 -0
- package/dist/documents/GitHubDocumentsConnector.js +158 -0
- package/dist/documents/GitHubDocumentsConnector.js.map +1 -0
- package/dist/documents/index.d.ts +24 -0
- package/dist/documents/index.d.ts.map +1 -0
- package/dist/documents/index.js +24 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/tree.d.ts +71 -0
- package/dist/documents/tree.d.ts.map +1 -0
- package/dist/documents/tree.js +115 -0
- package/dist/documents/tree.js.map +1 -0
- package/manifest.json +5 -3
- package/package.json +17 -4
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `GitHubDocumentsConnector` over a fetch stand-in that answers a repository's branch, trees and raw
|
|
3
|
+
* files and records each request: the documentation filter, a truncated tree read by subtree within its request
|
|
4
|
+
* budget, a listing kept for a commit, raw reads with their attribution and their cap, and a push compared by its tree.
|
|
5
|
+
*/
|
|
6
|
+
import { generateKeyPairSync } from 'node:crypto';
|
|
7
|
+
import { describe, expect, it } from 'vitest';
|
|
8
|
+
import { GitHubAppCredential, GitHubDocumentsConnector, TreeTooLarge } from '../documents/index.js';
|
|
9
|
+
/** A JSON answer. */
|
|
10
|
+
function json(body, status = 200) {
|
|
11
|
+
return new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
|
|
12
|
+
}
|
|
13
|
+
/** A tree answer as GitHub gives it. */
|
|
14
|
+
function tree(sha, entries, truncated = false) {
|
|
15
|
+
return json({ sha, truncated, tree: entries.map((entry) => ({ mode: entry.type === 'tree' ? '040000' : '100644', ...entry })) });
|
|
16
|
+
}
|
|
17
|
+
const BASE = 'https://stand-in.test';
|
|
18
|
+
const INSTALLATION = 5;
|
|
19
|
+
const HANDBOOK = { id: 77, fullName: 'acme-team/handbook', defaultBranch: 'main' };
|
|
20
|
+
const LARGE = { id: 78, fullName: 'acme-team/large', defaultBranch: 'main' };
|
|
21
|
+
const C1 = '1'.repeat(40);
|
|
22
|
+
const C2 = '2'.repeat(40);
|
|
23
|
+
const C3 = '3'.repeat(40);
|
|
24
|
+
const CL = 'f'.repeat(40);
|
|
25
|
+
const AGENDA = '# Agenda\n\n1. The venue\n2. The budget\n';
|
|
26
|
+
const PDF = new TextEncoder().encode('%PDF-1.4\n% a test file\n');
|
|
27
|
+
const LONG_CHUNKS = 3;
|
|
28
|
+
const LONG_CHUNK_BYTES = 600_000;
|
|
29
|
+
/** The handbook at C1: documentation, code, a file past the default cap, and built and vendored folders. */
|
|
30
|
+
const HANDBOOK_C1 = [
|
|
31
|
+
{ path: 'README.md', type: 'blob', sha: 'r1', size: 120 },
|
|
32
|
+
{ path: 'dist', type: 'tree', sha: 'td' },
|
|
33
|
+
{ path: 'dist/z.md', type: 'blob', sha: 'z1', size: 10 },
|
|
34
|
+
{ path: 'docs', type: 'tree', sha: 'tdocs' },
|
|
35
|
+
{ path: 'docs/agenda.md', type: 'blob', sha: 'a1', size: 300 },
|
|
36
|
+
{ path: 'docs/big.md', type: 'blob', sha: 'g1', size: 12 * 1024 * 1024 },
|
|
37
|
+
{ path: 'docs/budget.pdf', type: 'blob', sha: 'b1', size: 2048 },
|
|
38
|
+
{ path: 'node_modules/x/README.md', type: 'blob', sha: 'n1', size: 10 },
|
|
39
|
+
{ path: 'src/index.ts', type: 'blob', sha: 's1', size: 50 },
|
|
40
|
+
{ path: 'vendor/y.md', type: 'blob', sha: 'v1', size: 10 },
|
|
41
|
+
];
|
|
42
|
+
/** The handbook at C2: the agenda changed, an old page dropped by a force push. */
|
|
43
|
+
const HANDBOOK_C2 = [
|
|
44
|
+
{ path: 'README.md', type: 'blob', sha: 'r1', size: 120 },
|
|
45
|
+
{ path: 'docs/agenda.md', type: 'blob', sha: 'a2', size: 320 },
|
|
46
|
+
{ path: 'docs/budget.pdf', type: 'blob', sha: 'b1', size: 2048 },
|
|
47
|
+
];
|
|
48
|
+
/** A stand-in GitHub holding the two repositories; `pulled` counts the bytes a capped read drew from its stream. */
|
|
49
|
+
function github() {
|
|
50
|
+
const seen = [];
|
|
51
|
+
const long = { pulled: 0, cancelled: false };
|
|
52
|
+
const fetchImpl = async (input, init) => {
|
|
53
|
+
const href = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
|
|
54
|
+
seen.push({ method: init?.method ?? 'GET', url: href, headers: new Headers(init?.headers) });
|
|
55
|
+
const url = new URL(href);
|
|
56
|
+
const path = url.pathname;
|
|
57
|
+
const recursive = url.searchParams.get('recursive') === '1';
|
|
58
|
+
if (path === `/app/installations/${INSTALLATION}/access_tokens`) {
|
|
59
|
+
return json({ token: 'ghs_documents', expires_at: new Date(Date.now() + 3_600_000).toISOString() }, 201);
|
|
60
|
+
}
|
|
61
|
+
if (path === '/repos/acme-team/handbook/branches/main')
|
|
62
|
+
return json({ name: 'main', commit: { sha: C1 } });
|
|
63
|
+
if (path === `/repos/acme-team/handbook/git/trees/${C1}` && recursive)
|
|
64
|
+
return tree(C1, HANDBOOK_C1);
|
|
65
|
+
if (path === `/repos/acme-team/handbook/git/trees/${C2}` && recursive)
|
|
66
|
+
return tree(C2, HANDBOOK_C2);
|
|
67
|
+
if (path === '/repos/acme-team/handbook/contents/docs/agenda.md' && url.searchParams.get('ref') === C1)
|
|
68
|
+
return new Response(AGENDA);
|
|
69
|
+
if (path === '/repos/acme-team/handbook/contents/docs/budget.pdf' && url.searchParams.get('ref') === C1)
|
|
70
|
+
return new Response(PDF);
|
|
71
|
+
if (path === '/repos/acme-team/handbook/contents/docs/long.md' && url.searchParams.get('ref') === C1) {
|
|
72
|
+
let sent = 0;
|
|
73
|
+
const body = new ReadableStream({
|
|
74
|
+
pull(controller) {
|
|
75
|
+
if (sent === LONG_CHUNKS) {
|
|
76
|
+
controller.close();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
sent += 1;
|
|
80
|
+
long.pulled += LONG_CHUNK_BYTES;
|
|
81
|
+
controller.enqueue(new Uint8Array(LONG_CHUNK_BYTES).fill(0x61));
|
|
82
|
+
},
|
|
83
|
+
cancel() {
|
|
84
|
+
long.cancelled = true;
|
|
85
|
+
},
|
|
86
|
+
}, { highWaterMark: 0 });
|
|
87
|
+
return new Response(body);
|
|
88
|
+
}
|
|
89
|
+
if (path === '/repos/acme-team/large/branches/main')
|
|
90
|
+
return json({ name: 'main', commit: { sha: CL } });
|
|
91
|
+
if (path === `/repos/acme-team/large/git/trees/${CL}` && recursive) {
|
|
92
|
+
return tree(CL, [{ path: 'README.md', type: 'blob', sha: 'lr1', size: 90 }], true);
|
|
93
|
+
}
|
|
94
|
+
if (path === `/repos/acme-team/large/git/trees/${CL}`) {
|
|
95
|
+
return tree(CL, [
|
|
96
|
+
{ path: 'README.md', type: 'blob', sha: 'lr1', size: 90 },
|
|
97
|
+
{ path: 'docs', type: 'tree', sha: 'ldocs' },
|
|
98
|
+
{ path: 'guide.md', type: 'blob', sha: 'lg1', size: 400 },
|
|
99
|
+
{ path: 'node_modules', type: 'tree', sha: 'lnm' },
|
|
100
|
+
{ path: 'src', type: 'tree', sha: 'lsrc' },
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
if (path === '/repos/acme-team/large/git/trees/ldocs' && recursive) {
|
|
104
|
+
return tree('ldocs', [
|
|
105
|
+
{ path: 'agenda.md', type: 'blob', sha: 'la1', size: 300 },
|
|
106
|
+
{ path: 'deep', type: 'tree', sha: 'ldeep' },
|
|
107
|
+
{ path: 'deep/notes.md', type: 'blob', sha: 'ln1', size: 200 },
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
if (path === '/repos/acme-team/large/git/trees/lsrc' && recursive)
|
|
111
|
+
return tree('lsrc', [{ path: 'index.ts', type: 'blob', sha: 'ls1', size: 50 }]);
|
|
112
|
+
return json({ message: 'Not Found' }, 404);
|
|
113
|
+
};
|
|
114
|
+
return { fetchImpl, seen, long };
|
|
115
|
+
}
|
|
116
|
+
const keys = generateKeyPairSync('rsa', {
|
|
117
|
+
modulusLength: 2048,
|
|
118
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
119
|
+
privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
|
|
120
|
+
});
|
|
121
|
+
/** A connector to both repositories of one installation, on the stand-in. */
|
|
122
|
+
function connectorOn(stand, filter = {}) {
|
|
123
|
+
const credential = new GitHubAppCredential({ clientId: 'Iv23liTESTCLIENT', privateKey: keys.privateKey }, stand.fetchImpl, BASE);
|
|
124
|
+
return new GitHubDocumentsConnector(credential, INSTALLATION, [HANDBOOK, LARGE], filter, stand.fetchImpl, BASE);
|
|
125
|
+
}
|
|
126
|
+
/** The tree requests made, as their paths and queries after the repository. */
|
|
127
|
+
function treeRequests(seen) {
|
|
128
|
+
return seen.filter((request) => request.url.includes('/git/trees/')).map((request) => request.url.slice(request.url.indexOf('/git/trees/') + '/git/trees/'.length));
|
|
129
|
+
}
|
|
130
|
+
/** The read, or a failure naming the reason it is gone. */
|
|
131
|
+
function asRead(answer) {
|
|
132
|
+
if ('reason' in answer)
|
|
133
|
+
throw new Error(`answered gone: ${answer.reason}`);
|
|
134
|
+
return answer;
|
|
135
|
+
}
|
|
136
|
+
describe('GitHubDocumentsConnector', () => {
|
|
137
|
+
it("lists a repository's documentation at its default branch's head with the default filter", async () => {
|
|
138
|
+
const stand = github();
|
|
139
|
+
const listed = await connectorOn(stand).list({ ids: ['77'] });
|
|
140
|
+
expect(listed).toEqual({
|
|
141
|
+
items: [
|
|
142
|
+
{ id: '77:README.md', title: 'README.md', size: 120, version: `r1@${C1}` },
|
|
143
|
+
{ id: '77:docs/agenda.md', title: 'docs/agenda.md', size: 300, version: `a1@${C1}` },
|
|
144
|
+
{ id: '77:docs/budget.pdf', title: 'docs/budget.pdf', size: 2048, version: `b1@${C1}` },
|
|
145
|
+
],
|
|
146
|
+
gone: [],
|
|
147
|
+
});
|
|
148
|
+
const branchRead = stand.seen.find((request) => request.url.endsWith('/repos/acme-team/handbook/branches/main'));
|
|
149
|
+
expect(branchRead?.headers.get('authorization')).toBe('Bearer ghs_documents');
|
|
150
|
+
expect(treeRequests(stand.seen)).toEqual([`${C1}?recursive=1`]);
|
|
151
|
+
});
|
|
152
|
+
it('reads a truncated tree by subtree, never walking a skipped folder', async () => {
|
|
153
|
+
const stand = github();
|
|
154
|
+
const listing = await connectorOn(stand).listing(78, CL);
|
|
155
|
+
expect(listing).toEqual([
|
|
156
|
+
{ path: 'README.md', sha: 'lr1', size: 90 },
|
|
157
|
+
{ path: 'docs/agenda.md', sha: 'la1', size: 300 },
|
|
158
|
+
{ path: 'docs/deep/notes.md', sha: 'ln1', size: 200 },
|
|
159
|
+
{ path: 'guide.md', sha: 'lg1', size: 400 },
|
|
160
|
+
]);
|
|
161
|
+
expect(treeRequests(stand.seen)).toEqual([`${CL}?recursive=1`, CL, 'ldocs?recursive=1', 'lsrc?recursive=1']);
|
|
162
|
+
});
|
|
163
|
+
it('refuses a truncated tree whose walk would pass the request budget, having made no request past it', async () => {
|
|
164
|
+
const stand = github();
|
|
165
|
+
await expect(connectorOn(stand, { maxTreeRequests: 3 }).listing(78, CL)).rejects.toBeInstanceOf(TreeTooLarge);
|
|
166
|
+
expect(treeRequests(stand.seen)).toEqual([`${CL}?recursive=1`, CL, 'ldocs?recursive=1']);
|
|
167
|
+
});
|
|
168
|
+
it('answers the listing at a commit, and compares a push against a listing it is given without any request', async () => {
|
|
169
|
+
const stand = github();
|
|
170
|
+
const connector = connectorOn(stand);
|
|
171
|
+
const listing = await connector.listing(77, C1);
|
|
172
|
+
expect(listing).toEqual([
|
|
173
|
+
{ path: 'README.md', sha: 'r1', size: 120 },
|
|
174
|
+
{ path: 'docs/agenda.md', sha: 'a1', size: 300 },
|
|
175
|
+
{ path: 'docs/budget.pdf', sha: 'b1', size: 2048 },
|
|
176
|
+
]);
|
|
177
|
+
const before = stand.seen.length;
|
|
178
|
+
const changes = await connector.changesSince(JSON.stringify({ 'README.md': 'r1', 'docs/agenda.md': 'a0' }), { ids: ['77'], after: C1, listing });
|
|
179
|
+
expect(changes.changed).toEqual([
|
|
180
|
+
{ id: '77:docs/agenda.md', title: 'docs/agenda.md', size: 300, version: `a1@${C1}` },
|
|
181
|
+
{ id: '77:docs/budget.pdf', title: 'docs/budget.pdf', size: 2048, version: `b1@${C1}` },
|
|
182
|
+
]);
|
|
183
|
+
expect(changes.gone).toEqual([]);
|
|
184
|
+
expect(stand.seen.length).toBe(before);
|
|
185
|
+
});
|
|
186
|
+
it('reads Markdown as text and a PDF as bytes from their raw contents, each with its attribution at the commit', async () => {
|
|
187
|
+
const stand = github();
|
|
188
|
+
const connector = connectorOn(stand);
|
|
189
|
+
const agenda = asRead(await connector.read({ id: '77:docs/agenda.md', title: 'docs/agenda.md', size: 300, version: `a1@${C1}` }));
|
|
190
|
+
expect(agenda.content).toEqual({ text: AGENDA });
|
|
191
|
+
expect(agenda.ref).toMatchObject({
|
|
192
|
+
kind: 'github',
|
|
193
|
+
title: 'docs/agenda.md',
|
|
194
|
+
path: 'docs/agenda.md',
|
|
195
|
+
version: C1,
|
|
196
|
+
url: `https://github.com/acme-team/handbook/blob/${C1}/docs/agenda.md`,
|
|
197
|
+
});
|
|
198
|
+
expect(Number.isNaN(Date.parse(agenda.ref.readAt))).toBe(false);
|
|
199
|
+
const budget = asRead(await connector.read({ id: '77:docs/budget.pdf', title: 'docs/budget.pdf', size: 2048, version: `b1@${C1}` }));
|
|
200
|
+
if (!('bytes' in budget.content))
|
|
201
|
+
throw new Error('the PDF was answered as text');
|
|
202
|
+
expect(budget.content.mediaType).toBe('application/pdf');
|
|
203
|
+
expect(Buffer.from(budget.content.bytes).equals(Buffer.from(PDF))).toBe(true);
|
|
204
|
+
expect(budget.ref.url).toBe(`https://github.com/acme-team/handbook/blob/${C1}/docs/budget.pdf`);
|
|
205
|
+
const reads = stand.seen.filter((request) => request.url.includes('/contents/'));
|
|
206
|
+
expect(reads.map((request) => request.headers.get('accept'))).toEqual(['application/vnd.github.raw+json', 'application/vnd.github.raw+json']);
|
|
207
|
+
expect(reads.every((request) => request.headers.get('authorization') === 'Bearer ghs_documents')).toBe(true);
|
|
208
|
+
expect(reads.every((request) => request.headers.get('x-github-api-version') === '2026-03-10')).toBe(true);
|
|
209
|
+
});
|
|
210
|
+
it('answers a file whose raw read passes the cap as gone, without buffering it whole', async () => {
|
|
211
|
+
const stand = github();
|
|
212
|
+
const answer = await connectorOn(stand, { maxFileBytes: 1_000_000 }).read({ id: '77:docs/long.md', title: 'docs/long.md', size: null, version: `l1@${C1}` });
|
|
213
|
+
expect(answer).toEqual({ id: '77:docs/long.md', reason: 'removed' });
|
|
214
|
+
expect(stand.long.pulled).toBeLessThan(LONG_CHUNKS * LONG_CHUNK_BYTES);
|
|
215
|
+
expect(stand.long.cancelled).toBe(true);
|
|
216
|
+
});
|
|
217
|
+
it("compares a push to the default branch by the tree at its after commit, never by the push's commit list", async () => {
|
|
218
|
+
const stand = github();
|
|
219
|
+
const previous = JSON.stringify({ 'README.md': 'r1', 'docs/agenda.md': 'a1', 'docs/budget.pdf': 'b1', 'docs/old.md': 'o1' });
|
|
220
|
+
const changes = await connectorOn(stand).changesSince(previous, { ids: ['77'], after: C2, ref: 'refs/heads/main' });
|
|
221
|
+
expect(changes.changed).toEqual([{ id: '77:docs/agenda.md', title: 'docs/agenda.md', size: 320, version: `a2@${C2}` }]);
|
|
222
|
+
expect(changes.gone).toEqual([{ id: '77:docs/old.md', reason: 'removed' }]);
|
|
223
|
+
expect(JSON.parse(changes.cursor)).toEqual({ 'README.md': 'r1', 'docs/agenda.md': 'a2', 'docs/budget.pdf': 'b1' });
|
|
224
|
+
expect(treeRequests(stand.seen)).toEqual([`${C2}?recursive=1`]);
|
|
225
|
+
expect(stand.seen.some((request) => request.url.includes('/commits') || request.url.includes('/compare'))).toBe(false);
|
|
226
|
+
});
|
|
227
|
+
it('answers a push to another branch with no change and no request', async () => {
|
|
228
|
+
const stand = github();
|
|
229
|
+
const previous = JSON.stringify({ 'README.md': 'r1' });
|
|
230
|
+
const changes = await connectorOn(stand).changesSince(previous, { ids: ['77'], after: C3, ref: 'refs/heads/feature' });
|
|
231
|
+
expect(changes).toEqual({ changed: [], gone: [], cursor: previous });
|
|
232
|
+
expect(stand.seen).toEqual([]);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=documents.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.test.js","sourceRoot":"","sources":["../../src/__tests__/documents.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -235,5 +235,19 @@ describe('GitHubRepoIndexer', () => {
|
|
|
235
235
|
// repos.get should have been called once per ecosystem repo
|
|
236
236
|
expect(ctx.mocks.reposGet).toHaveBeenCalledTimes(6);
|
|
237
237
|
});
|
|
238
|
+
/* --------------------------------------------------------------- */
|
|
239
|
+
it("indexes the caller's repositories in place of the default six", async () => {
|
|
240
|
+
const own = new GitHubRepoIndexer(ctx.service, {
|
|
241
|
+
repositories: [
|
|
242
|
+
{ owner: 'acme-team', repo: 'handbook' },
|
|
243
|
+
{ owner: 'acme-team', repo: 'notes' },
|
|
244
|
+
],
|
|
245
|
+
});
|
|
246
|
+
const results = await own.indexEcosystem();
|
|
247
|
+
expect(results.map((result) => result.repo)).toEqual(['acme-team/handbook', 'acme-team/notes']);
|
|
248
|
+
expect(ctx.mocks.reposGet).toHaveBeenCalledTimes(2);
|
|
249
|
+
expect(ctx.mocks.reposGet).toHaveBeenNthCalledWith(1, { owner: 'acme-team', repo: 'handbook' });
|
|
250
|
+
expect(ctx.mocks.reposGet).toHaveBeenNthCalledWith(2, { owner: 'acme-team', repo: 'notes' });
|
|
251
|
+
});
|
|
238
252
|
});
|
|
239
253
|
//# sourceMappingURL=indexer.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.test.js","sourceRoot":"","sources":["../../src/__tests__/indexer.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexer.test.js","sourceRoot":"","sources":["../../src/__tests__/indexer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A GitHub App's credential: the app's JWT, signed RS256 from its private key, and installation tokens
|
|
3
|
+
* minted with it, narrowed to the repositories asked for and held in memory until near their end.
|
|
4
|
+
* @module agentos-ext-github/app/credential
|
|
5
|
+
*/
|
|
6
|
+
/** The app's identity: its client id (the JWT's issuer) and its private key in PEM. */
|
|
7
|
+
export interface GitHubAppIdentity {
|
|
8
|
+
clientId: string;
|
|
9
|
+
privateKey: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The app's JWT: RS256, issued 60 seconds back against clock drift, valid nine minutes (GitHub takes at most ten),
|
|
13
|
+
* with the client id as its issuer.
|
|
14
|
+
*
|
|
15
|
+
* @param identity The app's client id and private key.
|
|
16
|
+
* @param nowSeconds The time to issue it at, in Unix seconds; now when absent.
|
|
17
|
+
*/
|
|
18
|
+
export declare function appJwt(identity: GitHubAppIdentity, nowSeconds?: number): string;
|
|
19
|
+
/** Installation tokens, minted narrowed to the repositories asked for and held in memory until near their end. */
|
|
20
|
+
export declare class GitHubAppCredential {
|
|
21
|
+
private readonly identity;
|
|
22
|
+
private readonly fetchImpl;
|
|
23
|
+
private readonly apiBase;
|
|
24
|
+
private readonly held;
|
|
25
|
+
/**
|
|
26
|
+
* @param identity The app's client id and private key.
|
|
27
|
+
* @param fetchImpl The fetch the tokens are minted with.
|
|
28
|
+
* @param apiBase GitHub's REST API, or a stand-in's address in tests.
|
|
29
|
+
*/
|
|
30
|
+
constructor(identity: GitHubAppIdentity, fetchImpl?: typeof fetch, apiBase?: string);
|
|
31
|
+
/** A fresh JWT for the app's own calls. */
|
|
32
|
+
jwt(): string;
|
|
33
|
+
/**
|
|
34
|
+
* An installation token that reads only the repositories asked for, held until five minutes before it ends, so a
|
|
35
|
+
* second call within that time makes no request. An empty list asks for every repository the installation reaches.
|
|
36
|
+
* GitHub's tokens last an hour.
|
|
37
|
+
*
|
|
38
|
+
* @param installationId The installation the token acts for.
|
|
39
|
+
* @param repositoryIds The repositories it may read.
|
|
40
|
+
*/
|
|
41
|
+
installationToken(installationId: number, repositoryIds: readonly number[]): Promise<string>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=credential.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../src/app/credential.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AASD;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,SAAgC,GAAG,MAAM,CAKtG;AAED,kHAAkH;AAClH,qBAAa,mBAAmB;IAQlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAqB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAwB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2D;IAEhF;;;;OAIG;gBAC0B,QAAQ,EAAE,iBAAiB,EAAmB,SAAS,GAAE,OAAO,KAAa,EAAmB,OAAO,SAAkB;IAEtJ,2CAA2C;IAC3C,GAAG,IAAI,MAAM;IAIb;;;;;;;OAOG;IACG,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAmBnG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview A GitHub App's credential: the app's JWT, signed RS256 from its private key, and installation tokens
|
|
3
|
+
* minted with it, narrowed to the repositories asked for and held in memory until near their end.
|
|
4
|
+
* @module agentos-ext-github/app/credential
|
|
5
|
+
*/
|
|
6
|
+
import { createSign } from 'node:crypto';
|
|
7
|
+
import { GITHUB_API_BASE, githubFetch, objectOf, stringIn } from './http.js';
|
|
8
|
+
/** How long before its end a held installation token is minted again. */
|
|
9
|
+
const RENEW_BEFORE_MS = 300_000;
|
|
10
|
+
function base64url(value) {
|
|
11
|
+
return Buffer.from(value).toString('base64url');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The app's JWT: RS256, issued 60 seconds back against clock drift, valid nine minutes (GitHub takes at most ten),
|
|
15
|
+
* with the client id as its issuer.
|
|
16
|
+
*
|
|
17
|
+
* @param identity The app's client id and private key.
|
|
18
|
+
* @param nowSeconds The time to issue it at, in Unix seconds; now when absent.
|
|
19
|
+
*/
|
|
20
|
+
export function appJwt(identity, nowSeconds = Math.floor(Date.now() / 1000)) {
|
|
21
|
+
const head = base64url(JSON.stringify({ alg: 'RS256', typ: 'JWT' }));
|
|
22
|
+
const body = base64url(JSON.stringify({ iat: nowSeconds - 60, exp: nowSeconds + 540, iss: identity.clientId }));
|
|
23
|
+
const signature = createSign('RSA-SHA256').update(`${head}.${body}`).sign(identity.privateKey);
|
|
24
|
+
return `${head}.${body}.${base64url(signature)}`;
|
|
25
|
+
}
|
|
26
|
+
/** Installation tokens, minted narrowed to the repositories asked for and held in memory until near their end. */
|
|
27
|
+
export class GitHubAppCredential {
|
|
28
|
+
identity;
|
|
29
|
+
fetchImpl;
|
|
30
|
+
apiBase;
|
|
31
|
+
held = new Map();
|
|
32
|
+
/**
|
|
33
|
+
* @param identity The app's client id and private key.
|
|
34
|
+
* @param fetchImpl The fetch the tokens are minted with.
|
|
35
|
+
* @param apiBase GitHub's REST API, or a stand-in's address in tests.
|
|
36
|
+
*/
|
|
37
|
+
constructor(identity, fetchImpl = fetch, apiBase = GITHUB_API_BASE) {
|
|
38
|
+
this.identity = identity;
|
|
39
|
+
this.fetchImpl = fetchImpl;
|
|
40
|
+
this.apiBase = apiBase;
|
|
41
|
+
}
|
|
42
|
+
/** A fresh JWT for the app's own calls. */
|
|
43
|
+
jwt() {
|
|
44
|
+
return appJwt(this.identity);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* An installation token that reads only the repositories asked for, held until five minutes before it ends, so a
|
|
48
|
+
* second call within that time makes no request. An empty list asks for every repository the installation reaches.
|
|
49
|
+
* GitHub's tokens last an hour.
|
|
50
|
+
*
|
|
51
|
+
* @param installationId The installation the token acts for.
|
|
52
|
+
* @param repositoryIds The repositories it may read.
|
|
53
|
+
*/
|
|
54
|
+
async installationToken(installationId, repositoryIds) {
|
|
55
|
+
const key = `${installationId}:${[...repositoryIds].sort((a, b) => a - b).join(',')}`;
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
const held = this.held.get(key);
|
|
58
|
+
if (held !== undefined && now < held.expiresAt - RENEW_BEFORE_MS)
|
|
59
|
+
return held.token;
|
|
60
|
+
// Tokens past their end are dropped as new ones are minted, so the map holds no more than the live ones.
|
|
61
|
+
for (const [other, entry] of this.held)
|
|
62
|
+
if (entry.expiresAt <= now)
|
|
63
|
+
this.held.delete(other);
|
|
64
|
+
const answer = objectOf(await githubFetch(this.fetchImpl, `${this.apiBase}/app/installations/${installationId}/access_tokens`, {
|
|
65
|
+
token: this.jwt(),
|
|
66
|
+
method: 'POST',
|
|
67
|
+
body: JSON.stringify(repositoryIds.length === 0 ? {} : { repository_ids: repositoryIds }),
|
|
68
|
+
}), 'an installation token');
|
|
69
|
+
const token = stringIn(answer, 'token', 'an installation token');
|
|
70
|
+
this.held.set(key, { token, expiresAt: Date.parse(stringIn(answer, 'expires_at', 'an installation token')) });
|
|
71
|
+
return token;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/app/credential.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview GitHub's REST API over an injected `fetch`: one call with the headers every call carries, the pages
|
|
3
|
+
* of a listing followed through its `Link` header, and the small readers that turn an answer into typed fields. An
|
|
4
|
+
* answer outside 2xx throws {@link GitHubApiError}, whose message names the status and nothing of the answer's body.
|
|
5
|
+
* @module agentos-ext-github/app/http
|
|
6
|
+
*/
|
|
7
|
+
/** The REST API version every call pins (`X-GitHub-Api-Version`). */
|
|
8
|
+
export declare const GITHUB_API_VERSION = "2026-03-10";
|
|
9
|
+
/** GitHub's REST API. */
|
|
10
|
+
export declare const GITHUB_API_BASE = "https://api.github.com";
|
|
11
|
+
/** Where calls go: the fetch they are made with and the API's base address; `fetch` and {@link GITHUB_API_BASE} when absent. */
|
|
12
|
+
export interface GitHubApiOptions {
|
|
13
|
+
fetchImpl?: typeof fetch;
|
|
14
|
+
apiBase?: string;
|
|
15
|
+
}
|
|
16
|
+
/** One call: the bearer it carries, and its method, JSON body, media type and abort signal when not the defaults. */
|
|
17
|
+
export interface GitHubRequest {
|
|
18
|
+
token: string;
|
|
19
|
+
method?: string;
|
|
20
|
+
/** A JSON body, sent with `Content-Type: application/json`. */
|
|
21
|
+
body?: string;
|
|
22
|
+
/** The `Accept` media type; `application/vnd.github+json` when absent. */
|
|
23
|
+
accept?: string;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
}
|
|
26
|
+
/** GitHub answered a status outside 2xx. The message holds the status alone, never the answer's body. */
|
|
27
|
+
export declare class GitHubApiError extends Error {
|
|
28
|
+
readonly status: number;
|
|
29
|
+
/** @param status The HTTP status GitHub answered. */
|
|
30
|
+
constructor(status: number);
|
|
31
|
+
}
|
|
32
|
+
/** The headers of a call: the bearer, the media type, the pinned API version and the pack's user agent. */
|
|
33
|
+
export declare function githubHeaders(token: string, accept?: string): Record<string, string>;
|
|
34
|
+
/** Releases an answer's body unread. */
|
|
35
|
+
export declare function discardBody(response: Response): Promise<void>;
|
|
36
|
+
/** Sends one call; an answer outside 2xx is discarded and thrown as {@link GitHubApiError}. */
|
|
37
|
+
export declare function githubSend(fetchImpl: typeof fetch, url: string, request: GitHubRequest): Promise<Response>;
|
|
38
|
+
/**
|
|
39
|
+
* One call to `url` (an address under the API's base), answering its JSON, or `undefined` for an answer without a
|
|
40
|
+
* body. Sends `Authorization: Bearer <token>`, `Accept: application/vnd.github+json` unless told otherwise,
|
|
41
|
+
* `X-GitHub-Api-Version` and `User-Agent`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function githubFetch(fetchImpl: typeof fetch, url: string, request: GitHubRequest): Promise<unknown>;
|
|
44
|
+
/** The address a `Link` header names as `rel="next"`, or null. */
|
|
45
|
+
export declare function nextPage(link: string | null): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Each page of a listing as its JSON, following `Link: <...>; rel="next"`. A next page on another origin than the
|
|
48
|
+
* first is refused, so the bearer never leaves the API it was sent to.
|
|
49
|
+
*/
|
|
50
|
+
export declare function githubPages(fetchImpl: typeof fetch, url: string, request: GitHubRequest): AsyncGenerator<unknown, void, undefined>;
|
|
51
|
+
/** Every item of a listing across its pages; `items` takes a page's JSON and answers its items. */
|
|
52
|
+
export declare function pages<T>(fetchImpl: typeof fetch, url: string, request: GitHubRequest, items: (page: unknown) => readonly T[]): Promise<T[]>;
|
|
53
|
+
/** An answer's object; `what` names it in the error when it is not one. */
|
|
54
|
+
export declare function objectOf(value: unknown, what: string): Record<string, unknown>;
|
|
55
|
+
/** An answer's array; `what` names it in the error when it is not one. */
|
|
56
|
+
export declare function arrayOf(value: unknown, what: string): unknown[];
|
|
57
|
+
/** A number field of an answer's object. */
|
|
58
|
+
export declare function numberIn(fields: Record<string, unknown>, key: string, what: string): number;
|
|
59
|
+
/** A string field of an answer's object. */
|
|
60
|
+
export declare function stringIn(fields: Record<string, unknown>, key: string, what: string): string;
|
|
61
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/app/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C,yBAAyB;AACzB,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD,gIAAgI;AAChI,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qHAAqH;AACrH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,yGAAyG;AACzG,qBAAa,cAAe,SAAQ,KAAK;IAE3B,QAAQ,CAAC,MAAM,EAAE,MAAM;IADnC,qDAAqD;gBAChC,MAAM,EAAE,MAAM;CAIpC;AAED,2GAA2G;AAC3G,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAgC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO3G;AAED,wCAAwC;AACxC,wBAAsB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnE;AAED,+FAA+F;AAC/F,wBAAsB,UAAU,CAAC,SAAS,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAShH;AAcD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhH;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;GAGG;AACH,wBAAuB,WAAW,CAAC,SAAS,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAUzI;AAED,mGAAmG;AACnG,wBAAsB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAIjJ;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAG9E;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAG/D;AAED,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3F;AAED,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3F"}
|