@syncended/dsh-automations 0.1.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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/cordis.patch.yml +5 -0
  4. package/dist/agent-executor.d.ts +15 -0
  5. package/dist/agent-executor.d.ts.map +1 -0
  6. package/dist/agent-executor.js +173 -0
  7. package/dist/agent-executor.js.map +1 -0
  8. package/dist/cron.d.ts +15 -0
  9. package/dist/cron.d.ts.map +1 -0
  10. package/dist/cron.js +74 -0
  11. package/dist/cron.js.map +1 -0
  12. package/dist/http.d.ts +8 -0
  13. package/dist/http.d.ts.map +1 -0
  14. package/dist/http.js +203 -0
  15. package/dist/http.js.map +1 -0
  16. package/dist/index.d.ts +68 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +201 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/project-policy.d.ts +9 -0
  21. package/dist/project-policy.d.ts.map +1 -0
  22. package/dist/project-policy.js +53 -0
  23. package/dist/project-policy.js.map +1 -0
  24. package/dist/scheduler.d.ts +58 -0
  25. package/dist/scheduler.d.ts.map +1 -0
  26. package/dist/scheduler.js +518 -0
  27. package/dist/scheduler.js.map +1 -0
  28. package/dist/state.d.ts +8 -0
  29. package/dist/state.d.ts.map +1 -0
  30. package/dist/state.js +44 -0
  31. package/dist/state.js.map +1 -0
  32. package/dist/store.d.ts +21 -0
  33. package/dist/store.d.ts.map +1 -0
  34. package/dist/store.js +317 -0
  35. package/dist/store.js.map +1 -0
  36. package/dist/types.d.ts +169 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/types.js +3 -0
  39. package/dist/types.js.map +1 -0
  40. package/dist/validation.d.ts +13 -0
  41. package/dist/validation.d.ts.map +1 -0
  42. package/dist/validation.js +159 -0
  43. package/dist/validation.js.map +1 -0
  44. package/docs/architecture.md +195 -0
  45. package/docs/http-api.md +40 -0
  46. package/docs/security.md +51 -0
  47. package/lib/client.js +1251 -0
  48. package/package.json +105 -0
