@seenn/node 0.1.1 → 0.2.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.
- package/dist/client.d.ts +49 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +124 -2
- package/dist/client.js.map +1 -1
- package/dist/errors.js +0 -6
- package/dist/errors.js.map +1 -1
- package/dist/http.js +0 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/job.d.ts +41 -1
- package/dist/job.d.ts.map +1 -1
- package/dist/job.js +64 -18
- package/dist/job.js.map +1 -1
- package/dist/types.d.ts +144 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -1
- package/src/client.ts +150 -1
- package/src/index.ts +12 -0
- package/src/job.ts +85 -0
- package/src/types.ts +159 -1
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type ChildProgressMode = 'average' | 'weighted' | 'sequential';
|
|
1
2
|
export interface StartJobParams {
|
|
2
3
|
/** Unique job type identifier (e.g., 'video-generation', 'image-processing') */
|
|
3
4
|
jobType: string;
|
|
@@ -5,16 +6,28 @@ export interface StartJobParams {
|
|
|
5
6
|
userId: string;
|
|
6
7
|
/** Human-readable title for the job */
|
|
7
8
|
title: string;
|
|
9
|
+
/** Optional version for ETA tracking (e.g., '1.0', '2.1.0') */
|
|
10
|
+
version?: string;
|
|
8
11
|
/** Optional metadata (max 10KB) */
|
|
9
12
|
metadata?: Record<string, unknown>;
|
|
10
13
|
/** Optional initial queue information */
|
|
11
14
|
queue?: QueueInfo;
|
|
12
15
|
/** Optional initial stage information */
|
|
13
16
|
stage?: StageInfo;
|
|
14
|
-
/** Optional estimated completion time (ISO 8601) */
|
|
17
|
+
/** Optional estimated completion time (ISO 8601) - overrides auto ETA */
|
|
15
18
|
estimatedCompletionAt?: string;
|
|
19
|
+
/** Optional estimated duration in ms - overrides auto ETA */
|
|
20
|
+
estimatedDuration?: number;
|
|
16
21
|
/** Optional TTL in seconds (default: 30 days) */
|
|
17
22
|
ttlSeconds?: number;
|
|
23
|
+
/** Parent job ID (for child jobs) */
|
|
24
|
+
parentJobId?: string;
|
|
25
|
+
/** 0-based index within parent (for child jobs) */
|
|
26
|
+
childIndex?: number;
|
|
27
|
+
/** Total number of children (for parent jobs) */
|
|
28
|
+
totalChildren?: number;
|
|
29
|
+
/** How to calculate parent progress from children (default: 'average') */
|
|
30
|
+
childProgressMode?: ChildProgressMode;
|
|
18
31
|
}
|
|
19
32
|
export interface ProgressParams {
|
|
20
33
|
/** Progress percentage (0-100) */
|
|
@@ -76,12 +89,97 @@ export interface JobError {
|
|
|
76
89
|
/** Additional error details */
|
|
77
90
|
details?: Record<string, unknown>;
|
|
78
91
|
}
|
|
92
|
+
/** Summary of a child job */
|
|
93
|
+
export interface ChildJobSummary {
|
|
94
|
+
id: string;
|
|
95
|
+
childIndex: number;
|
|
96
|
+
title: string;
|
|
97
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
98
|
+
progress: number;
|
|
99
|
+
message?: string;
|
|
100
|
+
result?: JobResult;
|
|
101
|
+
error?: JobError;
|
|
102
|
+
createdAt: string;
|
|
103
|
+
updatedAt: string;
|
|
104
|
+
completedAt?: string;
|
|
105
|
+
}
|
|
106
|
+
/** Parent info included in child job responses */
|
|
107
|
+
export interface ParentInfo {
|
|
108
|
+
parentJobId: string;
|
|
109
|
+
childIndex: number;
|
|
110
|
+
}
|
|
111
|
+
/** Children stats included in parent job responses */
|
|
112
|
+
export interface ChildrenStats {
|
|
113
|
+
total: number;
|
|
114
|
+
completed: number;
|
|
115
|
+
failed: number;
|
|
116
|
+
running: number;
|
|
117
|
+
pending: number;
|
|
118
|
+
}
|
|
119
|
+
/** Parameters for creating a parent job */
|
|
120
|
+
export interface CreateParentParams {
|
|
121
|
+
/** Unique job type identifier */
|
|
122
|
+
jobType: string;
|
|
123
|
+
/** User ID who owns this job */
|
|
124
|
+
userId: string;
|
|
125
|
+
/** Human-readable title for the parent job */
|
|
126
|
+
title: string;
|
|
127
|
+
/** Total number of children this parent will have */
|
|
128
|
+
childCount: number;
|
|
129
|
+
/** How to calculate parent progress from children (default: 'average') */
|
|
130
|
+
childProgressMode?: ChildProgressMode;
|
|
131
|
+
/** Optional metadata */
|
|
132
|
+
metadata?: Record<string, unknown>;
|
|
133
|
+
/** Optional TTL in seconds */
|
|
134
|
+
ttlSeconds?: number;
|
|
135
|
+
}
|
|
136
|
+
/** Parameters for creating a child job */
|
|
137
|
+
export interface CreateChildParams {
|
|
138
|
+
/** Parent job ID */
|
|
139
|
+
parentJobId: string;
|
|
140
|
+
/** 0-based index within parent */
|
|
141
|
+
childIndex: number;
|
|
142
|
+
/** Unique job type identifier */
|
|
143
|
+
jobType: string;
|
|
144
|
+
/** User ID who owns this job */
|
|
145
|
+
userId: string;
|
|
146
|
+
/** Human-readable title for the child job */
|
|
147
|
+
title: string;
|
|
148
|
+
/** Optional metadata */
|
|
149
|
+
metadata?: Record<string, unknown>;
|
|
150
|
+
/** Optional TTL in seconds */
|
|
151
|
+
ttlSeconds?: number;
|
|
152
|
+
}
|
|
153
|
+
/** Parameters for creating a batch of jobs */
|
|
154
|
+
export interface CreateBatchParams {
|
|
155
|
+
/** Unique job type identifier for all jobs */
|
|
156
|
+
jobType: string;
|
|
157
|
+
/** User ID who owns these jobs */
|
|
158
|
+
userId: string;
|
|
159
|
+
/** Human-readable title for the parent job */
|
|
160
|
+
parentTitle: string;
|
|
161
|
+
/** Titles for each child job */
|
|
162
|
+
childTitles: string[];
|
|
163
|
+
/** How to calculate parent progress from children (default: 'average') */
|
|
164
|
+
childProgressMode?: ChildProgressMode;
|
|
165
|
+
/** Optional metadata for parent job */
|
|
166
|
+
metadata?: Record<string, unknown>;
|
|
167
|
+
/** Optional TTL in seconds */
|
|
168
|
+
ttlSeconds?: number;
|
|
169
|
+
}
|
|
170
|
+
/** Parent job with all its children */
|
|
171
|
+
export interface ParentWithChildren {
|
|
172
|
+
parent: JobResponse;
|
|
173
|
+
children: ChildJobSummary[];
|
|
174
|
+
}
|
|
79
175
|
export interface JobResponse {
|
|
80
176
|
id: string;
|
|
81
177
|
appId: string;
|
|
82
178
|
userId: string;
|
|
83
179
|
jobType: string;
|
|
84
180
|
title: string;
|
|
181
|
+
/** Job version for ETA tracking */
|
|
182
|
+
version?: string;
|
|
85
183
|
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
86
184
|
progress: number;
|
|
87
185
|
message?: string;
|
|
@@ -90,9 +188,54 @@ export interface JobResponse {
|
|
|
90
188
|
result?: JobResult;
|
|
91
189
|
error?: JobError;
|
|
92
190
|
metadata?: Record<string, unknown>;
|
|
191
|
+
/** Estimated completion time (ISO 8601) */
|
|
93
192
|
estimatedCompletionAt?: string;
|
|
193
|
+
/** ETA confidence score (0.0 - 1.0) */
|
|
194
|
+
etaConfidence?: number;
|
|
195
|
+
/** Number of historical jobs used to calculate ETA */
|
|
196
|
+
etaBasedOn?: number;
|
|
94
197
|
createdAt: string;
|
|
95
198
|
updatedAt: string;
|
|
199
|
+
/** When the job actually started running */
|
|
200
|
+
startedAt?: string;
|
|
96
201
|
completedAt?: string;
|
|
202
|
+
/** Parent info (if this is a child job) */
|
|
203
|
+
parent?: ParentInfo;
|
|
204
|
+
/** Children stats (if this is a parent job) */
|
|
205
|
+
children?: ChildrenStats;
|
|
206
|
+
/** Child progress mode (if this is a parent job) */
|
|
207
|
+
childProgressMode?: ChildProgressMode;
|
|
208
|
+
}
|
|
209
|
+
/** ETA statistics for a job type */
|
|
210
|
+
export interface EtaStats {
|
|
211
|
+
/** Job type identifier */
|
|
212
|
+
jobType: string;
|
|
213
|
+
/** Version (or 'default') */
|
|
214
|
+
version: string;
|
|
215
|
+
/** Number of completed jobs in statistics */
|
|
216
|
+
count: number;
|
|
217
|
+
/** Average duration in milliseconds */
|
|
218
|
+
avgDuration: number;
|
|
219
|
+
/** Median duration (50th percentile) in milliseconds */
|
|
220
|
+
p50Duration: number;
|
|
221
|
+
/** 95th percentile duration in milliseconds */
|
|
222
|
+
p95Duration: number;
|
|
223
|
+
/** Minimum recorded duration */
|
|
224
|
+
minDuration: number;
|
|
225
|
+
/** Maximum recorded duration */
|
|
226
|
+
maxDuration: number;
|
|
227
|
+
/** Confidence score for ETA predictions (0.0 - 1.0) */
|
|
228
|
+
confidence: number;
|
|
229
|
+
/** Last time stats were updated */
|
|
230
|
+
lastUpdated: string;
|
|
231
|
+
}
|
|
232
|
+
/** Default ETA configuration for job types */
|
|
233
|
+
export interface DefaultEtaConfig {
|
|
234
|
+
/** Job type identifier */
|
|
235
|
+
jobType: string;
|
|
236
|
+
/** Default duration in milliseconds (used when no history) */
|
|
237
|
+
defaultDuration: number;
|
|
238
|
+
/** Optional version */
|
|
239
|
+
version?: string;
|
|
97
240
|
}
|
|
98
241
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seenn/node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Seenn Node.js Backend SDK - Open source job state transport for real-time progress tracking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
"ulid": "^2.3.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
+
"@types/node": "^25.0.10",
|
|
34
|
+
"typescript": "^5.9.3",
|
|
33
35
|
"vitest": "^2.1.0"
|
|
34
36
|
},
|
|
35
37
|
"keywords": [
|
package/src/client.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { Job } from './job.js';
|
|
2
2
|
import { HttpClient } from './http.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
StartJobParams,
|
|
5
|
+
JobResponse,
|
|
6
|
+
CreateParentParams,
|
|
7
|
+
CreateChildParams,
|
|
8
|
+
CreateBatchParams,
|
|
9
|
+
ParentWithChildren,
|
|
10
|
+
ChildJobSummary,
|
|
11
|
+
EtaStats,
|
|
12
|
+
DefaultEtaConfig,
|
|
13
|
+
} from './types.js';
|
|
4
14
|
|
|
5
15
|
export interface SeennConfig {
|
|
6
16
|
/** API key (sk_live_xxx or sk_test_xxx) */
|
|
@@ -78,6 +88,145 @@ export class SeennClient {
|
|
|
78
88
|
nextCursor: response.nextCursor,
|
|
79
89
|
};
|
|
80
90
|
},
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Create a parent job (batch container)
|
|
94
|
+
*/
|
|
95
|
+
createParent: async (params: CreateParentParams): Promise<Job> => {
|
|
96
|
+
const response = await this.http.post<JobResponse>('/v1/jobs', {
|
|
97
|
+
jobType: params.jobType,
|
|
98
|
+
userId: params.userId,
|
|
99
|
+
title: params.title,
|
|
100
|
+
totalChildren: params.childCount,
|
|
101
|
+
childProgressMode: params.childProgressMode,
|
|
102
|
+
metadata: params.metadata,
|
|
103
|
+
ttlSeconds: params.ttlSeconds,
|
|
104
|
+
});
|
|
105
|
+
return new Job(response, this.http);
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Create a child job under a parent
|
|
110
|
+
*/
|
|
111
|
+
createChild: async (params: CreateChildParams): Promise<Job> => {
|
|
112
|
+
const response = await this.http.post<JobResponse>('/v1/jobs', {
|
|
113
|
+
jobType: params.jobType,
|
|
114
|
+
userId: params.userId,
|
|
115
|
+
title: params.title,
|
|
116
|
+
parentJobId: params.parentJobId,
|
|
117
|
+
childIndex: params.childIndex,
|
|
118
|
+
metadata: params.metadata,
|
|
119
|
+
ttlSeconds: params.ttlSeconds,
|
|
120
|
+
});
|
|
121
|
+
return new Job(response, this.http);
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get a parent job with all its children
|
|
126
|
+
*/
|
|
127
|
+
getWithChildren: async (parentJobId: string): Promise<{ parent: Job; children: ChildJobSummary[] }> => {
|
|
128
|
+
const response = await this.http.get<ParentWithChildren>(
|
|
129
|
+
`/v1/jobs/${parentJobId}/children`
|
|
130
|
+
);
|
|
131
|
+
return {
|
|
132
|
+
parent: new Job(response.parent, this.http),
|
|
133
|
+
children: response.children,
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Create a batch of jobs (parent + children) in one go
|
|
139
|
+
* Returns the parent job and all child jobs
|
|
140
|
+
*/
|
|
141
|
+
createBatch: async (params: CreateBatchParams): Promise<{ parent: Job; children: Job[] }> => {
|
|
142
|
+
// Create parent job first
|
|
143
|
+
const parent = await this.jobs.createParent({
|
|
144
|
+
jobType: params.jobType,
|
|
145
|
+
userId: params.userId,
|
|
146
|
+
title: params.parentTitle,
|
|
147
|
+
childCount: params.childTitles.length,
|
|
148
|
+
childProgressMode: params.childProgressMode,
|
|
149
|
+
metadata: params.metadata,
|
|
150
|
+
ttlSeconds: params.ttlSeconds,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// Create all children in parallel
|
|
154
|
+
const childPromises = params.childTitles.map((title, index) =>
|
|
155
|
+
this.jobs.createChild({
|
|
156
|
+
parentJobId: parent.id,
|
|
157
|
+
childIndex: index,
|
|
158
|
+
jobType: params.jobType,
|
|
159
|
+
userId: params.userId,
|
|
160
|
+
title,
|
|
161
|
+
ttlSeconds: params.ttlSeconds,
|
|
162
|
+
})
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
const children = await Promise.all(childPromises);
|
|
166
|
+
|
|
167
|
+
// Refresh parent to get updated counters
|
|
168
|
+
await parent.refresh();
|
|
169
|
+
|
|
170
|
+
return { parent, children };
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* ETA (Estimated Time of Arrival) resource
|
|
177
|
+
*/
|
|
178
|
+
get eta() {
|
|
179
|
+
return {
|
|
180
|
+
/**
|
|
181
|
+
* Get ETA statistics for a job type
|
|
182
|
+
*/
|
|
183
|
+
getStats: async (jobType: string, version?: string): Promise<EtaStats | null> => {
|
|
184
|
+
const params = new URLSearchParams({ jobType });
|
|
185
|
+
if (version) params.set('version', version);
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
const response = await this.http.get<EtaStats>(`/v1/eta/stats?${params}`);
|
|
189
|
+
return response;
|
|
190
|
+
} catch (error: unknown) {
|
|
191
|
+
// Return null if no stats exist yet
|
|
192
|
+
if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* List all ETA statistics for the app
|
|
201
|
+
*/
|
|
202
|
+
list: async (): Promise<EtaStats[]> => {
|
|
203
|
+
const response = await this.http.get<{ stats: EtaStats[] }>('/v1/eta/stats');
|
|
204
|
+
return response.stats;
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Set default ETA for a job type (used when no history exists)
|
|
209
|
+
*/
|
|
210
|
+
setDefault: async (config: DefaultEtaConfig): Promise<void> => {
|
|
211
|
+
await this.http.post('/v1/eta/defaults', config);
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get default ETA configurations
|
|
216
|
+
*/
|
|
217
|
+
getDefaults: async (): Promise<DefaultEtaConfig[]> => {
|
|
218
|
+
const response = await this.http.get<{ defaults: DefaultEtaConfig[] }>('/v1/eta/defaults');
|
|
219
|
+
return response.defaults;
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Reset ETA statistics for a job type (admin use)
|
|
224
|
+
*/
|
|
225
|
+
reset: async (jobType: string, version?: string): Promise<void> => {
|
|
226
|
+
const params = new URLSearchParams({ jobType });
|
|
227
|
+
if (version) params.set('version', version);
|
|
228
|
+
await this.http.post(`/v1/eta/reset?${params}`, {});
|
|
229
|
+
},
|
|
81
230
|
};
|
|
82
231
|
}
|
|
83
232
|
}
|
package/src/index.ts
CHANGED
|
@@ -15,6 +15,18 @@ export type {
|
|
|
15
15
|
StageInfo,
|
|
16
16
|
JobResult,
|
|
17
17
|
JobError,
|
|
18
|
+
// Parent-child types
|
|
19
|
+
ChildProgressMode,
|
|
20
|
+
ChildJobSummary,
|
|
21
|
+
ParentInfo,
|
|
22
|
+
ChildrenStats,
|
|
23
|
+
CreateParentParams,
|
|
24
|
+
CreateChildParams,
|
|
25
|
+
CreateBatchParams,
|
|
26
|
+
ParentWithChildren,
|
|
27
|
+
// ETA types
|
|
28
|
+
EtaStats,
|
|
29
|
+
DefaultEtaConfig,
|
|
18
30
|
} from './types.js';
|
|
19
31
|
|
|
20
32
|
export { SeennError, RateLimitError, ValidationError, NotFoundError } from './errors.js';
|
package/src/job.ts
CHANGED
|
@@ -8,6 +8,9 @@ import type {
|
|
|
8
8
|
StageInfo,
|
|
9
9
|
JobResult,
|
|
10
10
|
JobError,
|
|
11
|
+
ParentInfo,
|
|
12
|
+
ChildrenStats,
|
|
13
|
+
ChildProgressMode,
|
|
11
14
|
} from './types.js';
|
|
12
15
|
|
|
13
16
|
export type JobStatus = 'pending' | 'running' | 'completed' | 'failed';
|
|
@@ -18,6 +21,7 @@ export interface JobData {
|
|
|
18
21
|
userId: string;
|
|
19
22
|
jobType: string;
|
|
20
23
|
title: string;
|
|
24
|
+
version?: string;
|
|
21
25
|
status: JobStatus;
|
|
22
26
|
progress: number;
|
|
23
27
|
message?: string;
|
|
@@ -27,9 +31,16 @@ export interface JobData {
|
|
|
27
31
|
error?: JobError;
|
|
28
32
|
metadata?: Record<string, unknown>;
|
|
29
33
|
estimatedCompletionAt?: string;
|
|
34
|
+
etaConfidence?: number;
|
|
35
|
+
etaBasedOn?: number;
|
|
30
36
|
createdAt: Date;
|
|
31
37
|
updatedAt: Date;
|
|
38
|
+
startedAt?: Date;
|
|
32
39
|
completedAt?: Date;
|
|
40
|
+
// Parent-child fields
|
|
41
|
+
parent?: ParentInfo;
|
|
42
|
+
children?: ChildrenStats;
|
|
43
|
+
childProgressMode?: ChildProgressMode;
|
|
33
44
|
}
|
|
34
45
|
|
|
35
46
|
export interface ProgressOptions {
|
|
@@ -59,6 +70,7 @@ export class Job implements JobData {
|
|
|
59
70
|
readonly userId: string;
|
|
60
71
|
readonly jobType: string;
|
|
61
72
|
readonly title: string;
|
|
73
|
+
readonly version?: string;
|
|
62
74
|
status: JobStatus;
|
|
63
75
|
progress: number;
|
|
64
76
|
message?: string;
|
|
@@ -68,9 +80,16 @@ export class Job implements JobData {
|
|
|
68
80
|
error?: JobError;
|
|
69
81
|
metadata?: Record<string, unknown>;
|
|
70
82
|
estimatedCompletionAt?: string;
|
|
83
|
+
etaConfidence?: number;
|
|
84
|
+
etaBasedOn?: number;
|
|
71
85
|
readonly createdAt: Date;
|
|
72
86
|
updatedAt: Date;
|
|
87
|
+
startedAt?: Date;
|
|
73
88
|
completedAt?: Date;
|
|
89
|
+
// Parent-child fields
|
|
90
|
+
parent?: ParentInfo;
|
|
91
|
+
children?: ChildrenStats;
|
|
92
|
+
childProgressMode?: ChildProgressMode;
|
|
74
93
|
|
|
75
94
|
private readonly http: HttpClient;
|
|
76
95
|
|
|
@@ -80,6 +99,7 @@ export class Job implements JobData {
|
|
|
80
99
|
this.userId = data.userId;
|
|
81
100
|
this.jobType = data.jobType;
|
|
82
101
|
this.title = data.title;
|
|
102
|
+
this.version = data.version;
|
|
83
103
|
this.status = data.status;
|
|
84
104
|
this.progress = data.progress;
|
|
85
105
|
this.message = data.message;
|
|
@@ -89,9 +109,16 @@ export class Job implements JobData {
|
|
|
89
109
|
this.error = data.error;
|
|
90
110
|
this.metadata = data.metadata;
|
|
91
111
|
this.estimatedCompletionAt = data.estimatedCompletionAt;
|
|
112
|
+
this.etaConfidence = data.etaConfidence;
|
|
113
|
+
this.etaBasedOn = data.etaBasedOn;
|
|
92
114
|
this.createdAt = new Date(data.createdAt);
|
|
93
115
|
this.updatedAt = new Date(data.updatedAt);
|
|
116
|
+
this.startedAt = data.startedAt ? new Date(data.startedAt) : undefined;
|
|
94
117
|
this.completedAt = data.completedAt ? new Date(data.completedAt) : undefined;
|
|
118
|
+
// Parent-child fields
|
|
119
|
+
this.parent = data.parent;
|
|
120
|
+
this.children = data.children;
|
|
121
|
+
this.childProgressMode = data.childProgressMode;
|
|
95
122
|
|
|
96
123
|
this.http = http;
|
|
97
124
|
}
|
|
@@ -160,6 +187,51 @@ export class Job implements JobData {
|
|
|
160
187
|
return this.status === 'completed' || this.status === 'failed';
|
|
161
188
|
}
|
|
162
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Check if this is a parent job (has children)
|
|
192
|
+
*/
|
|
193
|
+
get isParent(): boolean {
|
|
194
|
+
return this.children !== undefined;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Check if this is a child job (has a parent)
|
|
199
|
+
*/
|
|
200
|
+
get isChild(): boolean {
|
|
201
|
+
return this.parent !== undefined;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Get child progress summary (only for parent jobs)
|
|
206
|
+
*/
|
|
207
|
+
get childProgress(): { completed: number; failed: number; running: number; pending: number; total: number } | null {
|
|
208
|
+
if (!this.children) return null;
|
|
209
|
+
return {
|
|
210
|
+
completed: this.children.completed,
|
|
211
|
+
failed: this.children.failed,
|
|
212
|
+
running: this.children.running,
|
|
213
|
+
pending: this.children.pending,
|
|
214
|
+
total: this.children.total,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Get remaining time until ETA in milliseconds (null if no ETA)
|
|
220
|
+
*/
|
|
221
|
+
get etaRemaining(): number | null {
|
|
222
|
+
if (!this.estimatedCompletionAt) return null;
|
|
223
|
+
const eta = new Date(this.estimatedCompletionAt).getTime();
|
|
224
|
+
return Math.max(0, eta - Date.now());
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Check if job is past its ETA but still running
|
|
229
|
+
*/
|
|
230
|
+
get isPastEta(): boolean {
|
|
231
|
+
if (!this.estimatedCompletionAt || this.isTerminal) return false;
|
|
232
|
+
return new Date(this.estimatedCompletionAt).getTime() < Date.now();
|
|
233
|
+
}
|
|
234
|
+
|
|
163
235
|
/**
|
|
164
236
|
* Get plain object representation
|
|
165
237
|
*/
|
|
@@ -170,6 +242,7 @@ export class Job implements JobData {
|
|
|
170
242
|
userId: this.userId,
|
|
171
243
|
jobType: this.jobType,
|
|
172
244
|
title: this.title,
|
|
245
|
+
version: this.version,
|
|
173
246
|
status: this.status,
|
|
174
247
|
progress: this.progress,
|
|
175
248
|
message: this.message,
|
|
@@ -179,9 +252,15 @@ export class Job implements JobData {
|
|
|
179
252
|
error: this.error,
|
|
180
253
|
metadata: this.metadata,
|
|
181
254
|
estimatedCompletionAt: this.estimatedCompletionAt,
|
|
255
|
+
etaConfidence: this.etaConfidence,
|
|
256
|
+
etaBasedOn: this.etaBasedOn,
|
|
182
257
|
createdAt: this.createdAt,
|
|
183
258
|
updatedAt: this.updatedAt,
|
|
259
|
+
startedAt: this.startedAt,
|
|
184
260
|
completedAt: this.completedAt,
|
|
261
|
+
parent: this.parent,
|
|
262
|
+
children: this.children,
|
|
263
|
+
childProgressMode: this.childProgressMode,
|
|
185
264
|
};
|
|
186
265
|
}
|
|
187
266
|
|
|
@@ -195,7 +274,13 @@ export class Job implements JobData {
|
|
|
195
274
|
this.error = response.error;
|
|
196
275
|
this.metadata = response.metadata;
|
|
197
276
|
this.estimatedCompletionAt = response.estimatedCompletionAt;
|
|
277
|
+
this.etaConfidence = response.etaConfidence;
|
|
278
|
+
this.etaBasedOn = response.etaBasedOn;
|
|
198
279
|
this.updatedAt = new Date(response.updatedAt);
|
|
280
|
+
this.startedAt = response.startedAt ? new Date(response.startedAt) : undefined;
|
|
199
281
|
this.completedAt = response.completedAt ? new Date(response.completedAt) : undefined;
|
|
282
|
+
this.parent = response.parent;
|
|
283
|
+
this.children = response.children;
|
|
284
|
+
this.childProgressMode = response.childProgressMode;
|
|
200
285
|
}
|
|
201
286
|
}
|