@yglin/tw-env-records 0.0.2 → 0.0.4
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/lib/client.d.ts +1 -1
- package/lib/configuration.d.ts +71 -23
- package/lib/internal/analyzer-endpoints.d.ts +2 -0
- package/lib/internal/audit-batch-endpoints.d.ts +2 -0
- package/lib/internal/crawler-batch-endpoints.d.ts +2 -0
- package/lib/internal/crawler-endpoints.d.ts +1 -1
- package/lib/jobs/audit-batch-process.d.ts +16 -0
- package/lib/jobs/audit-batch-state.d.ts +38 -0
- package/lib/jobs/audit-batch-submit.d.ts +21 -0
- package/lib/jobs/audit-batch.d.ts +36 -0
- package/lib/jobs/crawler-batch-process.d.ts +19 -0
- package/lib/jobs/crawler-batch-state.d.ts +39 -0
- package/lib/jobs/crawler-batch-submit.d.ts +18 -0
- package/lib/jobs/crawler-batch.d.ts +52 -0
- package/lib/jobs/crawler-state.d.ts +6 -1
- package/lib/jobs/crawler.d.ts +1 -1
- package/lib/jobs/gemini-client-factory.d.ts +75 -0
- package/lib/services/batch-jobs/batch-jobs.class.d.ts +15 -0
- package/lib/services/batch-jobs/batch-jobs.d.ts +11 -0
- package/lib/services/batch-jobs/batch-jobs.schema.d.ts +726 -0
- package/lib/services/batch-jobs/batch-jobs.shared.d.ts +2 -0
- package/lib/services/batch-jobs/batch-jobs.shared.js +6 -0
- package/lib/services/meta/database-statistics.d.ts +7 -0
- package/lib/services/meta/meta.shared.d.ts +2 -1
- package/lib/services/meta/update-database-statistics.d.ts +2 -0
- package/lib/services/record/record.class.d.ts +2 -1
- package/lib/services/record/record.schema.d.ts +61 -61
- package/package.json +8 -11
package/lib/client.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type { AskAi, AskAiData, AskAiQuery, AskAiPatch, AskAiRequest, AskAiRespo
|
|
|
7
7
|
import './services/tag/tag.shared';
|
|
8
8
|
export type { Tag, TagData, TagQuery, TagPatch } from './services/tag/tag.shared';
|
|
9
9
|
import './services/meta/meta.shared';
|
|
10
|
-
export type { Meta, MetaData, MetaQuery, MetaPatch, ServerInfo, YearlyStatistics, PerCountyStatistics, TagsTopN, PeopleTopN, TagsSimilarityConfigs } from './services/meta/meta.shared';
|
|
10
|
+
export type { Meta, MetaData, MetaQuery, MetaPatch, ServerInfo, YearlyStatistics, PerCountyStatistics, TagsTopN, PeopleTopN, TagsSimilarityConfigs, DatabaseStatistics } from './services/meta/meta.shared';
|
|
11
11
|
import './services/person/person.shared';
|
|
12
12
|
export type { Person, PersonData, PersonQuery, PersonPatch } from './services/person/person.shared';
|
|
13
13
|
import './services/place-names/place-names.shared';
|
package/lib/configuration.d.ts
CHANGED
|
@@ -106,36 +106,84 @@ export declare const configurationSchema: import("@sinclair/typebox").TIntersect
|
|
|
106
106
|
apiKey: import("@sinclair/typebox").TString<string>;
|
|
107
107
|
}>;
|
|
108
108
|
gemini: import("@sinclair/typebox").TObject<{
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
apiKey01: import("@sinclair/typebox").TString<string>;
|
|
112
|
-
}>;
|
|
113
|
-
api02: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
114
|
-
model: import("@sinclair/typebox").TString<string>;
|
|
115
|
-
apiKey02: import("@sinclair/typebox").TString<string>;
|
|
116
|
-
}>>;
|
|
109
|
+
apiKey: import("@sinclair/typebox").TString<string>;
|
|
110
|
+
model: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
117
111
|
}>;
|
|
118
112
|
}>;
|
|
119
113
|
services: import("@sinclair/typebox").TObject<{
|
|
120
114
|
askAi: import("@sinclair/typebox").TObject<{
|
|
115
|
+
ai_model: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
116
|
+
ai_api_key: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
121
117
|
recordsLimit: import("@sinclair/typebox").TNumber;
|
|
122
118
|
}>;
|
|
123
119
|
}>;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
120
|
+
jobs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
121
|
+
crawler: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
122
|
+
enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
123
|
+
schedule: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
124
|
+
timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
125
|
+
internalSecret: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
126
|
+
}>>;
|
|
127
|
+
crawlerBatch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
128
|
+
enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
129
|
+
timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
130
|
+
schedules: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
131
|
+
submit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
132
|
+
process: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
133
|
+
cleanup: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
134
|
+
}>>;
|
|
135
|
+
batch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
136
|
+
use_file_input: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
137
|
+
max_requests_per_batch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
138
|
+
requests_per_batch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
139
|
+
display_name_prefix: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
140
|
+
}>>;
|
|
141
|
+
processing: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
142
|
+
max_retry_attempts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
143
|
+
retry_interval_ms: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
144
|
+
}>>;
|
|
145
|
+
cleanup: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
146
|
+
cleanup_after_days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
147
|
+
keep_failed_jobs_days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
148
|
+
}>>;
|
|
149
|
+
internalSecret: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
150
|
+
}>>;
|
|
151
|
+
analyzer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
152
|
+
enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
153
|
+
schedule: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
154
|
+
timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
155
|
+
internalSecret: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
156
|
+
}>>;
|
|
157
|
+
audit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
158
|
+
enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
159
|
+
schedule: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
160
|
+
timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
161
|
+
internalSecret: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
162
|
+
}>>;
|
|
163
|
+
auditBatch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
164
|
+
enabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
165
|
+
timezone: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
166
|
+
schedules: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
167
|
+
submit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
168
|
+
process: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
169
|
+
cleanup: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
170
|
+
}>>;
|
|
171
|
+
batch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
172
|
+
use_file_input: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
173
|
+
max_requests_per_batch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
174
|
+
requests_per_batch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
175
|
+
display_name_prefix: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
176
|
+
}>>;
|
|
177
|
+
processing: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
178
|
+
max_retry_attempts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
179
|
+
retry_interval_ms: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
180
|
+
}>>;
|
|
181
|
+
cleanup: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
|
|
182
|
+
cleanup_after_days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
183
|
+
keep_failed_jobs_days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
184
|
+
}>>;
|
|
185
|
+
internalSecret: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString<string>>;
|
|
186
|
+
}>>;
|
|
139
187
|
}>>;
|
|
140
188
|
}>]>;
|
|
141
189
|
export type ApplicationConfiguration = Static<typeof configurationSchema>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Application } from
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
2
|
export declare const crawlerEndpoints: (app: Application) => void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
import { type IGeminiClient } from './gemini-client-factory';
|
|
3
|
+
export interface ProcessStats {
|
|
4
|
+
processed: number;
|
|
5
|
+
recordsUpdated: number;
|
|
6
|
+
recordsSkipped: number;
|
|
7
|
+
errors: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Download and parse results from a completed batch job
|
|
11
|
+
*/
|
|
12
|
+
export declare function downloadAndParseResults(client: IGeminiClient, jobName: string, isFileResult: boolean, resultFileName?: string): Promise<any[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Process all pending audit batch jobs
|
|
15
|
+
*/
|
|
16
|
+
export declare function processPendingBatches(app: Application): Promise<ProcessStats>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type BatchAuditStats = {
|
|
2
|
+
submitted?: number;
|
|
3
|
+
processed?: number;
|
|
4
|
+
recordsQueued?: number;
|
|
5
|
+
recordsUpdated?: number;
|
|
6
|
+
recordsSkipped?: number;
|
|
7
|
+
cleanedUp?: number;
|
|
8
|
+
errors?: number;
|
|
9
|
+
};
|
|
10
|
+
export type BatchAuditState = {
|
|
11
|
+
submitRunning: boolean;
|
|
12
|
+
processRunning: boolean;
|
|
13
|
+
lastSubmitAt?: string;
|
|
14
|
+
lastProcessAt?: string;
|
|
15
|
+
lastCleanupAt?: string;
|
|
16
|
+
lastSubmitDurationMs?: number;
|
|
17
|
+
lastProcessDurationMs?: number;
|
|
18
|
+
lastSubmitResult?: BatchAuditStats;
|
|
19
|
+
lastProcessResult?: BatchAuditStats;
|
|
20
|
+
lastError?: string;
|
|
21
|
+
pendingJobs?: number;
|
|
22
|
+
runningJobs?: number;
|
|
23
|
+
succeededJobs?: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function getBatchAuditState(): BatchAuditState;
|
|
26
|
+
export declare function startSubmit(): void;
|
|
27
|
+
export declare function finishSubmit(result: BatchAuditStats, durationMs: number): void;
|
|
28
|
+
export declare function failSubmit(error: unknown, durationMs: number): void;
|
|
29
|
+
export declare function startProcess(): void;
|
|
30
|
+
export declare function finishProcess(result: BatchAuditStats, durationMs: number): void;
|
|
31
|
+
export declare function failProcess(error: unknown, durationMs: number): void;
|
|
32
|
+
export declare function updateJobCounts(pending: number, running: number, succeeded: number): void;
|
|
33
|
+
export declare function updateCleanupTime(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Reset state for testing purposes
|
|
36
|
+
* WARNING: Only use in tests!
|
|
37
|
+
*/
|
|
38
|
+
export declare function resetStateForTesting(): void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
export interface SubmitStats {
|
|
3
|
+
submitted: number;
|
|
4
|
+
recordsQueued: number;
|
|
5
|
+
jobNames: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build the audit prompt for a single record
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildAuditPrompt(record: any): string;
|
|
11
|
+
/**
|
|
12
|
+
* Create a batch request object for audit
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Create a batch request object for audit
|
|
16
|
+
*/
|
|
17
|
+
export declare function createBatchRequest(prompt: string, recordId: number): any;
|
|
18
|
+
/**
|
|
19
|
+
* Submit a new audit batch job
|
|
20
|
+
*/
|
|
21
|
+
export declare function submitAuditBatch(app: Application): Promise<SubmitStats>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
import { type SubmitStats } from './audit-batch-submit';
|
|
3
|
+
import { type ProcessStats } from './audit-batch-process';
|
|
4
|
+
export interface CleanupStats {
|
|
5
|
+
removed: number;
|
|
6
|
+
}
|
|
7
|
+
export interface CycleStats {
|
|
8
|
+
submit: SubmitStats;
|
|
9
|
+
process: ProcessStats;
|
|
10
|
+
cleanup: CleanupStats;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Submit phase: Create and submit new audit batch jobs
|
|
14
|
+
*/
|
|
15
|
+
export declare function submitPhase(app: Application): Promise<SubmitStats>;
|
|
16
|
+
/**
|
|
17
|
+
* Process phase: Poll and process completed audit batch jobs
|
|
18
|
+
*/
|
|
19
|
+
export declare function processPhase(app: Application): Promise<ProcessStats>;
|
|
20
|
+
/**
|
|
21
|
+
* Cleanup phase: Remove old completed/failed batch jobs
|
|
22
|
+
*/
|
|
23
|
+
export declare function cleanupPhase(app: Application): Promise<CleanupStats>;
|
|
24
|
+
/**
|
|
25
|
+
* Get current status of audit batch jobs
|
|
26
|
+
*/
|
|
27
|
+
export declare function getAuditBatchStatus(app: Application): Promise<{
|
|
28
|
+
pending: number;
|
|
29
|
+
running: number;
|
|
30
|
+
succeeded: number;
|
|
31
|
+
failed: number;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Run a complete audit batch cycle (submit + process + cleanup)
|
|
35
|
+
*/
|
|
36
|
+
export declare function runAuditBatchCycle(app: Application): Promise<CycleStats>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
import { type IGeminiClient } from './gemini-client-factory';
|
|
3
|
+
export interface ProcessStats {
|
|
4
|
+
processed: number;
|
|
5
|
+
recordsExtracted: number;
|
|
6
|
+
duplicateCheckJobsCreated: number;
|
|
7
|
+
recordsCreated: number;
|
|
8
|
+
recordsUpdated: number;
|
|
9
|
+
duplicatesChecked: number;
|
|
10
|
+
errors: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Download and parse results from a completed batch job
|
|
14
|
+
*/
|
|
15
|
+
export declare function downloadAndParseResults(client: IGeminiClient, jobName: string, isFileResult: boolean, resultFileName?: string): Promise<any[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Process all pending batch jobs
|
|
18
|
+
*/
|
|
19
|
+
export declare function processPendingBatches(app: Application): Promise<ProcessStats>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type BatchCrawlerStats = {
|
|
2
|
+
submitted?: number;
|
|
3
|
+
processed?: number;
|
|
4
|
+
recordsExtracted?: number;
|
|
5
|
+
recordsCreated?: number;
|
|
6
|
+
recordsUpdated?: number;
|
|
7
|
+
duplicatesChecked?: number;
|
|
8
|
+
cleanedUp?: number;
|
|
9
|
+
errors?: number;
|
|
10
|
+
};
|
|
11
|
+
export type BatchCrawlerState = {
|
|
12
|
+
submitRunning: boolean;
|
|
13
|
+
processRunning: boolean;
|
|
14
|
+
lastSubmitAt?: string;
|
|
15
|
+
lastProcessAt?: string;
|
|
16
|
+
lastCleanupAt?: string;
|
|
17
|
+
lastSubmitDurationMs?: number;
|
|
18
|
+
lastProcessDurationMs?: number;
|
|
19
|
+
lastSubmitResult?: BatchCrawlerStats;
|
|
20
|
+
lastProcessResult?: BatchCrawlerStats;
|
|
21
|
+
lastError?: string;
|
|
22
|
+
pendingJobs?: number;
|
|
23
|
+
runningJobs?: number;
|
|
24
|
+
succeededJobs?: number;
|
|
25
|
+
};
|
|
26
|
+
export declare function getBatchCrawlerState(): BatchCrawlerState;
|
|
27
|
+
export declare function startSubmit(): void;
|
|
28
|
+
export declare function finishSubmit(result: BatchCrawlerStats, durationMs: number): void;
|
|
29
|
+
export declare function failSubmit(error: unknown, durationMs: number): void;
|
|
30
|
+
export declare function startProcess(): void;
|
|
31
|
+
export declare function finishProcess(result: BatchCrawlerStats, durationMs: number): void;
|
|
32
|
+
export declare function failProcess(error: unknown, durationMs: number): void;
|
|
33
|
+
export declare function updateJobCounts(pending: number, running: number, succeeded: number): void;
|
|
34
|
+
export declare function updateCleanupTime(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Reset state for testing purposes
|
|
37
|
+
* WARNING: Only use in tests!
|
|
38
|
+
*/
|
|
39
|
+
export declare function resetStateForTesting(): void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
export interface SubmitStats {
|
|
3
|
+
submitted: number;
|
|
4
|
+
jobNames: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Build the crawl prompt for batch request
|
|
8
|
+
* Reuses the same prompt logic as the synchronous crawler
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildCrawlPrompt(schema: any): string;
|
|
11
|
+
/**
|
|
12
|
+
* Create a batch request object
|
|
13
|
+
*/
|
|
14
|
+
export declare function createBatchRequest(prompt: string, config: any): any;
|
|
15
|
+
/**
|
|
16
|
+
* Submit a new crawl batch job
|
|
17
|
+
*/
|
|
18
|
+
export declare function submitCrawlBatch(app: Application): Promise<SubmitStats>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
import { SubmitStats } from './crawler-batch-submit';
|
|
3
|
+
import { ProcessStats } from './crawler-batch-process';
|
|
4
|
+
import { getBatchCrawlerState, BatchCrawlerState } from './crawler-batch-state';
|
|
5
|
+
export interface CycleStats {
|
|
6
|
+
submitted: number;
|
|
7
|
+
processed: number;
|
|
8
|
+
recordsExtracted: number;
|
|
9
|
+
recordsCreated: number;
|
|
10
|
+
recordsUpdated: number;
|
|
11
|
+
duplicatesChecked: number;
|
|
12
|
+
cleanedUp: number;
|
|
13
|
+
errors: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CleanupStats {
|
|
16
|
+
cleanedUp: number;
|
|
17
|
+
}
|
|
18
|
+
export type { SubmitStats } from './crawler-batch-submit';
|
|
19
|
+
export type { ProcessStats } from './crawler-batch-process';
|
|
20
|
+
export interface BatchStatus {
|
|
21
|
+
id: number;
|
|
22
|
+
job_name: string;
|
|
23
|
+
job_type: string;
|
|
24
|
+
status: string;
|
|
25
|
+
model: string;
|
|
26
|
+
request_count: number;
|
|
27
|
+
created_at: string;
|
|
28
|
+
updated_at: string;
|
|
29
|
+
completed_at?: string;
|
|
30
|
+
error_message?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Submit phase - create and submit new batch jobs
|
|
34
|
+
*/
|
|
35
|
+
export declare function submitPhase(app: Application): Promise<SubmitStats>;
|
|
36
|
+
/**
|
|
37
|
+
* Process phase - poll and process completed batch jobs
|
|
38
|
+
*/
|
|
39
|
+
export declare function processPhase(app: Application): Promise<ProcessStats>;
|
|
40
|
+
/**
|
|
41
|
+
* Cleanup phase - remove old completed jobs
|
|
42
|
+
*/
|
|
43
|
+
export declare function cleanupPhase(app: Application): Promise<CleanupStats>;
|
|
44
|
+
/**
|
|
45
|
+
* Get status of all batch jobs
|
|
46
|
+
*/
|
|
47
|
+
export declare function getBatchStatus(app: Application): Promise<BatchStatus[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Run full batch crawl cycle (submit → process → cleanup)
|
|
50
|
+
*/
|
|
51
|
+
export declare function runBatchCrawlCycle(app: Application): Promise<CycleStats>;
|
|
52
|
+
export { getBatchCrawlerState, BatchCrawlerState };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CrawlStats } from
|
|
1
|
+
import { CrawlStats } from './crawler';
|
|
2
2
|
export type CrawlerState = {
|
|
3
3
|
running: boolean;
|
|
4
4
|
lastRunAt?: string;
|
|
@@ -10,3 +10,8 @@ export declare function getCrawlerState(): CrawlerState;
|
|
|
10
10
|
export declare function startRun(): void;
|
|
11
11
|
export declare function finishRun(result: CrawlStats, durationMs: number): void;
|
|
12
12
|
export declare function failRun(error: unknown, durationMs: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* Reset state for testing purposes
|
|
15
|
+
* WARNING: Only use in tests!
|
|
16
|
+
*/
|
|
17
|
+
export declare function resetStateForTesting(): void;
|
package/lib/jobs/crawler.d.ts
CHANGED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Application } from '../declarations';
|
|
2
|
+
export interface IGeminiClient {
|
|
3
|
+
models: {
|
|
4
|
+
generateContent: (params: any) => Promise<any>;
|
|
5
|
+
};
|
|
6
|
+
batches: {
|
|
7
|
+
create: (params: any) => Promise<any>;
|
|
8
|
+
get: (params: any) => Promise<any>;
|
|
9
|
+
list: (params?: any) => Promise<any>;
|
|
10
|
+
};
|
|
11
|
+
files: {
|
|
12
|
+
download: (params: any) => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Default configuration applied to all Gemini requests
|
|
17
|
+
* Includes Google Search grounding tool
|
|
18
|
+
*/
|
|
19
|
+
export declare const GEMINI_DEFAULT_CONFIG: {
|
|
20
|
+
tools: {
|
|
21
|
+
googleSearch: {};
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Default Gemini model
|
|
26
|
+
*/
|
|
27
|
+
export declare const DEFAULT_GEMINI_MODEL = "gemini-2.5-flash";
|
|
28
|
+
declare class GeminiClientFactory {
|
|
29
|
+
private instance;
|
|
30
|
+
private mockInstance;
|
|
31
|
+
private model;
|
|
32
|
+
/**
|
|
33
|
+
* Initialize the Gemini client from application configuration
|
|
34
|
+
* Call this once at application startup
|
|
35
|
+
*/
|
|
36
|
+
initialize(app: Application): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get the singleton Gemini client instance
|
|
39
|
+
* Throws error if not initialized
|
|
40
|
+
*/
|
|
41
|
+
getClient(): IGeminiClient;
|
|
42
|
+
/**
|
|
43
|
+
* Get the configured model name
|
|
44
|
+
*/
|
|
45
|
+
getModel(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get default configuration with Google Search grounding
|
|
48
|
+
* Use this in all generateContent calls
|
|
49
|
+
*/
|
|
50
|
+
getDefaultConfig(): typeof GEMINI_DEFAULT_CONFIG;
|
|
51
|
+
/**
|
|
52
|
+
* Set a mock client for testing
|
|
53
|
+
* WARNING: Only use in tests!
|
|
54
|
+
*/
|
|
55
|
+
setMockClient(mockClient: IGeminiClient | null): void;
|
|
56
|
+
/**
|
|
57
|
+
* Set mock model for testing
|
|
58
|
+
* WARNING: Only use in tests!
|
|
59
|
+
*/
|
|
60
|
+
setMockModel(model: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Reset the factory (for testing)
|
|
63
|
+
* WARNING: Only use in tests!
|
|
64
|
+
*/
|
|
65
|
+
resetForTesting(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Check if client is initialized
|
|
68
|
+
*/
|
|
69
|
+
isInitialized(): boolean;
|
|
70
|
+
}
|
|
71
|
+
export declare const geminiClientFactory: GeminiClientFactory;
|
|
72
|
+
export declare function getGeminiClient(): IGeminiClient;
|
|
73
|
+
export declare function getGeminiModel(): string;
|
|
74
|
+
export declare function getGeminiConfig(): typeof GEMINI_DEFAULT_CONFIG;
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Params } from '@feathersjs/feathers';
|
|
2
|
+
import { KnexService } from '@feathersjs/knex';
|
|
3
|
+
import type { KnexAdapterParams, KnexAdapterOptions } from '@feathersjs/knex';
|
|
4
|
+
import type { Application } from '../../declarations';
|
|
5
|
+
import type { BatchJobs, BatchJobsData, BatchJobsPatch, BatchJobsQuery } from './batch-jobs.schema';
|
|
6
|
+
export type { BatchJobs, BatchJobsData, BatchJobsPatch, BatchJobsQuery };
|
|
7
|
+
export interface BatchJobsParams extends KnexAdapterParams<BatchJobsQuery> {
|
|
8
|
+
}
|
|
9
|
+
export declare class BatchJobsService<ServiceParams extends Params = BatchJobsParams> extends KnexService<BatchJobs, BatchJobsData, BatchJobsParams, BatchJobsPatch> {
|
|
10
|
+
findPending(): Promise<BatchJobs[]>;
|
|
11
|
+
markCompleted(id: number, resultData: Partial<BatchJobs>): Promise<BatchJobs>;
|
|
12
|
+
markFailed(id: number, error: string): Promise<BatchJobs>;
|
|
13
|
+
cleanupOld(daysOld: number): Promise<number>;
|
|
14
|
+
}
|
|
15
|
+
export declare const getOptions: (app: Application) => KnexAdapterOptions;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Application } from '../../declarations';
|
|
2
|
+
import { BatchJobsService } from './batch-jobs.class';
|
|
3
|
+
import { batchJobsPath } from './batch-jobs.shared';
|
|
4
|
+
export * from './batch-jobs.class';
|
|
5
|
+
export * from './batch-jobs.schema';
|
|
6
|
+
export declare const batchJobs: (app: Application) => void;
|
|
7
|
+
declare module '../../declarations' {
|
|
8
|
+
interface ServiceTypes {
|
|
9
|
+
[batchJobsPath]: BatchJobsService;
|
|
10
|
+
}
|
|
11
|
+
}
|