@cyanautomation/kaseki-agent 1.20.0 → 1.22.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/dist/artifact-metadata.d.ts +1 -13
- package/dist/artifact-metadata.d.ts.map +1 -1
- package/dist/artifact-metadata.js +0 -20
- package/dist/artifact-metadata.js.map +1 -1
- package/dist/cli/commands/ServeCommand.js +2 -2
- package/dist/cli/commands/ServeCommand.js.map +1 -1
- package/dist/job-persistence-manager.d.ts +123 -0
- package/dist/job-persistence-manager.d.ts.map +1 -0
- package/dist/job-persistence-manager.js +351 -0
- package/dist/job-persistence-manager.js.map +1 -0
- package/dist/job-scheduler.d.ts +1 -28
- package/dist/job-scheduler.d.ts.map +1 -1
- package/dist/job-scheduler.js +12 -263
- package/dist/job-scheduler.js.map +1 -1
- package/dist/kaseki-api-config.d.ts.map +1 -1
- package/dist/kaseki-api-config.js +68 -39
- package/dist/kaseki-api-config.js.map +1 -1
- package/dist/kaseki-api-service-wrapper.d.ts +0 -1
- package/dist/kaseki-api-service-wrapper.d.ts.map +1 -1
- package/dist/kaseki-api-service-wrapper.js +0 -2
- package/dist/kaseki-api-service-wrapper.js.map +1 -1
- package/dist/lib/event-timestamp-helpers.d.ts +80 -0
- package/dist/lib/event-timestamp-helpers.d.ts.map +1 -0
- package/dist/lib/event-timestamp-helpers.js +79 -0
- package/dist/lib/event-timestamp-helpers.js.map +1 -0
- package/dist/lib/subprocess-helpers.d.ts +0 -9
- package/dist/lib/subprocess-helpers.d.ts.map +1 -1
- package/dist/lib/subprocess-helpers.js +1 -1
- package/dist/lib/subprocess-helpers.js.map +1 -1
- package/dist/pi-event-filter.js +2 -16
- package/dist/pi-event-filter.js.map +1 -1
- package/dist/pi-progress-stream.js +9 -9
- package/dist/pi-progress-stream.js.map +1 -1
- package/dist/secrets/SecretsManager.d.ts +0 -32
- package/dist/secrets/SecretsManager.d.ts.map +1 -1
- package/dist/secrets/SecretsManager.js +2 -2
- package/dist/secrets/SecretsManager.js.map +1 -1
- package/dist/secrets/host-secrets-reader.d.ts +0 -4
- package/dist/secrets/host-secrets-reader.d.ts.map +1 -1
- package/dist/secrets/host-secrets-reader.js +0 -6
- package/dist/secrets/host-secrets-reader.js.map +1 -1
- package/dist/validation-output-filter.js +65 -10
- package/dist/validation-output-filter.js.map +1 -1
- package/kaseki-agent.sh +22 -2
- package/package.json +3 -1
- package/scripts/kaseki-diagnose-github-failure.sh +1 -1
- package/dist/github-operations-monitor.d.ts +0 -37
- package/dist/github-operations-monitor.d.ts.map +0 -1
- package/dist/github-operations-monitor.js +0 -162
- package/dist/github-operations-monitor.js.map +0 -1
- package/dist/test-utils/log-suppression.d.ts +0 -68
- package/dist/test-utils/log-suppression.d.ts.map +0 -1
- package/dist/test-utils/log-suppression.js +0 -153
- package/dist/test-utils/log-suppression.js.map +0 -1
|
@@ -2,22 +2,10 @@
|
|
|
2
2
|
* Comprehensive artifact metadata registry.
|
|
3
3
|
* Defines all available artifacts with their properties for discovery and triage.
|
|
4
4
|
*/
|
|
5
|
-
import { ArtifactMetadataDefinition
|
|
5
|
+
import { ArtifactMetadataDefinition } from './kaseki-api-types';
|
|
6
6
|
/**
|
|
7
7
|
* All available artifacts organized by category and availability.
|
|
8
8
|
* Used by API routes to enumerate, filter, and serve artifacts.
|
|
9
9
|
*/
|
|
10
10
|
export declare const ARTIFACT_METADATA_REGISTRY: Record<string, ArtifactMetadataDefinition>;
|
|
11
|
-
/**
|
|
12
|
-
* Get artifact metadata by name.
|
|
13
|
-
*/
|
|
14
|
-
export declare function getArtifactMetadata(name: string): ArtifactMetadataDefinition | undefined;
|
|
15
|
-
/**
|
|
16
|
-
* Get all artifact names in triage order (lowest triageOrder first).
|
|
17
|
-
*/
|
|
18
|
-
export declare function getArtifactsByTriageOrder(): string[];
|
|
19
|
-
/**
|
|
20
|
-
* Filter artifacts by availability.
|
|
21
|
-
*/
|
|
22
|
-
export declare function getArtifactsByAvailability(availability: ArtifactAvailability): ArtifactMetadataDefinition[];
|
|
23
11
|
//# sourceMappingURL=artifact-metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-metadata.d.ts","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,0BAA0B,
|
|
1
|
+
{"version":3,"file":"artifact-metadata.d.ts","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,0BAA0B,EAAwB,MAAM,oBAAoB,CAAC;AAEtF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAsOjF,CAAC"}
|
|
@@ -215,24 +215,4 @@ export const ARTIFACT_METADATA_REGISTRY = {
|
|
|
215
215
|
sizeHint: 'small',
|
|
216
216
|
},
|
|
217
217
|
};
|
|
218
|
-
/**
|
|
219
|
-
* Get artifact metadata by name.
|
|
220
|
-
*/
|
|
221
|
-
export function getArtifactMetadata(name) {
|
|
222
|
-
return ARTIFACT_METADATA_REGISTRY[name];
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Get all artifact names in triage order (lowest triageOrder first).
|
|
226
|
-
*/
|
|
227
|
-
export function getArtifactsByTriageOrder() {
|
|
228
|
-
return Object.values(ARTIFACT_METADATA_REGISTRY)
|
|
229
|
-
.sort((a, b) => (a.triageOrder ?? 999) - (b.triageOrder ?? 999))
|
|
230
|
-
.map((m) => m.name);
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Filter artifacts by availability.
|
|
234
|
-
*/
|
|
235
|
-
export function getArtifactsByAvailability(availability) {
|
|
236
|
-
return Object.values(ARTIFACT_METADATA_REGISTRY).filter((m) => m.availability === availability);
|
|
237
|
-
}
|
|
238
218
|
//# sourceMappingURL=artifact-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-metadata.js","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"artifact-metadata.js","sourceRoot":"","sources":["../src/artifact-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Start kaseki API service
|
|
4
4
|
*/
|
|
5
5
|
import { BaseCommand } from '../BaseCommand.js';
|
|
6
|
-
import
|
|
6
|
+
import KasekiAPIServiceImpl from '../../kaseki-api-service-wrapper.js';
|
|
7
7
|
import { createLogger } from '../../logger.js';
|
|
8
8
|
const logger = createLogger('serve-cmd');
|
|
9
9
|
export class ServeCommand extends BaseCommand {
|
|
@@ -18,7 +18,7 @@ export class ServeCommand extends BaseCommand {
|
|
|
18
18
|
const apiKeysEnv = process.env.KASEKI_API_KEYS || '';
|
|
19
19
|
const apiKeys = apiKeysEnv ? apiKeysEnv.split(',') : [];
|
|
20
20
|
// Create and start service
|
|
21
|
-
const apiService = new
|
|
21
|
+
const apiService = new KasekiAPIServiceImpl({
|
|
22
22
|
port,
|
|
23
23
|
apiKeys,
|
|
24
24
|
logLevel: this.configManager.get('debug.log_level', 'info'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServeCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ServeCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"ServeCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/ServeCommand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,oBAAoB,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAEzC,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,KAAK,CAAC,OAAO,CAAC,IAAc;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CACnB,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,EACjE,EAAE,CACH,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAEvC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAEhC,0CAA0C;YAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAExD,2BAA2B;YAC3B,MAAM,UAAU,GAAG,IAAI,oBAAoB,CAAC;gBAC1C,IAAI;gBACJ,OAAO;gBACP,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC;aAC5D,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YAEzB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAElD,yBAAyB;YACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;oBAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;oBACpC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBACjC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACb,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;oBAC/B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;oBACpC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBACjC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACb,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job persistence manager for kaseki-agent.
|
|
3
|
+
* Encapsulates all file I/O, job index management, and locking logic.
|
|
4
|
+
* Separates persistence concerns from job scheduling logic.
|
|
5
|
+
*/
|
|
6
|
+
import { Job } from './kaseki-api-types';
|
|
7
|
+
import { KasekiApiConfig } from './kaseki-api-config';
|
|
8
|
+
/**
|
|
9
|
+
* Persisted job format (with dates as ISO strings instead of Date objects).
|
|
10
|
+
*/
|
|
11
|
+
export type PersistedJob = Omit<Job, 'createdAt' | 'startedAt' | 'completedAt' | 'timeout'> & {
|
|
12
|
+
createdAt: string;
|
|
13
|
+
startedAt?: string;
|
|
14
|
+
completedAt?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Job persistence manager handles all file I/O and job index operations.
|
|
18
|
+
* Manages unique instance ID allocation, job index persistence, and locking.
|
|
19
|
+
*/
|
|
20
|
+
export declare class JobPersistenceManager {
|
|
21
|
+
private indexPath;
|
|
22
|
+
private nextIdPath;
|
|
23
|
+
private idLockPath;
|
|
24
|
+
private indexLockPath;
|
|
25
|
+
private config;
|
|
26
|
+
private jobs;
|
|
27
|
+
constructor(config: KasekiApiConfig);
|
|
28
|
+
/**
|
|
29
|
+
* Load persisted jobs from index file.
|
|
30
|
+
* Returns array of loaded jobs and queued jobs that should be restarted.
|
|
31
|
+
*/
|
|
32
|
+
loadPersistedJobs(): {
|
|
33
|
+
jobs: Job[];
|
|
34
|
+
queuedJobs: Job[];
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Persist all jobs to index file.
|
|
38
|
+
* Merges with existing index, applies retention policy, and writes atomically.
|
|
39
|
+
*/
|
|
40
|
+
persistJobs(allJobs: Job[]): void;
|
|
41
|
+
/**
|
|
42
|
+
* Generate a unique, durable instance ID.
|
|
43
|
+
* Format: `kaseki-N`, matching run-kaseki.sh and result directory names.
|
|
44
|
+
*/
|
|
45
|
+
generateInstanceId(existingIds: string[]): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Get result directory path for a job.
|
|
48
|
+
*/
|
|
49
|
+
getResultDir(id: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Serialize a job for persistence (dates → ISO strings, remove non-persistent fields).
|
|
52
|
+
*/
|
|
53
|
+
private serializeJob;
|
|
54
|
+
/**
|
|
55
|
+
* Deserialize a persisted job (ISO strings → dates).
|
|
56
|
+
*/
|
|
57
|
+
private deserializeJob;
|
|
58
|
+
/**
|
|
59
|
+
* Read the current job index from disk.
|
|
60
|
+
*/
|
|
61
|
+
private readPersistedJobsIndex;
|
|
62
|
+
/**
|
|
63
|
+
* Merge existing persisted jobs with incoming jobs, applying retention policy.
|
|
64
|
+
*/
|
|
65
|
+
private mergePersistedJobs;
|
|
66
|
+
/**
|
|
67
|
+
* Decide which of two persisted job versions is more recent.
|
|
68
|
+
*/
|
|
69
|
+
private selectMostRecentPersistedJob;
|
|
70
|
+
/**
|
|
71
|
+
* Check if a persisted job is in a terminal state.
|
|
72
|
+
*/
|
|
73
|
+
private isTerminalPersistedJob;
|
|
74
|
+
/**
|
|
75
|
+
* Compare persisted jobs by terminal recency (most recent first).
|
|
76
|
+
*/
|
|
77
|
+
private comparePersistedJobsByTerminalRecency;
|
|
78
|
+
/**
|
|
79
|
+
* Get the "updated at" timestamp for a persisted job (completed → started → created).
|
|
80
|
+
*/
|
|
81
|
+
private persistedJobUpdatedAt;
|
|
82
|
+
/**
|
|
83
|
+
* Compare persisted jobs by creation time (newest first).
|
|
84
|
+
*/
|
|
85
|
+
private comparePersistedJobsByCreatedAt;
|
|
86
|
+
/**
|
|
87
|
+
* Check if index should be written in compact form (single-line JSON).
|
|
88
|
+
*/
|
|
89
|
+
private shouldWriteCompactIndex;
|
|
90
|
+
/**
|
|
91
|
+
* Get the configured max entries for job index.
|
|
92
|
+
*/
|
|
93
|
+
private getJobIndexMaxEntries;
|
|
94
|
+
/**
|
|
95
|
+
* Read the next instance ID to allocate from persisted state.
|
|
96
|
+
*/
|
|
97
|
+
private readNextId;
|
|
98
|
+
/**
|
|
99
|
+
* Read a positive integer from a file.
|
|
100
|
+
*/
|
|
101
|
+
private readPositiveIntFile;
|
|
102
|
+
/**
|
|
103
|
+
* Discover the next instance number by scanning job IDs and result directory.
|
|
104
|
+
*/
|
|
105
|
+
private discoverNextId;
|
|
106
|
+
/**
|
|
107
|
+
* Parse instance number from kaseki ID (e.g., "kaseki-42" → 42).
|
|
108
|
+
*/
|
|
109
|
+
private parseInstanceNumber;
|
|
110
|
+
/**
|
|
111
|
+
* Acquire a lock and execute a callback asynchronously.
|
|
112
|
+
*/
|
|
113
|
+
private withIdLock;
|
|
114
|
+
/**
|
|
115
|
+
* Acquire a lock and execute a callback asynchronously.
|
|
116
|
+
*/
|
|
117
|
+
private withLock;
|
|
118
|
+
/**
|
|
119
|
+
* Acquire a lock and execute a callback synchronously.
|
|
120
|
+
*/
|
|
121
|
+
private withSyncLock;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=job-persistence-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-persistence-manager.d.ts","sourceRoot":"","sources":["../src/job-persistence-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAiC,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAErF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC,GAAG;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAA0B;gBAE1B,MAAM,EAAE,eAAe;IAQnC;;;OAGG;IACH,iBAAiB,IAAI;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,UAAU,EAAE,GAAG,EAAE,CAAA;KAAE;IAwCvD;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI;IAwBjC;;;OAGG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBhE;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAIhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAMpC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;IACH,OAAO,CAAC,qCAAqC;IAQ7C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAIvC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;YACW,QAAQ;IA4BtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAkBrB"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job persistence manager for kaseki-agent.
|
|
3
|
+
* Encapsulates all file I/O, job index management, and locking logic.
|
|
4
|
+
* Separates persistence concerns from job scheduling logic.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { DEFAULT_JOB_INDEX_MAX_ENTRIES } from './kaseki-api-config.js';
|
|
9
|
+
/**
|
|
10
|
+
* Job persistence manager handles all file I/O and job index operations.
|
|
11
|
+
* Manages unique instance ID allocation, job index persistence, and locking.
|
|
12
|
+
*/
|
|
13
|
+
export class JobPersistenceManager {
|
|
14
|
+
indexPath;
|
|
15
|
+
nextIdPath;
|
|
16
|
+
idLockPath;
|
|
17
|
+
indexLockPath;
|
|
18
|
+
config;
|
|
19
|
+
jobs = new Map();
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.indexPath = path.join(config.resultsDir, '.kaseki-api-jobs.json');
|
|
23
|
+
this.nextIdPath = path.join(config.resultsDir, '.kaseki-api-next-id');
|
|
24
|
+
this.idLockPath = path.join(config.resultsDir, '.kaseki-api-id.lock');
|
|
25
|
+
this.indexLockPath = path.join(config.resultsDir, '.kaseki-api-jobs.lock');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load persisted jobs from index file.
|
|
29
|
+
* Returns array of loaded jobs and queued jobs that should be restarted.
|
|
30
|
+
*/
|
|
31
|
+
loadPersistedJobs() {
|
|
32
|
+
const jobs = [];
|
|
33
|
+
const queuedJobs = [];
|
|
34
|
+
try {
|
|
35
|
+
this.withSyncLock(this.indexLockPath, 'Kaseki jobs index', () => {
|
|
36
|
+
if (!fs.existsSync(this.indexPath)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(fs.readFileSync(this.indexPath, 'utf-8'));
|
|
41
|
+
for (const persisted of parsed.jobs || []) {
|
|
42
|
+
const job = this.deserializeJob(persisted);
|
|
43
|
+
if (job.status === 'running') {
|
|
44
|
+
job.status = 'failed';
|
|
45
|
+
job.exitCode = 143;
|
|
46
|
+
job.failureClass = 'api_restart';
|
|
47
|
+
job.error = 'API service restarted while job was running';
|
|
48
|
+
job.completedAt = job.completedAt || new Date();
|
|
49
|
+
job.finalized = true;
|
|
50
|
+
}
|
|
51
|
+
if (job.status === 'queued') {
|
|
52
|
+
queuedJobs.push(job);
|
|
53
|
+
}
|
|
54
|
+
jobs.push(job);
|
|
55
|
+
this.jobs.set(job.id, job);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// A corrupt index should not prevent the API from starting; existing
|
|
60
|
+
// artifacts remain available on disk for direct inspection.
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Lock contention during startup is best-effort; a future persist/load cycle will reconcile state.
|
|
66
|
+
}
|
|
67
|
+
return { jobs, queuedJobs };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Persist all jobs to index file.
|
|
71
|
+
* Merges with existing index, applies retention policy, and writes atomically.
|
|
72
|
+
*/
|
|
73
|
+
persistJobs(allJobs) {
|
|
74
|
+
try {
|
|
75
|
+
this.withSyncLock(this.indexLockPath, 'Kaseki jobs index', () => {
|
|
76
|
+
fs.mkdirSync(this.config.resultsDir, { recursive: true });
|
|
77
|
+
const current = this.readPersistedJobsIndex();
|
|
78
|
+
const merged = this.mergePersistedJobs(current.jobs || [], allJobs.map((job) => this.serializeJob(job)));
|
|
79
|
+
const payload = {
|
|
80
|
+
version: 1,
|
|
81
|
+
updatedAt: new Date().toISOString(),
|
|
82
|
+
jobs: merged,
|
|
83
|
+
};
|
|
84
|
+
const tmpPath = `${this.indexPath}.tmp`;
|
|
85
|
+
const json = this.shouldWriteCompactIndex(merged) ? JSON.stringify(payload) : JSON.stringify(payload, null, 2);
|
|
86
|
+
fs.writeFileSync(tmpPath, `${json}\n`, { mode: 0o600 });
|
|
87
|
+
fs.renameSync(tmpPath, this.indexPath);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Keep scheduler progress alive even if persistence is unavailable.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Generate a unique, durable instance ID.
|
|
96
|
+
* Format: `kaseki-N`, matching run-kaseki.sh and result directory names.
|
|
97
|
+
*/
|
|
98
|
+
async generateInstanceId(existingIds) {
|
|
99
|
+
return this.withIdLock(async () => {
|
|
100
|
+
const jobIds = new Set(existingIds);
|
|
101
|
+
let nextId = this.readNextId(jobIds);
|
|
102
|
+
const maxAttempts = 10000;
|
|
103
|
+
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
104
|
+
const id = `kaseki-${nextId}`;
|
|
105
|
+
if (!jobIds.has(id) && !fs.existsSync(this.getResultDir(id))) {
|
|
106
|
+
fs.writeFileSync(this.nextIdPath, `${nextId + 1}\n`, { mode: 0o600 });
|
|
107
|
+
return id;
|
|
108
|
+
}
|
|
109
|
+
nextId += 1;
|
|
110
|
+
}
|
|
111
|
+
throw new Error(`Failed to allocate unique job ID after ${maxAttempts} attempts`);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get result directory path for a job.
|
|
116
|
+
*/
|
|
117
|
+
getResultDir(id) {
|
|
118
|
+
return path.join(this.config.resultsDir, id);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Serialize a job for persistence (dates → ISO strings, remove non-persistent fields).
|
|
122
|
+
*/
|
|
123
|
+
serializeJob(job) {
|
|
124
|
+
const serializableJob = { ...job };
|
|
125
|
+
delete serializableJob.timeout;
|
|
126
|
+
return {
|
|
127
|
+
...serializableJob,
|
|
128
|
+
createdAt: job.createdAt.toISOString(),
|
|
129
|
+
startedAt: job.startedAt?.toISOString(),
|
|
130
|
+
completedAt: job.completedAt?.toISOString(),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Deserialize a persisted job (ISO strings → dates).
|
|
135
|
+
*/
|
|
136
|
+
deserializeJob(job) {
|
|
137
|
+
return {
|
|
138
|
+
...job,
|
|
139
|
+
createdAt: new Date(job.createdAt),
|
|
140
|
+
startedAt: job.startedAt ? new Date(job.startedAt) : undefined,
|
|
141
|
+
completedAt: job.completedAt ? new Date(job.completedAt) : undefined,
|
|
142
|
+
resultDir: job.resultDir || this.getResultDir(job.id),
|
|
143
|
+
finalized: job.status === 'completed' || job.status === 'failed' ? true : job.finalized,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Read the current job index from disk.
|
|
148
|
+
*/
|
|
149
|
+
readPersistedJobsIndex() {
|
|
150
|
+
if (!fs.existsSync(this.indexPath)) {
|
|
151
|
+
return {};
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
return JSON.parse(fs.readFileSync(this.indexPath, 'utf-8'));
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Merge existing persisted jobs with incoming jobs, applying retention policy.
|
|
162
|
+
*/
|
|
163
|
+
mergePersistedJobs(existing, incoming) {
|
|
164
|
+
const byId = new Map();
|
|
165
|
+
for (const job of existing) {
|
|
166
|
+
byId.set(job.id, job);
|
|
167
|
+
}
|
|
168
|
+
for (const job of incoming) {
|
|
169
|
+
const prev = byId.get(job.id);
|
|
170
|
+
if (!prev) {
|
|
171
|
+
byId.set(job.id, job);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
byId.set(job.id, this.selectMostRecentPersistedJob(prev, job));
|
|
175
|
+
}
|
|
176
|
+
const activeJobs = [];
|
|
177
|
+
const terminalJobs = [];
|
|
178
|
+
for (const job of byId.values()) {
|
|
179
|
+
if (this.isTerminalPersistedJob(job)) {
|
|
180
|
+
terminalJobs.push(job);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
activeJobs.push(job);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const retainedTerminalJobs = terminalJobs
|
|
187
|
+
.sort((a, b) => this.comparePersistedJobsByTerminalRecency(a, b))
|
|
188
|
+
.slice(0, this.getJobIndexMaxEntries());
|
|
189
|
+
return [...activeJobs, ...retainedTerminalJobs].sort((a, b) => this.comparePersistedJobsByCreatedAt(a, b));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Decide which of two persisted job versions is more recent.
|
|
193
|
+
*/
|
|
194
|
+
selectMostRecentPersistedJob(prev, job) {
|
|
195
|
+
const prevCompleted = new Date(prev.completedAt || 0).getTime();
|
|
196
|
+
const jobCompleted = new Date(job.completedAt || 0).getTime();
|
|
197
|
+
return jobCompleted > prevCompleted ? job : prev;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if a persisted job is in a terminal state.
|
|
201
|
+
*/
|
|
202
|
+
isTerminalPersistedJob(job) {
|
|
203
|
+
return job.status === 'completed' || job.status === 'failed';
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Compare persisted jobs by terminal recency (most recent first).
|
|
207
|
+
*/
|
|
208
|
+
comparePersistedJobsByTerminalRecency(a, b) {
|
|
209
|
+
const updatedDiff = this.persistedJobUpdatedAt(b) - this.persistedJobUpdatedAt(a);
|
|
210
|
+
if (updatedDiff !== 0) {
|
|
211
|
+
return updatedDiff;
|
|
212
|
+
}
|
|
213
|
+
return this.comparePersistedJobsByCreatedAt(a, b);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get the "updated at" timestamp for a persisted job (completed → started → created).
|
|
217
|
+
*/
|
|
218
|
+
persistedJobUpdatedAt(job) {
|
|
219
|
+
const completed = job.completedAt ? new Date(job.completedAt).getTime() : 0;
|
|
220
|
+
const started = job.startedAt ? new Date(job.startedAt).getTime() : 0;
|
|
221
|
+
return Math.max(completed, started);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Compare persisted jobs by creation time (newest first).
|
|
225
|
+
*/
|
|
226
|
+
comparePersistedJobsByCreatedAt(a, b) {
|
|
227
|
+
return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if index should be written in compact form (single-line JSON).
|
|
231
|
+
*/
|
|
232
|
+
shouldWriteCompactIndex(jobs) {
|
|
233
|
+
return jobs.length >= this.getJobIndexMaxEntries();
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get the configured max entries for job index.
|
|
237
|
+
*/
|
|
238
|
+
getJobIndexMaxEntries() {
|
|
239
|
+
return this.config.jobIndexMaxEntries ?? DEFAULT_JOB_INDEX_MAX_ENTRIES;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Read the next instance ID to allocate from persisted state.
|
|
243
|
+
*/
|
|
244
|
+
readNextId(jobIds) {
|
|
245
|
+
const persisted = this.readPositiveIntFile(this.nextIdPath);
|
|
246
|
+
const discovered = this.discoverNextId(jobIds);
|
|
247
|
+
return Math.max(persisted ?? 1, discovered);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Read a positive integer from a file.
|
|
251
|
+
*/
|
|
252
|
+
readPositiveIntFile(filePath) {
|
|
253
|
+
try {
|
|
254
|
+
const value = parseInt(fs.readFileSync(filePath, 'utf-8').trim(), 10);
|
|
255
|
+
return Number.isInteger(value) && value > 0 ? value : undefined;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Discover the next instance number by scanning job IDs and result directory.
|
|
263
|
+
*/
|
|
264
|
+
discoverNextId(jobIds) {
|
|
265
|
+
let maxId = 0;
|
|
266
|
+
for (const id of jobIds) {
|
|
267
|
+
maxId = Math.max(maxId, this.parseInstanceNumber(id) ?? 0);
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
for (const entry of fs.readdirSync(this.config.resultsDir, { withFileTypes: true })) {
|
|
271
|
+
if (entry.isDirectory()) {
|
|
272
|
+
maxId = Math.max(maxId, this.parseInstanceNumber(entry.name) ?? 0);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Missing/unreadable results dir is handled elsewhere; keep allocation best-effort.
|
|
278
|
+
}
|
|
279
|
+
return maxId + 1;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Parse instance number from kaseki ID (e.g., "kaseki-42" → 42).
|
|
283
|
+
*/
|
|
284
|
+
parseInstanceNumber(id) {
|
|
285
|
+
const match = /^kaseki-(\d+)$/.exec(id);
|
|
286
|
+
if (!match) {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
const value = Number.parseInt(match[1], 10);
|
|
290
|
+
return Number.isFinite(value) && value > 0 ? value : null;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Acquire a lock and execute a callback asynchronously.
|
|
294
|
+
*/
|
|
295
|
+
withIdLock(callback) {
|
|
296
|
+
return this.withLock(this.idLockPath, 'Kaseki instance ID', callback);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Acquire a lock and execute a callback asynchronously.
|
|
300
|
+
*/
|
|
301
|
+
async withLock(lockPath, lockName, callback) {
|
|
302
|
+
fs.mkdirSync(this.config.resultsDir, { recursive: true });
|
|
303
|
+
let acquired = false;
|
|
304
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
305
|
+
try {
|
|
306
|
+
fs.mkdirSync(lockPath, { mode: 0o700 });
|
|
307
|
+
acquired = true;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
const code = err.code;
|
|
312
|
+
if (code !== 'EEXIST') {
|
|
313
|
+
throw err;
|
|
314
|
+
}
|
|
315
|
+
await new Promise((resolve) => setTimeout(resolve, 25));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (!acquired) {
|
|
319
|
+
throw new Error(`Failed to acquire ${lockName} lock: ${lockPath}`);
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
return await callback();
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
fs.rmSync(lockPath, { recursive: true, force: true });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Acquire a lock and execute a callback synchronously.
|
|
330
|
+
*/
|
|
331
|
+
withSyncLock(lockPath, lockName, callback) {
|
|
332
|
+
fs.mkdirSync(this.config.resultsDir, { recursive: true });
|
|
333
|
+
try {
|
|
334
|
+
fs.mkdirSync(lockPath, { mode: 0o700 });
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
const code = err.code;
|
|
338
|
+
if (code === 'EEXIST') {
|
|
339
|
+
throw new Error(`Failed to acquire ${lockName} lock: ${lockPath}`);
|
|
340
|
+
}
|
|
341
|
+
throw err;
|
|
342
|
+
}
|
|
343
|
+
try {
|
|
344
|
+
return callback();
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
fs.rmSync(lockPath, { recursive: true, force: true });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=job-persistence-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-persistence-manager.js","sourceRoot":"","sources":["../src/job-persistence-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/job-scheduler.d.ts
CHANGED
|
@@ -17,14 +17,11 @@ export declare class JobScheduler {
|
|
|
17
17
|
private timeoutKillTimers;
|
|
18
18
|
private liveProgressCache;
|
|
19
19
|
private config;
|
|
20
|
-
private indexPath;
|
|
21
|
-
private nextIdPath;
|
|
22
|
-
private idLockPath;
|
|
23
|
-
private indexLockPath;
|
|
24
20
|
private logger;
|
|
25
21
|
private webhookManager;
|
|
26
22
|
private failureArtifactWriter;
|
|
27
23
|
private artifactCache?;
|
|
24
|
+
private persistenceManager;
|
|
28
25
|
private static readonly SHUTDOWN_GRACE_MS;
|
|
29
26
|
constructor(config: KasekiApiConfig, webhookManager: WebhookManager, artifactCache?: Pick<ResultCache, 'clearForJob'>);
|
|
30
27
|
/**
|
|
@@ -69,18 +66,6 @@ export declare class JobScheduler {
|
|
|
69
66
|
* Clean up after job completion.
|
|
70
67
|
*/
|
|
71
68
|
private completeJob;
|
|
72
|
-
/**
|
|
73
|
-
* Generate a unique, durable instance ID.
|
|
74
|
-
*
|
|
75
|
-
* Format: `kaseki-N`, matching run-kaseki.sh and result directory names.
|
|
76
|
-
*/
|
|
77
|
-
private generateInstanceId;
|
|
78
|
-
private withIdLock;
|
|
79
|
-
private withLock;
|
|
80
|
-
private withSyncLock;
|
|
81
|
-
private readNextId;
|
|
82
|
-
private readPositiveIntFile;
|
|
83
|
-
private discoverNextId;
|
|
84
69
|
private cleanupContainer;
|
|
85
70
|
getLiveDockerLogTail(id: string, lines?: number): string | null;
|
|
86
71
|
getLiveProgressEvents(id: string, tail?: number): Array<Record<string, unknown>>;
|
|
@@ -90,20 +75,8 @@ export declare class JobScheduler {
|
|
|
90
75
|
private clearLiveProgressCache;
|
|
91
76
|
private getLiveProgressCacheTtlMs;
|
|
92
77
|
private getResultDir;
|
|
93
|
-
private serializeJob;
|
|
94
|
-
private deserializeJob;
|
|
95
78
|
private loadPersistedJobs;
|
|
96
|
-
private parseInstanceNumber;
|
|
97
79
|
private persistJobs;
|
|
98
|
-
private readPersistedJobsIndex;
|
|
99
|
-
private mergePersistedJobs;
|
|
100
|
-
private shouldWriteCompactIndex;
|
|
101
|
-
private getJobIndexMaxEntries;
|
|
102
|
-
private isTerminalPersistedJob;
|
|
103
|
-
private comparePersistedJobsByTerminalRecency;
|
|
104
|
-
private comparePersistedJobsByCreatedAt;
|
|
105
|
-
private selectMostRecentPersistedJob;
|
|
106
|
-
private persistedJobUpdatedAt;
|
|
107
80
|
/**
|
|
108
81
|
* Get queue status.
|
|
109
82
|
*/
|