@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/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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,3 +1,2 @@
1
- // Job Parameters
2
1
  export {};
3
2
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iBAAiB"}
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.1.1",
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 { StartJobParams, JobResponse } from './types.js';
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
  }