treliq 0.4.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 +21 -0
- package/README.md +340 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +540 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/cache.d.ts +29 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +64 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/concurrency.d.ts +16 -0
- package/dist/core/concurrency.d.ts.map +1 -0
- package/dist/core/concurrency.js +60 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/db.d.ts +127 -0
- package/dist/core/db.d.ts.map +1 -0
- package/dist/core/db.js +490 -0
- package/dist/core/db.js.map +1 -0
- package/dist/core/dedup.d.ts +18 -0
- package/dist/core/dedup.d.ts.map +1 -0
- package/dist/core/dedup.js +159 -0
- package/dist/core/dedup.js.map +1 -0
- package/dist/core/graphql.d.ts +30 -0
- package/dist/core/graphql.d.ts.map +1 -0
- package/dist/core/graphql.js +243 -0
- package/dist/core/graphql.js.map +1 -0
- package/dist/core/notifications.d.ts +37 -0
- package/dist/core/notifications.d.ts.map +1 -0
- package/dist/core/notifications.js +174 -0
- package/dist/core/notifications.js.map +1 -0
- package/dist/core/provider.d.ts +45 -0
- package/dist/core/provider.d.ts.map +1 -0
- package/dist/core/provider.js +147 -0
- package/dist/core/provider.js.map +1 -0
- package/dist/core/ratelimit.d.ts +40 -0
- package/dist/core/ratelimit.d.ts.map +1 -0
- package/dist/core/ratelimit.js +77 -0
- package/dist/core/ratelimit.js.map +1 -0
- package/dist/core/reputation.d.ts +16 -0
- package/dist/core/reputation.d.ts.map +1 -0
- package/dist/core/reputation.js +59 -0
- package/dist/core/reputation.js.map +1 -0
- package/dist/core/scanner.d.ts +58 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +635 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/scoring.d.ts +36 -0
- package/dist/core/scoring.d.ts.map +1 -0
- package/dist/core/scoring.js +360 -0
- package/dist/core/scoring.js.map +1 -0
- package/dist/core/types.d.ts +89 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/vectorstore.d.ts +42 -0
- package/dist/core/vectorstore.d.ts.map +1 -0
- package/dist/core/vectorstore.js +149 -0
- package/dist/core/vectorstore.js.map +1 -0
- package/dist/core/vision.d.ts +16 -0
- package/dist/core/vision.d.ts.map +1 -0
- package/dist/core/vision.js +41 -0
- package/dist/core/vision.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/server/app.d.ts +21 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +284 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/index.d.ts +29 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +117 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/scheduler.d.ts +26 -0
- package/dist/server/scheduler.d.ts.map +1 -0
- package/dist/server/scheduler.js +136 -0
- package/dist/server/scheduler.js.map +1 -0
- package/dist/server/sse.d.ts +33 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +80 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/server/webhooks.d.ts +23 -0
- package/dist/server/webhooks.d.ts.map +1 -0
- package/dist/server/webhooks.js +175 -0
- package/dist/server/webhooks.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Incremental cache for Treliq — skips re-scanning unchanged PRs
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.configHash = configHash;
|
|
7
|
+
exports.loadCache = loadCache;
|
|
8
|
+
exports.saveCache = saveCache;
|
|
9
|
+
exports.getCacheHit = getCacheHit;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const crypto_1 = require("crypto");
|
|
12
|
+
/** Generate a hash of config options that affect scoring results */
|
|
13
|
+
function configHash(opts) {
|
|
14
|
+
const input = JSON.stringify({
|
|
15
|
+
trustContributors: opts.trustContributors,
|
|
16
|
+
provider: opts.providerName ?? 'none',
|
|
17
|
+
});
|
|
18
|
+
return (0, crypto_1.createHash)('md5').update(input).digest('hex').slice(0, 8);
|
|
19
|
+
}
|
|
20
|
+
function loadCache(cacheFile, repo, hash) {
|
|
21
|
+
if (!(0, fs_1.existsSync)(cacheFile))
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
const raw = JSON.parse((0, fs_1.readFileSync)(cacheFile, 'utf-8'));
|
|
25
|
+
if (raw.repo !== repo)
|
|
26
|
+
return null;
|
|
27
|
+
// Invalidate cache if config changed (backwards compatible with old caches without hash)
|
|
28
|
+
if (hash && raw.configHash && raw.configHash !== hash) {
|
|
29
|
+
console.error('📦 Cache invalidated (config changed)');
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return raw;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function saveCache(cacheFile, repo, scored, shaMap, hash) {
|
|
39
|
+
const cache = {
|
|
40
|
+
repo,
|
|
41
|
+
lastScan: new Date().toISOString(),
|
|
42
|
+
configHash: hash ?? '',
|
|
43
|
+
prs: {},
|
|
44
|
+
};
|
|
45
|
+
for (const pr of scored) {
|
|
46
|
+
const { embedding, ...rest } = pr;
|
|
47
|
+
cache.prs[String(pr.number)] = {
|
|
48
|
+
updatedAt: pr.updatedAt,
|
|
49
|
+
headSha: shaMap.get(pr.number) ?? '',
|
|
50
|
+
scoredPR: rest,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
(0, fs_1.writeFileSync)(cacheFile, JSON.stringify(cache, null, 2));
|
|
54
|
+
}
|
|
55
|
+
function getCacheHit(cache, item) {
|
|
56
|
+
const cached = cache.prs[String(item.number)];
|
|
57
|
+
if (!cached)
|
|
58
|
+
return null;
|
|
59
|
+
if (cached.updatedAt === item.updatedAt && cached.headSha === item.headSha) {
|
|
60
|
+
return cached.scoredPR;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoBH,gCAMC;AAED,8BAcC;AAED,8BAsBC;AAQD,kCAOC;AA/ED,2BAA6D;AAC7D,mCAAoC;AAgBpC,oEAAoE;AACpE,SAAgB,UAAU,CAAC,IAA2D;IACpF,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,QAAQ,EAAE,IAAI,CAAC,YAAY,IAAI,MAAM;KACtC,CAAC,CAAC;IACH,OAAO,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAgB,SAAS,CAAC,SAAiB,EAAE,IAAY,EAAE,IAAa;IACtE,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,SAAS,EAAE,OAAO,CAAC,CAAgB,CAAC;QACxE,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,yFAAyF;QACzF,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CACvB,SAAiB,EACjB,IAAY,EACZ,MAAkB,EAClB,MAA2B,EAC3B,IAAa;IAEb,MAAM,KAAK,GAAgB;QACzB,IAAI;QACJ,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAClC,UAAU,EAAE,IAAI,IAAI,EAAE;QACtB,GAAG,EAAE,EAAE;KACR,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG;YAC7B,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;YACpC,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IACD,IAAA,kBAAa,EAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAQD,SAAgB,WAAW,CAAC,KAAkB,EAAE,IAAgB;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,QAAoB,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConcurrencyController — Limit parallel async operations with retry support
|
|
3
|
+
*/
|
|
4
|
+
export declare class ConcurrencyController {
|
|
5
|
+
private maxConcurrent;
|
|
6
|
+
private retryAttempts;
|
|
7
|
+
private retryDelay;
|
|
8
|
+
private running;
|
|
9
|
+
private queue;
|
|
10
|
+
constructor(maxConcurrent?: number, retryAttempts?: number, retryDelay?: number);
|
|
11
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
12
|
+
private acquire;
|
|
13
|
+
private release;
|
|
14
|
+
private withRetry;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=concurrency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/core/concurrency.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAyB;gBAE1B,aAAa,SAAI,EAAE,aAAa,SAAI,EAAE,UAAU,SAAO;IAM7D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IASlD,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,OAAO;YAMD,SAAS;CAWxB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ConcurrencyController — Limit parallel async operations with retry support
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConcurrencyController = void 0;
|
|
7
|
+
class ConcurrencyController {
|
|
8
|
+
maxConcurrent;
|
|
9
|
+
retryAttempts;
|
|
10
|
+
retryDelay;
|
|
11
|
+
running = 0;
|
|
12
|
+
queue = [];
|
|
13
|
+
constructor(maxConcurrent = 5, retryAttempts = 2, retryDelay = 1000) {
|
|
14
|
+
this.maxConcurrent = maxConcurrent;
|
|
15
|
+
this.retryAttempts = retryAttempts;
|
|
16
|
+
this.retryDelay = retryDelay;
|
|
17
|
+
}
|
|
18
|
+
async execute(fn) {
|
|
19
|
+
await this.acquire();
|
|
20
|
+
try {
|
|
21
|
+
return await this.withRetry(fn);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
this.release();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
acquire() {
|
|
28
|
+
if (this.running < this.maxConcurrent) {
|
|
29
|
+
this.running++;
|
|
30
|
+
return Promise.resolve();
|
|
31
|
+
}
|
|
32
|
+
return new Promise(resolve => {
|
|
33
|
+
this.queue.push(() => {
|
|
34
|
+
this.running++;
|
|
35
|
+
resolve();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
release() {
|
|
40
|
+
this.running--;
|
|
41
|
+
const next = this.queue.shift();
|
|
42
|
+
if (next)
|
|
43
|
+
next();
|
|
44
|
+
}
|
|
45
|
+
async withRetry(fn) {
|
|
46
|
+
for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {
|
|
47
|
+
try {
|
|
48
|
+
return await fn();
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (attempt === this.retryAttempts)
|
|
52
|
+
throw err;
|
|
53
|
+
await new Promise(r => setTimeout(r, this.retryDelay * (attempt + 1)));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
throw new Error('Max retries exceeded');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.ConcurrencyController = ConcurrencyController;
|
|
60
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/core/concurrency.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAa,qBAAqB;IACxB,aAAa,CAAS;IACtB,aAAa,CAAS;IACtB,UAAU,CAAS;IACnB,OAAO,GAAG,CAAC,CAAC;IACZ,KAAK,GAAsB,EAAE,CAAC;IAEtC,YAAY,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI;QACjE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAI,EAAoB;QAC7C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,KAAK,IAAI,CAAC,aAAa;oBAAE,MAAM,GAAG,CAAC;gBAC9C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;CACF;AApDD,sDAoDC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreliqDB - SQLite persistence layer for PR scan results
|
|
3
|
+
*
|
|
4
|
+
* Stores repositories, pull requests, scoring signals, and scan history
|
|
5
|
+
* with full transaction support and optimized indexes.
|
|
6
|
+
*/
|
|
7
|
+
import type { ScoredPR } from './types';
|
|
8
|
+
export interface Repository {
|
|
9
|
+
id: number;
|
|
10
|
+
owner: string;
|
|
11
|
+
repo: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
lastScan: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface ScanHistoryEntry {
|
|
16
|
+
scannedAt: string;
|
|
17
|
+
totalPRs: number;
|
|
18
|
+
spamCount: number;
|
|
19
|
+
dupClusters: number;
|
|
20
|
+
configHash: string;
|
|
21
|
+
}
|
|
22
|
+
export interface GetPRsOptions {
|
|
23
|
+
state?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
offset?: number;
|
|
26
|
+
sortBy?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class TreliqDB {
|
|
29
|
+
private db;
|
|
30
|
+
constructor(dbPath: string);
|
|
31
|
+
/**
|
|
32
|
+
* Initialize database schema with tables and indexes
|
|
33
|
+
*/
|
|
34
|
+
private initSchema;
|
|
35
|
+
/**
|
|
36
|
+
* Insert or update a repository and return its ID
|
|
37
|
+
*/
|
|
38
|
+
upsertRepository(owner: string, repo: string): number;
|
|
39
|
+
/**
|
|
40
|
+
* Get all repositories
|
|
41
|
+
*/
|
|
42
|
+
getRepositories(): Array<{
|
|
43
|
+
id: number;
|
|
44
|
+
owner: string;
|
|
45
|
+
repo: string;
|
|
46
|
+
lastScan: string | null;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Insert or update a pull request with its scoring signals
|
|
50
|
+
* Uses transaction to ensure atomicity
|
|
51
|
+
*/
|
|
52
|
+
upsertPR(repoId: number, pr: ScoredPR, configHash: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Get pull requests with optional filtering, sorting, and pagination
|
|
55
|
+
*/
|
|
56
|
+
getPRs(repoId: number, opts?: GetPRsOptions): ScoredPR[];
|
|
57
|
+
/**
|
|
58
|
+
* Get spam PRs for a repository
|
|
59
|
+
*/
|
|
60
|
+
getSpamPRs(repoId: number): ScoredPR[];
|
|
61
|
+
/**
|
|
62
|
+
* Get a single PR by number
|
|
63
|
+
*/
|
|
64
|
+
getPRByNumber(repoId: number, prNumber: number): ScoredPR | null;
|
|
65
|
+
/**
|
|
66
|
+
* Update PR state (e.g., 'open', 'closed', 'merged')
|
|
67
|
+
*/
|
|
68
|
+
updatePRState(repoId: number, prNumber: number, state: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get signals for a specific PR
|
|
71
|
+
*/
|
|
72
|
+
private getSignalsForPR;
|
|
73
|
+
/**
|
|
74
|
+
* Convert database row to ScoredPR object
|
|
75
|
+
*/
|
|
76
|
+
private rowToPR;
|
|
77
|
+
/**
|
|
78
|
+
* Record a scan in history and update repository last_scan timestamp
|
|
79
|
+
*/
|
|
80
|
+
recordScan(repoId: number, totalPRs: number, spamCount: number, dupClusters: number, configHash: string): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get scan history for a repository
|
|
83
|
+
*/
|
|
84
|
+
getScanHistory(repoId: number, limit?: number): ScanHistoryEntry[];
|
|
85
|
+
/**
|
|
86
|
+
* Get duplicate PR groups for a repository
|
|
87
|
+
*/
|
|
88
|
+
getDuplicateGroups(repoId: number): Array<{
|
|
89
|
+
duplicateGroup: number;
|
|
90
|
+
prs: ScoredPR[];
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Get PRs in a specific duplicate group
|
|
94
|
+
*/
|
|
95
|
+
private getPRsByDuplicateGroup;
|
|
96
|
+
/**
|
|
97
|
+
* Get statistics for a repository
|
|
98
|
+
*/
|
|
99
|
+
getRepositoryStats(repoId: number): {
|
|
100
|
+
totalPRs: number;
|
|
101
|
+
openPRs: number;
|
|
102
|
+
spamPRs: number;
|
|
103
|
+
duplicateGroups: number;
|
|
104
|
+
avgScore: number;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Clear all PR data, scoring signals, and scan history for a repository
|
|
108
|
+
* Repository entry itself is preserved
|
|
109
|
+
*/
|
|
110
|
+
clearRepository(repoId: number): {
|
|
111
|
+
deletedPRs: number;
|
|
112
|
+
deletedScans: number;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Close the database connection
|
|
116
|
+
*/
|
|
117
|
+
close(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Optimize database (VACUUM and ANALYZE)
|
|
120
|
+
*/
|
|
121
|
+
optimize(): void;
|
|
122
|
+
/**
|
|
123
|
+
* Get database size in bytes
|
|
124
|
+
*/
|
|
125
|
+
getDatabaseSize(): number;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/core/db.ts"],"names":[],"mappings":"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"}
|