@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
package/dist/store.js ADDED
@@ -0,0 +1,317 @@
1
+ import { mkdir, readFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { withFileLock, writeFileAtomic } from '@deepseek-ai/dsh-atomic-write';
4
+ import { normalizeJobId, normalizeJobSpec } from './validation.js';
5
+ import { createEmptyState, isTerminalRunStatus } from './state.js';
6
+ import { STATE_SCHEMA_VERSION, } from './types.js';
7
+ const RUN_STATUSES = new Set([
8
+ 'queued',
9
+ 'running',
10
+ 'succeeded',
11
+ 'failed',
12
+ 'cancelled',
13
+ 'timed-out',
14
+ 'skipped',
15
+ 'interrupted',
16
+ ]);
17
+ const RUN_TRIGGERS = new Set(['cron', 'manual']);
18
+ const SKIP_REASONS = new Set(['overlap', 'misfire', 'job-disabled', 'job-deleted']);
19
+ export class AutomationStateError extends Error {
20
+ code = 'INVALID_AUTOMATION_STATE';
21
+ constructor(message, options) {
22
+ super(message, options);
23
+ this.name = 'AutomationStateError';
24
+ }
25
+ }
26
+ function record(value, path) {
27
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
28
+ throw new AutomationStateError(`${path} must be an object`);
29
+ }
30
+ return value;
31
+ }
32
+ function text(value, path, allowEmpty = false) {
33
+ if (typeof value !== 'string' || (!allowEmpty && value.length === 0)) {
34
+ throw new AutomationStateError(`${path} must be ${allowEmpty ? 'a string' : 'a non-empty string'}`);
35
+ }
36
+ return value;
37
+ }
38
+ function optionalText(value, path) {
39
+ return value === undefined ? undefined : text(value, path, true);
40
+ }
41
+ function positiveInteger(value, path) {
42
+ if (!Number.isSafeInteger(value) || value < 1) {
43
+ throw new AutomationStateError(`${path} must be a positive safe integer`);
44
+ }
45
+ return value;
46
+ }
47
+ function nonNegativeInteger(value, path) {
48
+ if (!Number.isSafeInteger(value) || value < 0) {
49
+ throw new AutomationStateError(`${path} must be a non-negative safe integer`);
50
+ }
51
+ return value;
52
+ }
53
+ function instant(value, path) {
54
+ const result = text(value, path);
55
+ if (!Number.isFinite(Date.parse(result)))
56
+ throw new AutomationStateError(`${path} must be an ISO date-time`);
57
+ return result;
58
+ }
59
+ function optionalInstant(value, path) {
60
+ return value === undefined ? undefined : instant(value, path);
61
+ }
62
+ function decodeJob(value, key) {
63
+ const input = record(value, `jobs.${key}`);
64
+ const id = normalizeJobId(text(input.id, `jobs.${key}.id`));
65
+ if (id !== key)
66
+ throw new AutomationStateError(`jobs.${key}.id must equal its map key`);
67
+ let spec;
68
+ try {
69
+ spec = normalizeJobSpec({
70
+ name: input.name,
71
+ enabled: input.enabled,
72
+ schedule: input.schedule,
73
+ task: input.task,
74
+ execution: input.execution,
75
+ policies: input.policies,
76
+ });
77
+ }
78
+ catch (cause) {
79
+ throw new AutomationStateError(`jobs.${key} has an invalid definition`, { cause });
80
+ }
81
+ const nextRunAt = input.nextRunAt === null ? null : instant(input.nextRunAt, `jobs.${key}.nextRunAt`);
82
+ return {
83
+ ...spec,
84
+ id,
85
+ version: positiveInteger(input.version, `jobs.${key}.version`),
86
+ createdAt: instant(input.createdAt, `jobs.${key}.createdAt`),
87
+ updatedAt: instant(input.updatedAt, `jobs.${key}.updatedAt`),
88
+ nextRunAt,
89
+ };
90
+ }
91
+ function decodeRun(value, key) {
92
+ const input = record(value, `runs.${key}`);
93
+ const id = text(input.id, `runs.${key}.id`);
94
+ if (id !== key)
95
+ throw new AutomationStateError(`runs.${key}.id must equal its map key`);
96
+ const status = text(input.status, `runs.${key}.status`);
97
+ if (!RUN_STATUSES.has(status))
98
+ throw new AutomationStateError(`runs.${key}.status is unsupported`);
99
+ const trigger = text(input.trigger, `runs.${key}.trigger`);
100
+ if (!RUN_TRIGGERS.has(trigger))
101
+ throw new AutomationStateError(`runs.${key}.trigger is unsupported`);
102
+ const snapshotInput = record(input.snapshot, `runs.${key}.snapshot`);
103
+ let snapshot;
104
+ try {
105
+ const spec = normalizeJobSpec({
106
+ name: snapshotInput.name,
107
+ enabled: snapshotInput.enabled,
108
+ schedule: snapshotInput.schedule,
109
+ task: snapshotInput.task,
110
+ execution: snapshotInput.execution,
111
+ policies: snapshotInput.policies,
112
+ });
113
+ snapshot = {
114
+ ...spec,
115
+ jobId: normalizeJobId(text(snapshotInput.jobId, `runs.${key}.snapshot.jobId`)),
116
+ jobVersion: positiveInteger(snapshotInput.jobVersion, `runs.${key}.snapshot.jobVersion`),
117
+ };
118
+ }
119
+ catch (cause) {
120
+ throw new AutomationStateError(`runs.${key}.snapshot is invalid`, { cause });
121
+ }
122
+ const errorInput = input.error === undefined ? undefined : record(input.error, `runs.${key}.error`);
123
+ const skipReason = input.skipReason === undefined ? undefined : text(input.skipReason, `runs.${key}.skipReason`);
124
+ if (skipReason !== undefined && !SKIP_REASONS.has(skipReason)) {
125
+ throw new AutomationStateError(`runs.${key}.skipReason is unsupported`);
126
+ }
127
+ return {
128
+ id,
129
+ occurrenceKey: text(input.occurrenceKey, `runs.${key}.occurrenceKey`),
130
+ jobId: normalizeJobId(text(input.jobId, `runs.${key}.jobId`)),
131
+ jobVersion: positiveInteger(input.jobVersion, `runs.${key}.jobVersion`),
132
+ jobName: text(input.jobName, `runs.${key}.jobName`),
133
+ trigger: trigger,
134
+ scheduledFor: instant(input.scheduledFor, `runs.${key}.scheduledFor`),
135
+ status,
136
+ createdAt: instant(input.createdAt, `runs.${key}.createdAt`),
137
+ ...(optionalInstant(input.startedAt, `runs.${key}.startedAt`) === undefined
138
+ ? {}
139
+ : { startedAt: optionalInstant(input.startedAt, `runs.${key}.startedAt`) }),
140
+ ...(optionalInstant(input.finishedAt, `runs.${key}.finishedAt`) === undefined
141
+ ? {}
142
+ : { finishedAt: optionalInstant(input.finishedAt, `runs.${key}.finishedAt`) }),
143
+ ...(optionalText(input.sessionId, `runs.${key}.sessionId`) === undefined
144
+ ? {}
145
+ : { sessionId: optionalText(input.sessionId, `runs.${key}.sessionId`) }),
146
+ ...(optionalText(input.output, `runs.${key}.output`) === undefined
147
+ ? {}
148
+ : { output: optionalText(input.output, `runs.${key}.output`) }),
149
+ ...(errorInput === undefined
150
+ ? {}
151
+ : {
152
+ error: {
153
+ code: text(errorInput.code, `runs.${key}.error.code`),
154
+ message: text(errorInput.message, `runs.${key}.error.message`),
155
+ },
156
+ }),
157
+ ...(skipReason === undefined
158
+ ? {}
159
+ : { skipReason: skipReason }),
160
+ snapshot,
161
+ };
162
+ }
163
+ export function decodeAutomationState(value) {
164
+ const input = record(value, 'state');
165
+ if (input.schemaVersion !== STATE_SCHEMA_VERSION) {
166
+ throw new AutomationStateError(`state.schemaVersion must be ${STATE_SCHEMA_VERSION}; found ${String(input.schemaVersion)}`);
167
+ }
168
+ const jobsInput = record(input.jobs, 'state.jobs');
169
+ const runsInput = record(input.runs, 'state.runs');
170
+ const occurrencesInput = record(input.occurrences, 'state.occurrences');
171
+ if (!Array.isArray(input.runOrder))
172
+ throw new AutomationStateError('state.runOrder must be an array');
173
+ const jobs = Object.fromEntries(Object.entries(jobsInput).map(([key, job]) => [key, decodeJob(job, key)]));
174
+ const runs = Object.fromEntries(Object.entries(runsInput).map(([key, run]) => [key, decodeRun(run, key)]));
175
+ const runOrder = input.runOrder.map((id, index) => text(id, `state.runOrder[${index}]`));
176
+ if (new Set(runOrder).size !== runOrder.length)
177
+ throw new AutomationStateError('state.runOrder contains duplicate ids');
178
+ if (runOrder.length !== Object.keys(runs).length || runOrder.some((id) => runs[id] === undefined)) {
179
+ throw new AutomationStateError('state.runOrder must contain every run exactly once');
180
+ }
181
+ const occurrences = {};
182
+ for (const [occurrenceKey, runIdValue] of Object.entries(occurrencesInput)) {
183
+ const runId = text(runIdValue, `state.occurrences.${occurrenceKey}`);
184
+ const run = runs[runId];
185
+ if (run === undefined)
186
+ throw new AutomationStateError(`state.occurrences.${occurrenceKey} points to a missing run`);
187
+ if (run.occurrenceKey !== occurrenceKey) {
188
+ throw new AutomationStateError(`state.occurrences.${occurrenceKey} does not match run ${runId}`);
189
+ }
190
+ occurrences[occurrenceKey] = runId;
191
+ }
192
+ for (const run of Object.values(runs)) {
193
+ if (occurrences[run.occurrenceKey] !== run.id) {
194
+ throw new AutomationStateError(`run ${run.id} is missing from state.occurrences`);
195
+ }
196
+ }
197
+ return {
198
+ schemaVersion: STATE_SCHEMA_VERSION,
199
+ revision: nonNegativeInteger(input.revision, 'state.revision'),
200
+ jobs,
201
+ runs,
202
+ runOrder,
203
+ occurrences,
204
+ };
205
+ }
206
+ function isEnoent(error) {
207
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT';
208
+ }
209
+ async function readStateFile(path) {
210
+ let text;
211
+ try {
212
+ text = await readFile(path, 'utf8');
213
+ }
214
+ catch (error) {
215
+ if (isEnoent(error))
216
+ return createEmptyState();
217
+ throw error;
218
+ }
219
+ if (text.trim() === '')
220
+ return createEmptyState();
221
+ try {
222
+ return decodeAutomationState(JSON.parse(text));
223
+ }
224
+ catch (cause) {
225
+ if (cause instanceof AutomationStateError)
226
+ throw cause;
227
+ throw new AutomationStateError(`cannot parse automation state at ${path}`, { cause });
228
+ }
229
+ }
230
+ function renderState(state) {
231
+ return `${JSON.stringify(state, null, 2)}\n`;
232
+ }
233
+ export class AutomationStateStore {
234
+ path;
235
+ historyLimit;
236
+ state = createEmptyState();
237
+ operations = Promise.resolve();
238
+ closed = false;
239
+ constructor(path, historyLimit) {
240
+ this.path = path;
241
+ this.historyLimit = historyLimit;
242
+ }
243
+ async open(now) {
244
+ await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
245
+ await this.enqueue(async () => {
246
+ await withFileLock(this.path, async () => {
247
+ const state = await readStateFile(this.path);
248
+ const timestamp = now.toISOString();
249
+ for (const run of Object.values(state.runs)) {
250
+ if (run.status !== 'running')
251
+ continue;
252
+ run.status = 'interrupted';
253
+ run.finishedAt = timestamp;
254
+ run.error = {
255
+ code: 'HOST_RESTARTED',
256
+ message: 'The Harness process stopped while this run was active; it was not retried automatically.',
257
+ };
258
+ }
259
+ this.prune(state);
260
+ state.revision += 1;
261
+ await writeFileAtomic(this.path, renderState(state), { mode: 0o600, dirMode: 0o700 });
262
+ this.state = state;
263
+ });
264
+ });
265
+ }
266
+ snapshot() {
267
+ return structuredClone(this.state);
268
+ }
269
+ async mutate(mutation) {
270
+ if (this.closed)
271
+ throw new Error('automation state store is closed');
272
+ let result;
273
+ await this.enqueue(async () => {
274
+ await withFileLock(this.path, async () => {
275
+ const state = await readStateFile(this.path);
276
+ result = await mutation(state);
277
+ this.prune(state);
278
+ state.revision += 1;
279
+ await writeFileAtomic(this.path, renderState(state), { mode: 0o600, dirMode: 0o700 });
280
+ this.state = state;
281
+ });
282
+ });
283
+ return result;
284
+ }
285
+ async close() {
286
+ this.closed = true;
287
+ await this.operations;
288
+ }
289
+ enqueue(operation) {
290
+ const current = this.operations.then(operation);
291
+ this.operations = current.catch(() => undefined);
292
+ return current;
293
+ }
294
+ prune(state) {
295
+ let terminalCount = state.runOrder.reduce((count, id) => {
296
+ const run = state.runs[id];
297
+ return count + (run !== undefined && isTerminalRunStatus(run.status) ? 1 : 0);
298
+ }, 0);
299
+ if (terminalCount <= this.historyLimit)
300
+ return;
301
+ const retained = [];
302
+ for (const id of state.runOrder) {
303
+ const run = state.runs[id];
304
+ if (run === undefined)
305
+ continue;
306
+ if (terminalCount > this.historyLimit && isTerminalRunStatus(run.status)) {
307
+ terminalCount -= 1;
308
+ delete state.occurrences[run.occurrenceKey];
309
+ delete state.runs[id];
310
+ continue;
311
+ }
312
+ retained.push(id);
313
+ }
314
+ state.runOrder = retained;
315
+ }
316
+ }
317
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ export declare const STATE_SCHEMA_VERSION: 1;
3
+ export declare const AUTOMATION_PLUGIN_ID: "@syncended/dsh-automations";
4
+ export type OverlapPolicy = 'skip' | 'queue' | 'allow';
5
+ export type MisfirePolicy = 'skip' | 'run-once';
6
+ export type AutomationTrigger = 'cron' | 'manual';
7
+ export type AutomationRunStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'timed-out' | 'skipped' | 'interrupted';
8
+ export interface CronSchedule {
9
+ /** Standard five-field cron expression: minute hour day-of-month month day-of-week. */
10
+ cron: string;
11
+ /** UTC or an IANA timezone such as Europe/Berlin. */
12
+ timezone: string;
13
+ }
14
+ export interface AgentExecutionSpec {
15
+ /** Absolute project directory and immutable session workspace root. */
16
+ cwd: string;
17
+ /** Omitted provider and model resolve from the current Harness default at dispatch time. */
18
+ provider?: string;
19
+ model?: string;
20
+ reasoningEffort?: string;
21
+ /** Omitted preset resolves to the current Harness agent-preset default. */
22
+ agentPreset?: string;
23
+ /** Harness permission preset (sandbox mode + approval policy). */
24
+ permissionPreset: string;
25
+ /** Wall-clock limit for this run. */
26
+ timeoutMs: number;
27
+ }
28
+ export interface AgentTaskSpec {
29
+ kind: 'agent';
30
+ prompt: string;
31
+ }
32
+ export interface AutomationPolicies {
33
+ overlap: OverlapPolicy;
34
+ misfire: MisfirePolicy;
35
+ }
36
+ /** User-owned, versioned definition. Scheduler projection fields do not belong here. */
37
+ export interface AutomationJobSpec {
38
+ name: string;
39
+ enabled: boolean;
40
+ schedule: CronSchedule;
41
+ task: AgentTaskSpec;
42
+ execution: AgentExecutionSpec;
43
+ policies: AutomationPolicies;
44
+ }
45
+ export interface AutomationJob extends AutomationJobSpec {
46
+ id: string;
47
+ version: number;
48
+ createdAt: string;
49
+ updatedAt: string;
50
+ /** Durable scheduler watermark; null while disabled. */
51
+ nextRunAt: string | null;
52
+ }
53
+ /** Full immutable execution snapshot pinned when an occurrence is admitted. */
54
+ export interface AutomationRunSnapshot extends AutomationJobSpec {
55
+ jobId: string;
56
+ jobVersion: number;
57
+ }
58
+ export interface AutomationRunError {
59
+ code: string;
60
+ message: string;
61
+ }
62
+ export interface AutomationRun {
63
+ id: string;
64
+ occurrenceKey: string;
65
+ jobId: string;
66
+ jobVersion: number;
67
+ jobName: string;
68
+ trigger: AutomationTrigger;
69
+ scheduledFor: string;
70
+ status: AutomationRunStatus;
71
+ createdAt: string;
72
+ startedAt?: string;
73
+ finishedAt?: string;
74
+ sessionId?: string;
75
+ output?: string;
76
+ error?: AutomationRunError;
77
+ skipReason?: 'overlap' | 'misfire' | 'job-disabled' | 'job-deleted';
78
+ snapshot: AutomationRunSnapshot;
79
+ }
80
+ export interface AutomationState {
81
+ schemaVersion: typeof STATE_SCHEMA_VERSION;
82
+ revision: number;
83
+ jobs: Record<string, AutomationJob>;
84
+ runs: Record<string, AutomationRun>;
85
+ /** Newest last; stable ordering without relying on object-key ordering. */
86
+ runOrder: string[];
87
+ /** Durable idempotency index from occurrence key to run id. */
88
+ occurrences: Record<string, string>;
89
+ }
90
+ export interface AutomationSnapshot {
91
+ revision: number;
92
+ jobs: AutomationJob[];
93
+ runs: AutomationRun[];
94
+ }
95
+ export interface CreateAutomationJobRequest {
96
+ spec: AutomationJobSpec;
97
+ id?: string;
98
+ }
99
+ export interface UpdateAutomationJobRequest {
100
+ spec: AutomationJobSpec;
101
+ expectedVersion?: number;
102
+ }
103
+ export interface ExecutorRunResult {
104
+ sessionId?: string;
105
+ output?: string;
106
+ }
107
+ export interface AutomationExecutorContext {
108
+ run: AutomationRun;
109
+ signal: AbortSignal;
110
+ /** Persist the session id as soon as the Harness session exists. */
111
+ attachSession(sessionId: string): Promise<void>;
112
+ }
113
+ /** Future workflow/task-graph executors plug into this seam without touching cron admission. */
114
+ export interface AutomationExecutor {
115
+ readonly kind: AgentTaskSpec['kind'] | (string & {});
116
+ execute(context: AutomationExecutorContext): Promise<ExecutorRunResult>;
117
+ }
118
+ export interface SchedulerClock {
119
+ now(): Date;
120
+ setTimeout(callback: () => void, delayMs: number): ReturnType<typeof setTimeout>;
121
+ clearTimeout(handle: ReturnType<typeof setTimeout>): void;
122
+ }
123
+ export interface AutomationServiceConfig {
124
+ statePath?: string;
125
+ dshHome?: string;
126
+ maxConcurrentRuns?: number;
127
+ historyLimit?: number;
128
+ misfireGraceMs?: number;
129
+ maxOutputChars?: number;
130
+ allowedProjectRoots?: string[];
131
+ }
132
+ export interface AutomationMeta {
133
+ defaultModel: {
134
+ provider: string;
135
+ model: string;
136
+ reasoningEffort?: string;
137
+ };
138
+ providers: Array<{
139
+ id: string;
140
+ models: string[];
141
+ }>;
142
+ permissionPresets: string[];
143
+ agentPresets: Array<{
144
+ id: string;
145
+ name: string;
146
+ broken?: string;
147
+ }>;
148
+ }
149
+ export interface AutomationServiceApi {
150
+ snapshot(limit?: number): AutomationSnapshot;
151
+ create(input: CreateAutomationJobRequest): Promise<AutomationJob>;
152
+ update(id: string, input: UpdateAutomationJobRequest): Promise<AutomationJob>;
153
+ remove(id: string): Promise<void>;
154
+ setEnabled(id: string, enabled: boolean, expectedVersion?: number): Promise<AutomationJob>;
155
+ trigger(id: string): Promise<AutomationRun>;
156
+ cancel(runId: string, reason?: string): Promise<AutomationRun>;
157
+ metadata(): Promise<AutomationMeta>;
158
+ registerExecutor(executor: AutomationExecutor): () => void;
159
+ }
160
+ declare module '@deepseek-ai/cordis' {
161
+ interface Context {
162
+ automations: AutomationServiceApi;
163
+ }
164
+ }
165
+ /** Compile-time assertion that the public service can be carried on a Cordis context. */
166
+ export type AutomationContext = Context & {
167
+ automations: AutomationServiceApi;
168
+ };
169
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ export const STATE_SCHEMA_VERSION = 1;
2
+ export const AUTOMATION_PLUGIN_ID = '@syncended/dsh-automations';
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAU,CAAA;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,4BAAqC,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { AutomationJobSpec } from './types.js';
2
+ export declare class AutomationInputError extends Error {
3
+ readonly code: string;
4
+ readonly status: number;
5
+ constructor(message: string, code?: string, status?: number, options?: ErrorOptions);
6
+ }
7
+ export declare function normalizeJobId(value: string): string;
8
+ export declare function slugifyJobId(name: string): string;
9
+ export declare function normalizeJobSpec(value: unknown): AutomationJobSpec;
10
+ export declare function assertExpectedVersion(value: unknown): number | undefined;
11
+ export declare function assertJsonObject(value: unknown, path?: string): Record<string, unknown>;
12
+ export declare function assertOnlyKeys(value: Record<string, unknown>, allowed: readonly string[], path?: string): void;
13
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,YAAY,CAAA;AAUnB,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAEX,OAAO,EAAE,MAAM,EAAE,IAAI,SAAkB,EAAE,MAAM,SAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAM1F;AA0CD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASpD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQjD;AA4DD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAiBlE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,SAAiB,GAAG,IAAI,CAEtH"}