@@ -0,0 +1,518 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { latestCronOccurrence, nextCronOccurrence } from './cron.js';
3
+ import { activeRunsForJob, isTerminalRunStatus, orderedJobs, orderedRuns } from './state.js';
4
+ import { AutomationStateStore } from './store.js';
5
+ import { AutomationInputError, normalizeJobId, normalizeJobSpec, slugifyJobId, } from './validation.js';
6
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
7
+ const RETRY_AFTER_DRIVE_ERROR_MS = 5_000;
8
+ const SYSTEM_CLOCK = {
9
+ now: () => new Date(),
10
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
11
+ clearTimeout: (handle) => clearTimeout(handle),
12
+ };
13
+ class AutomationAbortError extends Error {
14
+ kind;
15
+ constructor(kind, message) {
16
+ super(message);
17
+ this.name = 'AutomationAbortError';
18
+ this.kind = kind;
19
+ }
20
+ }
21
+ function conflict(message) {
22
+ throw new AutomationInputError(message, 'VERSION_CONFLICT', 409);
23
+ }
24
+ function notFound(entity, id) {
25
+ throw new AutomationInputError(`${entity} "${id}" was not found`, 'NOT_FOUND', 404);
26
+ }
27
+ function cloneSpec(spec) {
28
+ return structuredClone({
29
+ name: spec.name,
30
+ enabled: spec.enabled,
31
+ schedule: spec.schedule,
32
+ task: spec.task,
33
+ execution: spec.execution,
34
+ policies: spec.policies,
35
+ });
36
+ }
37
+ function snapshotOf(job) {
38
+ return {
39
+ ...cloneSpec(job),
40
+ jobId: job.id,
41
+ jobVersion: job.version,
42
+ };
43
+ }
44
+ function runError(error) {
45
+ if (error instanceof AutomationAbortError) {
46
+ return {
47
+ code: error.kind === 'timed-out' ? 'RUN_TIMEOUT' : error.kind === 'interrupted' ? 'HOST_STOPPING' : 'RUN_CANCELLED',
48
+ message: error.message,
49
+ };
50
+ }
51
+ return {
52
+ code: typeof error === 'object' && error !== null && 'code' in error && typeof error.code === 'string'
53
+ ? error.code
54
+ : 'EXECUTION_FAILED',
55
+ message: error instanceof Error ? error.message : String(error),
56
+ };
57
+ }
58
+ function terminalStatus(error) {
59
+ if (!(error instanceof AutomationAbortError))
60
+ return 'failed';
61
+ return error.kind;
62
+ }
63
+ function boundedOutput(value, maxChars) {
64
+ if (value === undefined)
65
+ return undefined;
66
+ if (value.length <= maxChars)
67
+ return value;
68
+ return `${value.slice(0, Math.max(0, maxChars - 26))}\n…[output truncated]`;
69
+ }
70
+ export class AutomationScheduler {
71
+ store;
72
+ maxConcurrentRuns;
73
+ misfireGraceMs;
74
+ maxOutputChars;
75
+ logger;
76
+ clock;
77
+ executors = new Map();
78
+ active = new Map();
79
+ timer;
80
+ drivePromise;
81
+ driveRequested = false;
82
+ started = false;
83
+ stopping = false;
84
+ constructor(options) {
85
+ this.store = options.store;
86
+ this.maxConcurrentRuns = options.maxConcurrentRuns;
87
+ this.misfireGraceMs = options.misfireGraceMs;
88
+ this.maxOutputChars = options.maxOutputChars;
89
+ this.logger = options.logger;
90
+ this.clock = options.clock ?? SYSTEM_CLOCK;
91
+ }
92
+ registerExecutor(executor) {
93
+ const kind = executor.kind.trim();
94
+ if (kind === '')
95
+ throw new Error('automation executor kind must not be empty');
96
+ if (this.executors.has(kind))
97
+ throw new Error(`automation executor "${kind}" is already registered`);
98
+ this.executors.set(kind, executor);
99
+ this.requestDrive();
100
+ let disposed = false;
101
+ return () => {
102
+ if (disposed)
103
+ return;
104
+ disposed = true;
105
+ if (this.executors.get(kind) === executor)
106
+ this.executors.delete(kind);
107
+ };
108
+ }
109
+ async start() {
110
+ if (this.started)
111
+ return;
112
+ this.started = true;
113
+ this.stopping = false;
114
+ await this.reconcileJobs();
115
+ this.requestDrive();
116
+ }
117
+ async stop() {
118
+ if (this.stopping)
119
+ return;
120
+ this.stopping = true;
121
+ this.started = false;
122
+ this.clearTimer();
123
+ for (const active of this.active.values()) {
124
+ if (!active.controller.signal.aborted) {
125
+ active.controller.abort(new AutomationAbortError('interrupted', 'The Harness automation service is stopping.'));
126
+ }
127
+ }
128
+ await this.drivePromise?.catch(() => undefined);
129
+ await Promise.allSettled([...this.active.values()].map((entry) => entry.promise));
130
+ }
131
+ snapshot(limit = 100) {
132
+ const state = this.store.snapshot();
133
+ return {
134
+ revision: state.revision,
135
+ jobs: orderedJobs(state),
136
+ runs: orderedRuns(state, limit),
137
+ };
138
+ }
139
+ async create(spec, requestedId) {
140
+ const normalized = normalizeJobSpec(spec);
141
+ const now = this.clock.now();
142
+ const job = await this.store.mutate((state) => {
143
+ let id = requestedId === undefined
144
+ ? this.allocateJobId(state.jobs, normalized.name)
145
+ : normalizeJobId(requestedId);
146
+ if (state.jobs[id] !== undefined) {
147
+ if (requestedId !== undefined)
148
+ throw new AutomationInputError(`job "${id}" already exists`, 'ALREADY_EXISTS', 409);
149
+ id = this.allocateJobId(state.jobs, normalized.name);
150
+ }
151
+ const timestamp = now.toISOString();
152
+ const created = {
153
+ ...cloneSpec(normalized),
154
+ id,
155
+ version: 1,
156
+ createdAt: timestamp,
157
+ updatedAt: timestamp,
158
+ nextRunAt: normalized.enabled
159
+ ? nextCronOccurrence(normalized.schedule.cron, normalized.schedule.timezone, now).toISOString()
160
+ : null,
161
+ };
162
+ state.jobs[id] = created;
163
+ return structuredClone(created);
164
+ });
165
+ this.requestDrive();
166
+ return job;
167
+ }
168
+ async update(idValue, spec, expectedVersion) {
169
+ const id = normalizeJobId(idValue);
170
+ const normalized = normalizeJobSpec(spec);
171
+ const now = this.clock.now();
172
+ const job = await this.store.mutate((state) => {
173
+ const current = state.jobs[id];
174
+ if (current === undefined)
175
+ notFound('job', id);
176
+ if (expectedVersion !== undefined && current.version !== expectedVersion) {
177
+ conflict(`job "${id}" changed: expected version ${expectedVersion}, current version ${current.version}`);
178
+ }
179
+ const updated = {
180
+ ...cloneSpec(normalized),
181
+ id,
182
+ version: current.version + 1,
183
+ createdAt: current.createdAt,
184
+ updatedAt: now.toISOString(),
185
+ nextRunAt: normalized.enabled
186
+ ? nextCronOccurrence(normalized.schedule.cron, normalized.schedule.timezone, now).toISOString()
187
+ : null,
188
+ };
189
+ state.jobs[id] = updated;
190
+ return structuredClone(updated);
191
+ });
192
+ this.requestDrive();
193
+ return job;
194
+ }
195
+ async setEnabled(idValue, enabled, expectedVersion) {
196
+ const id = normalizeJobId(idValue);
197
+ const current = this.store.snapshot().jobs[id];
198
+ if (current === undefined)
199
+ notFound('job', id);
200
+ return this.update(id, { ...cloneSpec(current), enabled }, expectedVersion);
201
+ }
202
+ async remove(idValue) {
203
+ const id = normalizeJobId(idValue);
204
+ const now = this.clock.now().toISOString();
205
+ await this.store.mutate((state) => {
206
+ if (state.jobs[id] === undefined)
207
+ notFound('job', id);
208
+ delete state.jobs[id];
209
+ for (const run of Object.values(state.runs)) {
210
+ if (run.jobId !== id || run.status !== 'queued')
211
+ continue;
212
+ run.status = 'skipped';
213
+ run.skipReason = 'job-deleted';
214
+ run.finishedAt = now;
215
+ }
216
+ });
217
+ this.requestDrive();
218
+ }
219
+ async trigger(idValue) {
220
+ const id = normalizeJobId(idValue);
221
+ const now = this.clock.now();
222
+ const run = await this.store.mutate((state) => {
223
+ const job = state.jobs[id];
224
+ if (job === undefined)
225
+ notFound('job', id);
226
+ return structuredClone(this.admitRun(state, job, 'manual', now, `manual:${randomUUID()}`));
227
+ });
228
+ this.requestDrive();
229
+ return run;
230
+ }
231
+ async cancel(runId, reason = 'Cancelled by the user.') {
232
+ const now = this.clock.now().toISOString();
233
+ const run = await this.store.mutate((state) => {
234
+ const current = state.runs[runId];
235
+ if (current === undefined)
236
+ notFound('run', runId);
237
+ if (current.status === 'queued' || current.status === 'running') {
238
+ current.status = 'cancelled';
239
+ current.finishedAt = now;
240
+ current.error = { code: 'RUN_CANCELLED', message: reason };
241
+ }
242
+ return structuredClone(current);
243
+ });
244
+ const active = this.active.get(runId);
245
+ if (active !== undefined && !active.controller.signal.aborted) {
246
+ active.controller.abort(new AutomationAbortError('cancelled', reason));
247
+ }
248
+ this.requestDrive();
249
+ return run;
250
+ }
251
+ allocateJobId(jobs, name) {
252
+ const base = slugifyJobId(name);
253
+ if (jobs[base] === undefined)
254
+ return base;
255
+ for (let attempt = 0; attempt < 100; attempt += 1) {
256
+ const id = `${base.slice(0, 54)}-${randomUUID().slice(0, 8)}`;
257
+ if (jobs[id] === undefined)
258
+ return id;
259
+ }
260
+ throw new Error('could not allocate a unique automation job id');
261
+ }
262
+ async reconcileJobs() {
263
+ const now = this.clock.now();
264
+ await this.store.mutate((state) => {
265
+ for (const job of Object.values(state.jobs)) {
266
+ if (!job.enabled) {
267
+ job.nextRunAt = null;
268
+ continue;
269
+ }
270
+ if (job.nextRunAt === null || !Number.isFinite(Date.parse(job.nextRunAt))) {
271
+ job.nextRunAt = nextCronOccurrence(job.schedule.cron, job.schedule.timezone, now).toISOString();
272
+ }
273
+ }
274
+ for (const run of Object.values(state.runs)) {
275
+ if (run.status !== 'queued')
276
+ continue;
277
+ if (state.jobs[run.jobId] !== undefined)
278
+ continue;
279
+ run.status = 'skipped';
280
+ run.skipReason = 'job-deleted';
281
+ run.finishedAt = now.toISOString();
282
+ }
283
+ });
284
+ }
285
+ requestDrive() {
286
+ if (!this.started || this.stopping)
287
+ return;
288
+ this.driveRequested = true;
289
+ if (this.drivePromise !== undefined)
290
+ return;
291
+ this.drivePromise = this.driveLoop().finally(() => {
292
+ this.drivePromise = undefined;
293
+ if (this.driveRequested && this.started && !this.stopping)
294
+ this.requestDrive();
295
+ });
296
+ }
297
+ async driveLoop() {
298
+ while (this.driveRequested && this.started && !this.stopping) {
299
+ this.driveRequested = false;
300
+ this.clearTimer();
301
+ try {
302
+ await this.claimDueRuns();
303
+ await this.drainQueue();
304
+ this.armNext();
305
+ }
306
+ catch (error) {
307
+ this.logger.error('automations: scheduler drive failed');
308
+ this.logger.error(error instanceof Error ? error.stack ?? error.message : String(error));
309
+ this.arm(RETRY_AFTER_DRIVE_ERROR_MS);
310
+ }
311
+ }
312
+ }
313
+ async claimDueRuns() {
314
+ const now = this.clock.now();
315
+ const due = orderedJobs(this.store.snapshot()).filter((job) => job.enabled && job.nextRunAt !== null && Date.parse(job.nextRunAt) <= now.getTime());
316
+ for (const candidate of due)
317
+ await this.claimDueRun(candidate.id, now);
318
+ }
319
+ async claimDueRun(jobId, now) {
320
+ return this.store.mutate((state) => {
321
+ const job = state.jobs[jobId];
322
+ if (job === undefined || !job.enabled || job.nextRunAt === null)
323
+ return undefined;
324
+ const dueAt = new Date(job.nextRunAt);
325
+ if (dueAt.getTime() > now.getTime())
326
+ return undefined;
327
+ const lateBy = now.getTime() - dueAt.getTime();
328
+ const misfired = lateBy > this.misfireGraceMs;
329
+ const scheduledFor = misfired && job.policies.misfire === 'run-once'
330
+ ? latestCronOccurrence(job.schedule.cron, job.schedule.timezone, now)
331
+ : dueAt;
332
+ job.nextRunAt = nextCronOccurrence(job.schedule.cron, job.schedule.timezone, now).toISOString();
333
+ const occurrenceKey = `${job.id}:cron:${scheduledFor.toISOString()}`;
334
+ const existingId = state.occurrences[occurrenceKey];
335
+ if (existingId !== undefined)
336
+ return state.runs[existingId];
337
+ if (misfired && job.policies.misfire === 'skip') {
338
+ return this.admitSkippedRun(state, job, scheduledFor, occurrenceKey, 'misfire');
339
+ }
340
+ return this.admitRun(state, job, 'cron', scheduledFor, occurrenceKey);
341
+ });
342
+ }
343
+ admitRun(state, job, trigger, scheduledFor, occurrenceKey) {
344
+ if (job.policies.overlap === 'skip' && activeRunsForJob(state, job.id).length > 0) {
345
+ return this.admitSkippedRun(state, job, scheduledFor, occurrenceKey, 'overlap', trigger);
346
+ }
347
+ const timestamp = this.clock.now().toISOString();
348
+ const run = {
349
+ id: `run-${randomUUID()}`,
350
+ occurrenceKey,
351
+ jobId: job.id,
352
+ jobVersion: job.version,
353
+ jobName: job.name,
354
+ trigger,
355
+ scheduledFor: scheduledFor.toISOString(),
356
+ status: 'queued',
357
+ createdAt: timestamp,
358
+ snapshot: snapshotOf(job),
359
+ };
360
+ state.runs[run.id] = run;
361
+ state.runOrder.push(run.id);
362
+ state.occurrences[occurrenceKey] = run.id;
363
+ return run;
364
+ }
365
+ admitSkippedRun(state, job, scheduledFor, occurrenceKey, reason, trigger = 'cron') {
366
+ const timestamp = this.clock.now().toISOString();
367
+ const run = {
368
+ id: `run-${randomUUID()}`,
369
+ occurrenceKey,
370
+ jobId: job.id,
371
+ jobVersion: job.version,
372
+ jobName: job.name,
373
+ trigger,
374
+ scheduledFor: scheduledFor.toISOString(),
375
+ status: 'skipped',
376
+ createdAt: timestamp,
377
+ finishedAt: timestamp,
378
+ skipReason: reason,
379
+ snapshot: snapshotOf(job),
380
+ };
381
+ state.runs[run.id] = run;
382
+ state.runOrder.push(run.id);
383
+ state.occurrences[occurrenceKey] = run.id;
384
+ return run;
385
+ }
386
+ async drainQueue() {
387
+ while (this.active.size < this.maxConcurrentRuns && this.started && !this.stopping) {
388
+ const state = this.store.snapshot();
389
+ const queued = state.runOrder
390
+ .map((id) => state.runs[id])
391
+ .filter((run) => run?.status === 'queued');
392
+ const next = queued.find((run) => {
393
+ if (run.snapshot.policies.overlap === 'allow')
394
+ return true;
395
+ return ![...this.active.keys()].some((id) => state.runs[id]?.jobId === run.jobId);
396
+ });
397
+ if (next === undefined)
398
+ return;
399
+ const executor = this.executors.get(next.snapshot.task.kind);
400
+ if (executor === undefined) {
401
+ await this.finishRun(next.id, 'failed', {
402
+ code: 'EXECUTOR_NOT_REGISTERED',
403
+ message: `No automation executor is registered for task kind "${next.snapshot.task.kind}".`,
404
+ });
405
+ continue;
406
+ }
407
+ const started = await this.store.mutate((latest) => {
408
+ const run = latest.runs[next.id];
409
+ if (run === undefined || run.status !== 'queued')
410
+ return undefined;
411
+ run.status = 'running';
412
+ run.startedAt = this.clock.now().toISOString();
413
+ return structuredClone(run);
414
+ });
415
+ if (started === undefined)
416
+ continue;
417
+ if (this.stopping || !this.started) {
418
+ await this.finishRun(started.id, 'interrupted', {
419
+ code: 'HOST_STOPPING',
420
+ message: 'The Harness automation service stopped before execution began.',
421
+ });
422
+ return;
423
+ }
424
+ if (this.store.snapshot().runs[started.id]?.status !== 'running')
425
+ continue;
426
+ const controller = new AbortController();
427
+ // Publish cancellation ownership before invoking third-party executor code.
428
+ const promise = Promise.resolve()
429
+ .then(async () => this.executeRun(started, executor, controller))
430
+ .finally(() => {
431
+ this.active.delete(started.id);
432
+ this.requestDrive();
433
+ });
434
+ this.active.set(started.id, { controller, promise });
435
+ }
436
+ }
437
+ async executeRun(run, executor, controller) {
438
+ const timeout = this.clock.setTimeout(() => {
439
+ if (!controller.signal.aborted) {
440
+ controller.abort(new AutomationAbortError('timed-out', `Run exceeded its ${run.snapshot.execution.timeoutMs} ms timeout.`));
441
+ }
442
+ }, run.snapshot.execution.timeoutMs);
443
+ try {
444
+ const result = await executor.execute({
445
+ run,
446
+ signal: controller.signal,
447
+ attachSession: async (sessionId) => {
448
+ await this.store.mutate((state) => {
449
+ const current = state.runs[run.id];
450
+ if (current === undefined || current.status !== 'running')
451
+ return;
452
+ current.sessionId = sessionId;
453
+ });
454
+ },
455
+ });
456
+ if (controller.signal.aborted)
457
+ throw controller.signal.reason;
458
+ await this.store.mutate((state) => {
459
+ const current = state.runs[run.id];
460
+ if (current === undefined || current.status !== 'running')
461
+ return;
462
+ current.status = 'succeeded';
463
+ current.finishedAt = this.clock.now().toISOString();
464
+ if (result.sessionId !== undefined)
465
+ current.sessionId = result.sessionId;
466
+ const output = boundedOutput(result.output, this.maxOutputChars);
467
+ if (output !== undefined)
468
+ current.output = output;
469
+ });
470
+ }
471
+ catch (error) {
472
+ const normalized = error instanceof AutomationAbortError ? error : controller.signal.aborted ? controller.signal.reason : error;
473
+ await this.finishRun(run.id, terminalStatus(normalized), runError(normalized));
474
+ }
475
+ finally {
476
+ this.clock.clearTimeout(timeout);
477
+ }
478
+ }
479
+ async finishRun(runId, status, error) {
480
+ await this.store.mutate((state) => {
481
+ const current = state.runs[runId];
482
+ if (current === undefined || isTerminalRunStatus(current.status))
483
+ return;
484
+ current.status = status;
485
+ current.finishedAt = this.clock.now().toISOString();
486
+ current.error = error;
487
+ });
488
+ }
489
+ armNext() {
490
+ const now = this.clock.now().getTime();
491
+ let delay;
492
+ for (const job of Object.values(this.store.snapshot().jobs)) {
493
+ if (!job.enabled || job.nextRunAt === null)
494
+ continue;
495
+ const candidate = Math.max(0, Date.parse(job.nextRunAt) - now);
496
+ delay = delay === undefined ? candidate : Math.min(delay, candidate);
497
+ }
498
+ if (delay !== undefined)
499
+ this.arm(delay);
500
+ }
501
+ arm(delayMs) {
502
+ if (!this.started || this.stopping)
503
+ return;
504
+ this.clearTimer();
505
+ const bounded = Math.max(1, Math.min(MAX_TIMER_DELAY_MS, delayMs));
506
+ this.timer = this.clock.setTimeout(() => {
507
+ this.timer = undefined;
508
+ this.requestDrive();
509
+ }, bounded);
510
+ }
511
+ clearTimer() {
512
+ if (this.timer === undefined)
513
+ return;
514
+ this.clock.clearTimeout(this.timer);
515
+ this.timer = undefined;
516
+ }
517
+ }
518
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AutomationJob, AutomationRun, AutomationRunStatus, AutomationState } from './types.js';
2
+ export declare const TERMINAL_RUN_STATUSES: Set<AutomationRunStatus>;
3
+ export declare function isTerminalRunStatus(status: AutomationRunStatus): boolean;
4
+ export declare function createEmptyState(): AutomationState;
5
+ export declare function orderedJobs(state: AutomationState): AutomationJob[];
6
+ export declare function orderedRuns(state: AutomationState, limit?: number): AutomationRun[];
7
+ export declare function activeRunsForJob(state: AutomationState, jobId: string): AutomationRun[];
8
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,EAChB,MAAM,YAAY,CAAA;AAGnB,eAAO,MAAM,qBAAqB,0BAOhC,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAExE;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CASlD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,EAAE,CAKnE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,SAA2B,GAAG,aAAa,EAAE,CAMrG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAMvF"}
package/dist/state.js ADDED
@@ -0,0 +1,44 @@
1
+ import { STATE_SCHEMA_VERSION } from './types.js';
2
+ export const TERMINAL_RUN_STATUSES = new Set([
3
+ 'succeeded',
4
+ 'failed',
5
+ 'cancelled',
6
+ 'timed-out',
7
+ 'skipped',
8
+ 'interrupted',
9
+ ]);
10
+ export function isTerminalRunStatus(status) {
11
+ return TERMINAL_RUN_STATUSES.has(status);
12
+ }
13
+ export function createEmptyState() {
14
+ return {
15
+ schemaVersion: STATE_SCHEMA_VERSION,
16
+ revision: 0,
17
+ jobs: {},
18
+ runs: {},
19
+ runOrder: [],
20
+ occurrences: {},
21
+ };
22
+ }
23
+ export function orderedJobs(state) {
24
+ return Object.values(state.jobs).sort((left, right) => {
25
+ const byName = left.name.localeCompare(right.name);
26
+ return byName === 0 ? left.id.localeCompare(right.id) : byName;
27
+ });
28
+ }
29
+ export function orderedRuns(state, limit = Number.POSITIVE_INFINITY) {
30
+ const ids = state.runOrder.slice(Math.max(0, state.runOrder.length - limit)).reverse();
31
+ return ids.flatMap((id) => {
32
+ const run = state.runs[id];
33
+ return run === undefined ? [] : [run];
34
+ });
35
+ }
36
+ export function activeRunsForJob(state, jobId) {
37
+ return state.runOrder.flatMap((id) => {
38
+ const run = state.runs[id];
39
+ if (run === undefined || run.jobId !== jobId || isTerminalRunStatus(run.status))
40
+ return [];
41
+ return [run];
42
+ });
43
+ }
44
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAsB;IAChE,WAAW;IACX,QAAQ;IACR,WAAW;IACX,WAAW;IACX,SAAS;IACT,aAAa;CACd,CAAC,CAAA;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,OAAO,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,aAAa,EAAE,oBAAoB;QACnC,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,EAAE;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAsB;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAClD,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAsB,EAAE,KAAK,GAAG,MAAM,CAAC,iBAAiB;IAClF,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IACtF,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB,EAAE,KAAa;IACpE,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAA;QAC1F,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type AutomationState } from './types.js';
2
+ export declare class AutomationStateError extends Error {
3
+ readonly code = "INVALID_AUTOMATION_STATE";
4
+ constructor(message: string, options?: ErrorOptions);
5
+ }
6
+ export declare function decodeAutomationState(value: unknown): AutomationState;
7
+ export declare class AutomationStateStore {
8
+ readonly path: string;
9
+ private readonly historyLimit;
10
+ private state;
11
+ private operations;
12
+ private closed;
13
+ constructor(path: string, historyLimit: number);
14
+ open(now: Date): Promise<void>;
15
+ snapshot(): AutomationState;
16
+ mutate<T>(mutation: (state: AutomationState) => T | Promise<T>): Promise<T>;
17
+ close(): Promise<void>;
18
+ private enqueue;
19
+ private prune;
20
+ }
21
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,YAAY,CAAA;AAenB,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,8BAA6B;gBAE9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AA6ID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CA2CrE;AA2BD,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,MAAM,CAAQ;gBAEV,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAKxC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpC,QAAQ,IAAI,eAAe;IAIrB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAgB3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;CAoBd"}