@ghcrawl/api-core 0.1.0 → 0.1.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.
Files changed (63) hide show
  1. package/README.md +25 -0
  2. package/dist/api/server.d.ts +4 -0
  3. package/dist/api/server.d.ts.map +1 -0
  4. package/dist/api/server.js +142 -0
  5. package/dist/api/server.js.map +1 -0
  6. package/dist/cluster/build.d.ts +16 -0
  7. package/dist/cluster/build.d.ts.map +1 -0
  8. package/dist/cluster/build.js +62 -0
  9. package/dist/cluster/build.js.map +1 -0
  10. package/dist/config.d.ts +83 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +257 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/db/migrate.d.ts +3 -0
  15. package/dist/db/migrate.d.ts.map +1 -0
  16. package/{src/db/migrate.ts → dist/db/migrate.js} +30 -36
  17. package/dist/db/migrate.js.map +1 -0
  18. package/dist/db/sqlite.d.ts +4 -0
  19. package/dist/db/sqlite.d.ts.map +1 -0
  20. package/dist/db/sqlite.js +11 -0
  21. package/dist/db/sqlite.js.map +1 -0
  22. package/dist/documents/normalize.d.ts +23 -0
  23. package/dist/documents/normalize.d.ts.map +1 -0
  24. package/dist/documents/normalize.js +36 -0
  25. package/dist/documents/normalize.js.map +1 -0
  26. package/dist/github/client.d.ts +24 -0
  27. package/dist/github/client.d.ts.map +1 -0
  28. package/dist/github/client.js +170 -0
  29. package/dist/github/client.js.map +1 -0
  30. package/dist/index.d.ts +7 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/{src/index.ts → dist/index.js} +1 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/openai/provider.d.ts +44 -0
  35. package/dist/openai/provider.d.ts.map +1 -0
  36. package/dist/openai/provider.js +107 -0
  37. package/dist/openai/provider.js.map +1 -0
  38. package/dist/search/exact.d.ts +14 -0
  39. package/dist/search/exact.d.ts.map +1 -0
  40. package/dist/search/exact.js +26 -0
  41. package/dist/search/exact.js.map +1 -0
  42. package/dist/service.d.ts +247 -0
  43. package/dist/service.d.ts.map +1 -0
  44. package/dist/service.js +1735 -0
  45. package/dist/service.js.map +1 -0
  46. package/package.json +6 -5
  47. package/src/api/server.test.ts +0 -296
  48. package/src/api/server.ts +0 -171
  49. package/src/cluster/build.test.ts +0 -18
  50. package/src/cluster/build.ts +0 -74
  51. package/src/config.test.ts +0 -247
  52. package/src/config.ts +0 -421
  53. package/src/db/migrate.test.ts +0 -30
  54. package/src/db/sqlite.ts +0 -14
  55. package/src/documents/normalize.test.ts +0 -25
  56. package/src/documents/normalize.ts +0 -52
  57. package/src/github/client.ts +0 -241
  58. package/src/openai/provider.ts +0 -141
  59. package/src/search/exact.test.ts +0 -22
  60. package/src/search/exact.ts +0 -28
  61. package/src/service.test.ts +0 -2036
  62. package/src/service.ts +0 -2497
  63. package/src/types/better-sqlite3.d.ts +0 -1
