@aligndottech/connector-core 0.4.0 → 0.5.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.
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import type { ConnectorFetcher, ConnectorFetcherOptions, FetcherItem } from '../types/fetcher.js';
|
|
2
2
|
/**
|
|
3
|
-
* Read-only personal GitHub fetcher
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
3
|
+
* Read-only personal GitHub fetcher.
|
|
4
|
+
*
|
|
5
|
+
* ALI-805: the old two queries (`author:+is:merged`, `commenter:`) missed
|
|
6
|
+
* self-filed issues (`commenter:` never matches the original post), every
|
|
7
|
+
* open or reverted PR (`is:merged` drops both - and a reversal is one of the
|
|
8
|
+
* most decision-dense things in a repo), and anything only assigned or
|
|
9
|
+
* mentioned. `involves:` is GitHub's own union of author/assignee/mentions/
|
|
10
|
+
* commenter, so it replaces both narrow queries - but it does NOT cover code
|
|
11
|
+
* review (confirmed against GitHub's search-qualifiers docs), so a PR the
|
|
12
|
+
* user only reviewed needs its own `reviewed-by:` query.
|
|
13
|
+
*
|
|
14
|
+
* And per item, this now fetches the discussion - issue/PR comments, PR
|
|
15
|
+
* review bodies, and inline review comments - not just the title and body.
|
|
16
|
+
* That is where the "why" usually lives: the body says what changed, the
|
|
17
|
+
* thread is where someone objects and the author agrees or pushes back.
|
|
6
18
|
*/
|
|
7
19
|
export declare class GitHubFetcher implements ConnectorFetcher {
|
|
8
20
|
fetch(opts: ConnectorFetcherOptions): Promise<FetcherItem[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/fetchers/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/fetchers/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmLlG;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IAC9C,KAAK,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAiCnE"}
|
package/dist/fetchers/github.js
CHANGED
|
@@ -2,6 +2,16 @@ import { fetch } from 'undici';
|
|
|
2
2
|
// GitHub's Search API returns at most 100 results/page and 1000 total (10 pages).
|
|
3
3
|
const GH_PER_PAGE_MAX = 100;
|
|
4
4
|
const GH_SEARCH_MAX_PAGES = 10;
|
|
5
|
+
// How many items may have their discussion (comments/reviews) in flight at
|
|
6
|
+
// once. Each item costs up to 3 extra requests (issue comments, PR reviews,
|
|
7
|
+
// PR review comments) - bounding this keeps a large personal history from
|
|
8
|
+
// blasting past GitHub's rate limit. Lower than the gateway's hosted scan
|
|
9
|
+
// (20, services/gateway/src/discover/githubHistorical.ts) because this runs
|
|
10
|
+
// unattended on a personal token with no retry/backoff around it.
|
|
11
|
+
const PARALLEL_DISCUSSION_FETCHES = 5;
|
|
12
|
+
// A single comment/review section is capped so one pathological thread (a
|
|
13
|
+
// bot dump, a copy-pasted log) can't blow the whole item's extraction budget.
|
|
14
|
+
const MAX_SECTION_CHARS = 4000;
|
|
5
15
|
/** Page through a GitHub search query until `target` items are collected (or the
|
|
6
16
|
* results run out / the 1000-result ceiling is hit). */
|
|
7
17
|
async function searchAll(query, headers, target) {
|
|
@@ -19,10 +29,127 @@ async function searchAll(query, headers, target) {
|
|
|
19
29
|
}
|
|
20
30
|
return out.slice(0, target);
|
|
21
31
|
}
|
|
32
|
+
/** Alternate between two ordered lists (PRs, issues) so neither can crowd the
|
|
33
|
+
* other out once the combined total is trimmed to `limit`. A plain
|
|
34
|
+
* concat-then-slice would let a prolific PR history exhaust the limit before
|
|
35
|
+
* a single issue is considered. */
|
|
36
|
+
function interleave(a, b, limit) {
|
|
37
|
+
const out = [];
|
|
38
|
+
let i = 0;
|
|
39
|
+
let j = 0;
|
|
40
|
+
while (out.length < limit && (i < a.length || j < b.length)) {
|
|
41
|
+
if (i < a.length)
|
|
42
|
+
out.push({ kind: 'pr', row: a[i++] });
|
|
43
|
+
if (out.length < limit && j < b.length)
|
|
44
|
+
out.push({ kind: 'issue', row: b[j++] });
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
/** Bounded-concurrency map that preserves input order in the output, so a
|
|
49
|
+
* fast item never jumps ahead of a slow one in the returned list. */
|
|
50
|
+
async function mapWithConcurrency(items, concurrency, fn) {
|
|
51
|
+
const results = new Array(items.length);
|
|
52
|
+
let next = 0;
|
|
53
|
+
async function worker() {
|
|
54
|
+
for (;;) {
|
|
55
|
+
const i = next++;
|
|
56
|
+
if (i >= items.length)
|
|
57
|
+
return;
|
|
58
|
+
results[i] = await fn(items[i]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
await Promise.all(Array.from({ length: Math.max(1, Math.min(concurrency, items.length)) }, () => worker()));
|
|
62
|
+
return results;
|
|
63
|
+
}
|
|
64
|
+
function capSection(heading, entries) {
|
|
65
|
+
if (entries.length === 0)
|
|
66
|
+
return '';
|
|
67
|
+
let body = entries.join('\n\n');
|
|
68
|
+
if (body.length > MAX_SECTION_CHARS) {
|
|
69
|
+
body = `${body.slice(0, MAX_SECTION_CHARS)}\n[discussion truncated]`;
|
|
70
|
+
}
|
|
71
|
+
return `\n\n## ${heading}\n${body}`;
|
|
72
|
+
}
|
|
73
|
+
function formatEntries(entries, withState) {
|
|
74
|
+
return entries
|
|
75
|
+
.filter((e) => e.body?.trim())
|
|
76
|
+
.map((e) => {
|
|
77
|
+
const who = e.user?.login ?? 'Unknown';
|
|
78
|
+
const when = e.submitted_at ?? e.created_at ?? '';
|
|
79
|
+
const state = withState && e.state ? ` [${e.state}]` : '';
|
|
80
|
+
return `[${who}] (${when})${state}:\n${e.body}`;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/** Fetch one discussion endpoint, tolerating a failed or throwing request so
|
|
84
|
+
* one bad section never drops an otherwise-good item (ALI-805: the argument
|
|
85
|
+
* is a bonus on top of the announcement, not a requirement for it). */
|
|
86
|
+
async function fetchSection(url, headers, heading, withState) {
|
|
87
|
+
try {
|
|
88
|
+
const res = await fetch(url, { headers });
|
|
89
|
+
if (!res.ok)
|
|
90
|
+
return '';
|
|
91
|
+
const entries = (await res.json());
|
|
92
|
+
return capSection(heading, formatEntries(entries, withState));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return '';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function repoOf(item) {
|
|
99
|
+
return (item.repository_url ?? '').replace('https://api.github.com/repos/', '');
|
|
100
|
+
}
|
|
101
|
+
async function buildPrItem(pr, headers) {
|
|
102
|
+
const repo = repoOf(pr);
|
|
103
|
+
const status = pr.pull_request?.merged_at ? 'merged' : pr.state;
|
|
104
|
+
let rawText = `${pr.title}\n\n${pr.body ?? ''}\n\nStatus: ${status}\nRepo: ${repo}`.trim();
|
|
105
|
+
if (repo && pr.number != null) {
|
|
106
|
+
// Sequential, not Promise.all: GitHub's own best-practices guidance is
|
|
107
|
+
// to make requests serially rather than concurrently to avoid secondary
|
|
108
|
+
// rate limiting. PARALLEL_DISCUSSION_FETCHES already bounds how many
|
|
109
|
+
// ITEMS run at once - firing 3 more requests concurrently per item would
|
|
110
|
+
// undo that bound (5 items x 3 requests = 15 requests in flight).
|
|
111
|
+
rawText += await fetchSection(`https://api.github.com/repos/${repo}/issues/${pr.number}/comments?per_page=20`, headers, 'Comments', false);
|
|
112
|
+
rawText += await fetchSection(`https://api.github.com/repos/${repo}/pulls/${pr.number}/reviews?per_page=20`, headers, 'Code Reviews', true);
|
|
113
|
+
rawText += await fetchSection(`https://api.github.com/repos/${repo}/pulls/${pr.number}/comments?per_page=20`, headers, 'Review Comments', false);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
source_url: pr.html_url,
|
|
117
|
+
platform: 'github',
|
|
118
|
+
raw_text: rawText,
|
|
119
|
+
title: pr.title,
|
|
120
|
+
...(pr.user ? { author: { name: pr.user.login, handle: pr.user.login, url: pr.user.html_url } } : {}),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async function buildIssueItem(issue, headers) {
|
|
124
|
+
const repo = repoOf(issue);
|
|
125
|
+
let rawText = `${issue.title}\n\n${issue.body ?? ''}\n\nStatus: ${issue.state}`.trim();
|
|
126
|
+
if (repo && issue.number != null) {
|
|
127
|
+
rawText += await fetchSection(`https://api.github.com/repos/${repo}/issues/${issue.number}/comments?per_page=20`, headers, 'Comments', false);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
source_url: issue.html_url,
|
|
131
|
+
platform: 'github',
|
|
132
|
+
raw_text: rawText,
|
|
133
|
+
title: issue.title,
|
|
134
|
+
...(issue.user ? { author: { name: issue.user.login, handle: issue.user.login, url: issue.user.html_url } } : {}),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
22
137
|
/**
|
|
23
|
-
* Read-only personal GitHub fetcher
|
|
24
|
-
*
|
|
25
|
-
* `
|
|
138
|
+
* Read-only personal GitHub fetcher.
|
|
139
|
+
*
|
|
140
|
+
* ALI-805: the old two queries (`author:+is:merged`, `commenter:`) missed
|
|
141
|
+
* self-filed issues (`commenter:` never matches the original post), every
|
|
142
|
+
* open or reverted PR (`is:merged` drops both - and a reversal is one of the
|
|
143
|
+
* most decision-dense things in a repo), and anything only assigned or
|
|
144
|
+
* mentioned. `involves:` is GitHub's own union of author/assignee/mentions/
|
|
145
|
+
* commenter, so it replaces both narrow queries - but it does NOT cover code
|
|
146
|
+
* review (confirmed against GitHub's search-qualifiers docs), so a PR the
|
|
147
|
+
* user only reviewed needs its own `reviewed-by:` query.
|
|
148
|
+
*
|
|
149
|
+
* And per item, this now fetches the discussion - issue/PR comments, PR
|
|
150
|
+
* review bodies, and inline review comments - not just the title and body.
|
|
151
|
+
* That is where the "why" usually lives: the body says what changed, the
|
|
152
|
+
* thread is where someone objects and the author agrees or pushes back.
|
|
26
153
|
*/
|
|
27
154
|
export class GitHubFetcher {
|
|
28
155
|
async fetch(opts) {
|
|
@@ -37,31 +164,19 @@ export class GitHubFetcher {
|
|
|
37
164
|
}
|
|
38
165
|
const user = (await userRes.json());
|
|
39
166
|
const limit = opts.limit ?? 100;
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const issues = await searchAll(`https://api.github.com/search/issues?q=commenter:${user.login}+type:issue`, headers, limit - items.length);
|
|
54
|
-
for (const issue of issues) {
|
|
55
|
-
items.push({
|
|
56
|
-
source_url: issue.html_url,
|
|
57
|
-
platform: 'github',
|
|
58
|
-
raw_text: `${issue.title}\n\n${issue.body ?? ''}\n\nStatus: ${issue.state}`.trim(),
|
|
59
|
-
title: issue.title,
|
|
60
|
-
...(issue.user ? { author: { name: issue.user.login, handle: issue.user.login, url: issue.user.html_url } } : {}),
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return items.slice(0, limit);
|
|
167
|
+
const [involvesPrs, reviewedPrs, issues] = await Promise.all([
|
|
168
|
+
searchAll(`https://api.github.com/search/issues?q=involves:${user.login}+type:pr`, headers, limit),
|
|
169
|
+
searchAll(`https://api.github.com/search/issues?q=reviewed-by:${user.login}+type:pr`, headers, limit),
|
|
170
|
+
searchAll(`https://api.github.com/search/issues?q=involves:${user.login}+type:issue`, headers, limit),
|
|
171
|
+
]);
|
|
172
|
+
// involves: and reviewed-by: can both return the same PR (e.g. you
|
|
173
|
+
// authored it AND someone else reviewed you on it too) - dedupe before
|
|
174
|
+
// the item ever reaches the discussion-fetch stage.
|
|
175
|
+
const prByUrl = new Map();
|
|
176
|
+
for (const pr of [...involvesPrs, ...reviewedPrs])
|
|
177
|
+
prByUrl.set(pr.html_url, pr);
|
|
178
|
+
const rows = interleave([...prByUrl.values()], issues, limit);
|
|
179
|
+
return mapWithConcurrency(rows, PARALLEL_DISCUSSION_FETCHES, (r) => r.kind === 'pr' ? buildPrItem(r.row, headers) : buildIssueItem(r.row, headers));
|
|
65
180
|
}
|
|
66
181
|
}
|
|
67
182
|
//# sourceMappingURL=github.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/fetchers/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/fetchers/github.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aligndottech/connector-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Align connector core: the ConnectorFetcher contract, read-only fetchers, gateway client, and tier definitions. Lightweight (no server deps) - safe for the Align CLI.",
|