@@ -0,0 +1,107 @@
1
+ import OpenAI from 'openai';
2
+ import { APIConnectionError, APIConnectionTimeoutError, APIError, RateLimitError } from 'openai/error';
3
+ import { zodTextFormat } from 'openai/helpers/zod';
4
+ import { z } from 'zod';
5
+ const summarySchema = z.object({
6
+ problem_summary: z.string(),
7
+ solution_summary: z.string(),
8
+ maintainer_signal_summary: z.string(),
9
+ dedupe_summary: z.string(),
10
+ });
11
+ export class OpenAiProvider {
12
+ client;
13
+ constructor(apiKey) {
14
+ this.client = new OpenAI({ apiKey });
15
+ }
16
+ async checkAuth() {
17
+ await this.client.models.list();
18
+ }
19
+ async summarizeThread(params) {
20
+ const format = zodTextFormat(summarySchema, 'ghcrawl_thread_summary');
21
+ let lastError = null;
22
+ for (const [attemptIndex, maxOutputTokens] of [500, 900, 1400].entries()) {
23
+ try {
24
+ const response = await this.client.responses.create({
25
+ model: params.model,
26
+ input: [
27
+ {
28
+ role: 'system',
29
+ content: [
30
+ {
31
+ type: 'input_text',
32
+ text: 'Summarize this GitHub issue or pull request thread. Return concise JSON only with keys problem_summary, solution_summary, maintainer_signal_summary, dedupe_summary. Each field should be plain text, no markdown, and usually 1-3 sentences.',
33
+ },
34
+ ],
35
+ },
36
+ {
37
+ role: 'user',
38
+ content: [{ type: 'input_text', text: params.text }],
39
+ },
40
+ ],
41
+ text: {
42
+ format,
43
+ verbosity: 'low',
44
+ },
45
+ max_output_tokens: maxOutputTokens,
46
+ });
47
+ const raw = response.output_text ?? '';
48
+ const parsed = summarySchema.parse(JSON.parse(raw));
49
+ return {
50
+ summary: {
51
+ problemSummary: parsed.problem_summary,
52
+ solutionSummary: parsed.solution_summary,
53
+ maintainerSignalSummary: parsed.maintainer_signal_summary,
54
+ dedupeSummary: parsed.dedupe_summary,
55
+ },
56
+ usage: response.usage
57
+ ? {
58
+ inputTokens: response.usage.input_tokens,
59
+ outputTokens: response.usage.output_tokens,
60
+ totalTokens: response.usage.total_tokens,
61
+ cachedInputTokens: response.usage.input_tokens_details?.cached_tokens ?? 0,
62
+ reasoningTokens: response.usage.output_tokens_details?.reasoning_tokens ?? 0,
63
+ }
64
+ : undefined,
65
+ };
66
+ }
67
+ catch (error) {
68
+ lastError = error instanceof Error ? error : new Error(String(error));
69
+ if (attemptIndex === 2) {
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ throw new Error(`OpenAI summarization failed after 3 attempts: ${lastError?.message ?? 'unknown error'}`);
75
+ }
76
+ async embedTexts(params) {
77
+ if (params.texts.length === 0) {
78
+ return [];
79
+ }
80
+ let lastError = null;
81
+ for (const attempt of [1, 2, 3, 4, 5]) {
82
+ try {
83
+ const response = await this.client.embeddings.create({
84
+ model: params.model,
85
+ input: params.texts,
86
+ });
87
+ return response.data.map((item) => item.embedding);
88
+ }
89
+ catch (error) {
90
+ const shouldRetry = error instanceof RateLimitError ||
91
+ error instanceof APIConnectionError ||
92
+ error instanceof APIConnectionTimeoutError ||
93
+ (error instanceof APIError && typeof error.status === 'number' && error.status >= 500);
94
+ lastError = error instanceof Error ? error : new Error(String(error));
95
+ if (!shouldRetry || attempt === 5) {
96
+ break;
97
+ }
98
+ await sleep(1000 * 2 ** (attempt - 1));
99
+ }
100
+ }
101
+ throw new Error(`OpenAI embeddings failed after 5 attempts: ${lastError?.message ?? 'unknown error'}`);
102
+ }
103
+ }
104
+ function sleep(ms) {
105
+ return new Promise((resolve) => setTimeout(resolve, ms));
106
+ }
107
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/openai/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare function cosineSimilarity(left: number[], right: number[]): number;
2
+ export declare function rankNearestNeighbors<T extends {
3
+ id: number;
4
+ embedding: number[];
5
+ }>(items: T[], params: {
6
+ targetEmbedding: number[];
7
+ limit: number;
8
+ minScore?: number;
9
+ skipId?: number;
10
+ }): Array<{
11
+ item: T;
12
+ score: number;
13
+ }>;
14
+ //# sourceMappingURL=exact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact.d.ts","sourceRoot":"","sources":["../../src/search/exact.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAcxE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,EAChF,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE;IAAE,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACvF,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQnC"}
@@ -0,0 +1,26 @@
1
+ export function cosineSimilarity(left, right) {
2
+ if (left.length !== right.length) {
3
+ throw new Error('Embedding dimensions do not match');
4
+ }
5
+ let dot = 0;
6
+ let leftNorm = 0;
7
+ let rightNorm = 0;
8
+ for (let index = 0; index < left.length; index += 1) {
9
+ dot += left[index] * right[index];
10
+ leftNorm += left[index] * left[index];
11
+ rightNorm += right[index] * right[index];
12
+ }
13
+ if (leftNorm === 0 || rightNorm === 0)
14
+ return 0;
15
+ return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
16
+ }
17
+ export function rankNearestNeighbors(items, params) {
18
+ const minScore = params.minScore ?? -1;
19
+ return items
20
+ .filter((item) => item.id !== params.skipId)
21
+ .map((item) => ({ item, score: cosineSimilarity(params.targetEmbedding, item.embedding) }))
22
+ .filter((entry) => entry.score >= minScore)
23
+ .sort((left, right) => right.score - left.score)
24
+ .slice(0, params.limit);
25
+ }
26
+ //# sourceMappingURL=exact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact.js","sourceRoot":"","sources":["../../src/search/exact.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,KAAe;IAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAU,EACV,MAAwF;IAExF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACvC,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC;SAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;SAC1F,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC;SAC1C,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SAC/C,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,247 @@
1
+ import { type ActionRequest, type ActionResponse, type ClusterDetailResponse, type ClusterResultDto, type ClusterSummariesResponse, type ClustersResponse, type EmbedResultDto, type HealthResponse, type NeighborsResponse, type RefreshResponse, type RepositoriesResponse, type RepositoryDto, type SearchHitDto, type SearchMode, type SearchResponse, type SyncResultDto, type ThreadDto, type ThreadsResponse } from '@ghcrawl/api-contract';
2
+ import { type ConfigValueSource, type GitcrawlConfig } from './config.js';
3
+ import { type SqliteDatabase } from './db/sqlite.js';
4
+ import { type GitHubClient } from './github/client.js';
5
+ import { type AiProvider } from './openai/provider.js';
6
+ export type TuiClusterSortMode = 'recent' | 'size';
7
+ export type TuiRepoStats = {
8
+ openIssueCount: number;
9
+ openPullRequestCount: number;
10
+ lastGithubReconciliationAt: string | null;
11
+ lastEmbedRefreshAt: string | null;
12
+ staleEmbedThreadCount: number;
13
+ staleEmbedSourceCount: number;
14
+ latestClusterRunId: number | null;
15
+ latestClusterRunFinishedAt: string | null;
16
+ };
17
+ export type TuiClusterSummary = {
18
+ clusterId: number;
19
+ displayTitle: string;
20
+ totalCount: number;
21
+ issueCount: number;
22
+ pullRequestCount: number;
23
+ latestUpdatedAt: string | null;
24
+ representativeThreadId: number | null;
25
+ representativeNumber: number | null;
26
+ representativeKind: 'issue' | 'pull_request' | null;
27
+ searchText: string;
28
+ };
29
+ export type TuiClusterMember = {
30
+ id: number;
31
+ number: number;
32
+ kind: 'issue' | 'pull_request';
33
+ title: string;
34
+ updatedAtGh: string | null;
35
+ htmlUrl: string;
36
+ labels: string[];
37
+ clusterScore: number | null;
38
+ };
39
+ export type TuiClusterDetail = {
40
+ clusterId: number;
41
+ displayTitle: string;
42
+ totalCount: number;
43
+ issueCount: number;
44
+ pullRequestCount: number;
45
+ latestUpdatedAt: string | null;
46
+ representativeThreadId: number | null;
47
+ representativeNumber: number | null;
48
+ representativeKind: 'issue' | 'pull_request' | null;
49
+ members: TuiClusterMember[];
50
+ };
51
+ export type TuiThreadDetail = {
52
+ thread: ThreadDto;
53
+ summaries: Partial<Record<'problem_summary' | 'solution_summary' | 'maintainer_signal_summary' | 'dedupe_summary', string>>;
54
+ neighbors: SearchHitDto['neighbors'];
55
+ };
56
+ export type TuiSnapshot = {
57
+ repository: RepositoryDto;
58
+ stats: TuiRepoStats;
59
+ clusters: TuiClusterSummary[];
60
+ };
61
+ export type DoctorResult = {
62
+ health: HealthResponse;
63
+ github: {
64
+ configured: boolean;
65
+ source: ConfigValueSource;
66
+ formatOk: boolean;
67
+ authOk: boolean;
68
+ error: string | null;
69
+ };
70
+ openai: {
71
+ configured: boolean;
72
+ source: ConfigValueSource;
73
+ formatOk: boolean;
74
+ authOk: boolean;
75
+ error: string | null;
76
+ };
77
+ };
78
+ type SyncOptions = {
79
+ owner: string;
80
+ repo: string;
81
+ since?: string;
82
+ limit?: number;
83
+ includeComments?: boolean;
84
+ onProgress?: (message: string) => void;
85
+ startedAt?: string;
86
+ };
87
+ type SearchResultInternal = SearchResponse;
88
+ type NeighborsResultInternal = NeighborsResponse;
89
+ export declare class GHCrawlService {
90
+ readonly config: GitcrawlConfig;
91
+ readonly db: SqliteDatabase;
92
+ readonly github?: GitHubClient;
93
+ readonly ai?: AiProvider;
94
+ private readonly parsedEmbeddingCache;
95
+ constructor(options?: {
96
+ config?: GitcrawlConfig;
97
+ db?: SqliteDatabase;
98
+ github?: GitHubClient;
99
+ ai?: AiProvider;
100
+ });
101
+ close(): void;
102
+ init(): HealthResponse;
103
+ doctor(): Promise<DoctorResult>;
104
+ listRepositories(): RepositoriesResponse;
105
+ listThreads(params: {
106
+ owner: string;
107
+ repo: string;
108
+ kind?: 'issue' | 'pull_request';
109
+ }): ThreadsResponse;
110
+ syncRepository(params: SyncOptions): Promise<SyncResultDto>;
111
+ summarizeRepository(params: {
112
+ owner: string;
113
+ repo: string;
114
+ threadNumber?: number;
115
+ includeComments?: boolean;
116
+ onProgress?: (message: string) => void;
117
+ }): Promise<{
118
+ runId: number;
119
+ summarized: number;
120
+ inputTokens: number;
121
+ outputTokens: number;
122
+ totalTokens: number;
123
+ }>;
124
+ purgeComments(params: {
125
+ owner: string;
126
+ repo: string;
127
+ threadNumber?: number;
128
+ onProgress?: (message: string) => void;
129
+ }): {
130
+ purgedComments: number;
131
+ refreshedThreads: number;
132
+ };
133
+ embedRepository(params: {
134
+ owner: string;
135
+ repo: string;
136
+ threadNumber?: number;
137
+ onProgress?: (message: string) => void;
138
+ }): Promise<EmbedResultDto>;
139
+ clusterRepository(params: {
140
+ owner: string;
141
+ repo: string;
142
+ minScore?: number;
143
+ k?: number;
144
+ onProgress?: (message: string) => void;
145
+ }): ClusterResultDto;
146
+ searchRepository(params: {
147
+ owner: string;
148
+ repo: string;
149
+ query: string;
150
+ mode?: SearchMode;
151
+ limit?: number;
152
+ }): Promise<SearchResultInternal>;
153
+ listNeighbors(params: {
154
+ owner: string;
155
+ repo: string;
156
+ threadNumber: number;
157
+ limit?: number;
158
+ minScore?: number;
159
+ }): NeighborsResultInternal;
160
+ listClusters(params: {
161
+ owner: string;
162
+ repo: string;
163
+ }): ClustersResponse;
164
+ refreshRepository(params: {
165
+ owner: string;
166
+ repo: string;
167
+ sync?: boolean;
168
+ embed?: boolean;
169
+ cluster?: boolean;
170
+ onProgress?: (message: string) => void;
171
+ }): Promise<RefreshResponse>;
172
+ listClusterSummaries(params: {
173
+ owner: string;
174
+ repo: string;
175
+ minSize?: number;
176
+ limit?: number;
177
+ sort?: TuiClusterSortMode;
178
+ search?: string;
179
+ }): ClusterSummariesResponse;
180
+ getClusterDetailDump(params: {
181
+ owner: string;
182
+ repo: string;
183
+ clusterId: number;
184
+ memberLimit?: number;
185
+ bodyChars?: number;
186
+ }): ClusterDetailResponse;
187
+ getTuiSnapshot(params: {
188
+ owner: string;
189
+ repo: string;
190
+ minSize?: number;
191
+ sort?: TuiClusterSortMode;
192
+ search?: string;
193
+ }): TuiSnapshot;
194
+ getTuiClusterDetail(params: {
195
+ owner: string;
196
+ repo: string;
197
+ clusterId: number;
198
+ }): TuiClusterDetail;
199
+ getTuiThreadDetail(params: {
200
+ owner: string;
201
+ repo: string;
202
+ threadId?: number;
203
+ threadNumber?: number;
204
+ includeNeighbors?: boolean;
205
+ }): TuiThreadDetail;
206
+ rerunAction(request: ActionRequest): Promise<ActionResponse>;
207
+ private getSyncCursorState;
208
+ private writeSyncCursorState;
209
+ private getTuiRepoStats;
210
+ private getLatestClusterRun;
211
+ private listRawTuiClusters;
212
+ private compareTuiClusterSummary;
213
+ private fetchThreadComments;
214
+ private requireAi;
215
+ private requireGithub;
216
+ private requireRepository;
217
+ private upsertRepository;
218
+ private upsertThread;
219
+ private reconcileMissingOpenThreads;
220
+ private replaceComments;
221
+ private refreshDocument;
222
+ private buildSummarySource;
223
+ private buildEmbeddingTasks;
224
+ private prepareEmbeddingText;
225
+ private estimateEmbeddingTokens;
226
+ private isEmbeddingContextError;
227
+ private embedBatchWithRecovery;
228
+ private embedSingleTaskWithRecovery;
229
+ private shrinkEmbeddingTask;
230
+ private chunkEmbeddingTasks;
231
+ private loadStoredEmbeddings;
232
+ private loadParsedStoredEmbeddings;
233
+ private getEmbeddingWorkset;
234
+ private loadCombinedSummaryTextMap;
235
+ private edgeKey;
236
+ private aggregateRepositoryEdges;
237
+ private upsertSummary;
238
+ private upsertEmbedding;
239
+ private startRun;
240
+ private finishRun;
241
+ }
242
+ export declare function parseRepoParams(url: URL): {
243
+ owner: string;
244
+ repo: string;
245
+ };
246
+ export {};
247
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}