@dsh-enhanced/assistant-automations 0.1.3
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/LICENSE +21 -0
- package/README.md +135 -0
- package/cordis.patch.yml +36 -0
- package/lib/artifacts.d.ts +15 -0
- package/lib/artifacts.d.ts.map +1 -0
- package/lib/artifacts.js +68 -0
- package/lib/artifacts.js.map +1 -0
- package/lib/coordinator.d.ts +126 -0
- package/lib/coordinator.d.ts.map +1 -0
- package/lib/coordinator.js +374 -0
- package/lib/coordinator.js.map +1 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/operator.d.ts +4 -0
- package/lib/operator.d.ts.map +1 -0
- package/lib/operator.js +12 -0
- package/lib/operator.js.map +1 -0
- package/lib/proposals.d.ts +89 -0
- package/lib/proposals.d.ts.map +1 -0
- package/lib/proposals.js +499 -0
- package/lib/proposals.js.map +1 -0
- package/lib/runner.d.ts +34 -0
- package/lib/runner.d.ts.map +1 -0
- package/lib/runner.js +272 -0
- package/lib/runner.js.map +1 -0
- package/lib/schedule.d.ts +32 -0
- package/lib/schedule.d.ts.map +1 -0
- package/lib/schedule.js +245 -0
- package/lib/schedule.js.map +1 -0
- package/lib/service.d.ts +159 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +445 -0
- package/lib/service.js.map +1 -0
- package/lib/sqlite.d.ts +8 -0
- package/lib/sqlite.d.ts.map +1 -0
- package/lib/sqlite.js +281 -0
- package/lib/sqlite.js.map +1 -0
- package/lib/store.d.ts +169 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +1002 -0
- package/lib/store.js.map +1 -0
- package/lib/tools.d.ts +4 -0
- package/lib/tools.d.ts.map +1 -0
- package/lib/tools.js +226 -0
- package/lib/tools.js.map +1 -0
- package/lib/types.d.ts +182 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +2 -0
- package/lib/version.js.map +1 -0
- package/package.json +106 -0
package/lib/sqlite.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { chmodSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, isAbsolute } from 'node:path';
|
|
3
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
|
+
export const automationSchemaVersion = 4;
|
|
5
|
+
export class AutomationDatabaseError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
constructor(code, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = 'AutomationDatabaseError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function migrate(database) {
|
|
14
|
+
let version = database.prepare('PRAGMA user_version').get().user_version;
|
|
15
|
+
if (version > automationSchemaVersion) {
|
|
16
|
+
throw new AutomationDatabaseError('schema-too-new', `automation schema ${version} is newer than supported schema ${automationSchemaVersion}`);
|
|
17
|
+
}
|
|
18
|
+
if (version === automationSchemaVersion)
|
|
19
|
+
return;
|
|
20
|
+
if (version === 0) {
|
|
21
|
+
database.exec(`
|
|
22
|
+
BEGIN IMMEDIATE;
|
|
23
|
+
CREATE TABLE automation_definitions (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
create_idempotency_key TEXT NOT NULL UNIQUE,
|
|
26
|
+
system_owner TEXT,
|
|
27
|
+
definition_hash TEXT NOT NULL,
|
|
28
|
+
definition_json TEXT NOT NULL,
|
|
29
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'paused', 'deleted')),
|
|
30
|
+
next_run_at INTEGER,
|
|
31
|
+
created_at INTEGER NOT NULL,
|
|
32
|
+
updated_at INTEGER NOT NULL,
|
|
33
|
+
version INTEGER NOT NULL CHECK (version >= 1)
|
|
34
|
+
) STRICT;
|
|
35
|
+
CREATE INDEX automation_due ON automation_definitions(status, next_run_at, id);
|
|
36
|
+
|
|
37
|
+
CREATE TABLE automation_changes (
|
|
38
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
39
|
+
automation_id TEXT NOT NULL,
|
|
40
|
+
operation TEXT NOT NULL,
|
|
41
|
+
expected_version INTEGER NOT NULL,
|
|
42
|
+
input_hash TEXT NOT NULL,
|
|
43
|
+
result_json TEXT NOT NULL,
|
|
44
|
+
created_at INTEGER NOT NULL,
|
|
45
|
+
FOREIGN KEY (automation_id) REFERENCES automation_definitions(id)
|
|
46
|
+
) STRICT;
|
|
47
|
+
|
|
48
|
+
CREATE TABLE automation_occurrences (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
automation_id TEXT NOT NULL,
|
|
51
|
+
trigger_kind TEXT NOT NULL CHECK (trigger_kind IN ('scheduled', 'manual', 'external')),
|
|
52
|
+
trigger_key TEXT NOT NULL,
|
|
53
|
+
scheduled_at INTEGER NOT NULL,
|
|
54
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'skipped', 'succeeded', 'failed', 'timed_out', 'cancelled', 'unknown')),
|
|
55
|
+
reason TEXT,
|
|
56
|
+
dry_run INTEGER NOT NULL CHECK (dry_run IN (0, 1)),
|
|
57
|
+
created_at INTEGER NOT NULL,
|
|
58
|
+
updated_at INTEGER NOT NULL,
|
|
59
|
+
UNIQUE (automation_id, trigger_kind, trigger_key),
|
|
60
|
+
FOREIGN KEY (automation_id) REFERENCES automation_definitions(id)
|
|
61
|
+
) STRICT;
|
|
62
|
+
CREATE INDEX automation_occurrence_history ON automation_occurrences(automation_id, scheduled_at DESC, id DESC);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE automation_tasks (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
occurrence_id TEXT NOT NULL UNIQUE,
|
|
67
|
+
automation_id TEXT NOT NULL,
|
|
68
|
+
status TEXT NOT NULL CHECK (status IN ('scheduled', 'claimed', 'running', 'succeeded', 'failed', 'timed_out', 'cancelled', 'lost', 'unknown')),
|
|
69
|
+
cancel_requested INTEGER NOT NULL DEFAULT 0 CHECK (cancel_requested IN (0, 1)),
|
|
70
|
+
claimed_by TEXT,
|
|
71
|
+
fencing_token INTEGER,
|
|
72
|
+
lease_until INTEGER,
|
|
73
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
74
|
+
created_at INTEGER NOT NULL,
|
|
75
|
+
updated_at INTEGER NOT NULL,
|
|
76
|
+
FOREIGN KEY (occurrence_id) REFERENCES automation_occurrences(id),
|
|
77
|
+
FOREIGN KEY (automation_id) REFERENCES automation_definitions(id)
|
|
78
|
+
) STRICT;
|
|
79
|
+
CREATE INDEX automation_task_claim ON automation_tasks(status, created_at, id);
|
|
80
|
+
|
|
81
|
+
CREATE TABLE automation_attempts (
|
|
82
|
+
id TEXT PRIMARY KEY,
|
|
83
|
+
task_id TEXT NOT NULL,
|
|
84
|
+
attempt_number INTEGER NOT NULL,
|
|
85
|
+
owner_id TEXT NOT NULL,
|
|
86
|
+
fencing_token INTEGER NOT NULL,
|
|
87
|
+
status TEXT NOT NULL CHECK (status IN ('claimed', 'running', 'succeeded', 'failed', 'timed_out', 'cancelled', 'lost', 'unknown')),
|
|
88
|
+
session_id TEXT,
|
|
89
|
+
failure_code TEXT,
|
|
90
|
+
started_at INTEGER,
|
|
91
|
+
finished_at INTEGER,
|
|
92
|
+
created_at INTEGER NOT NULL,
|
|
93
|
+
updated_at INTEGER NOT NULL,
|
|
94
|
+
UNIQUE (task_id, attempt_number),
|
|
95
|
+
FOREIGN KEY (task_id) REFERENCES automation_tasks(id)
|
|
96
|
+
) STRICT;
|
|
97
|
+
|
|
98
|
+
CREATE TABLE automation_runs (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
occurrence_id TEXT NOT NULL UNIQUE,
|
|
101
|
+
automation_id TEXT NOT NULL,
|
|
102
|
+
task_id TEXT NOT NULL UNIQUE,
|
|
103
|
+
attempt_id TEXT NOT NULL UNIQUE,
|
|
104
|
+
status TEXT NOT NULL CHECK (status IN ('succeeded', 'failed', 'timed_out', 'cancelled', 'unknown')),
|
|
105
|
+
session_id TEXT,
|
|
106
|
+
artifact_ref TEXT,
|
|
107
|
+
output_preview TEXT NOT NULL,
|
|
108
|
+
usage_json TEXT NOT NULL,
|
|
109
|
+
delivery_status TEXT,
|
|
110
|
+
delivery_ref TEXT,
|
|
111
|
+
evidence_status TEXT NOT NULL CHECK (evidence_status IN ('pending', 'recorded', 'suppressed')),
|
|
112
|
+
evidence_json TEXT,
|
|
113
|
+
created_at INTEGER NOT NULL,
|
|
114
|
+
updated_at INTEGER NOT NULL,
|
|
115
|
+
CHECK (
|
|
116
|
+
(evidence_status IN ('pending', 'recorded') AND evidence_json IS NOT NULL)
|
|
117
|
+
OR (evidence_status = 'suppressed' AND evidence_json IS NULL)
|
|
118
|
+
),
|
|
119
|
+
FOREIGN KEY (occurrence_id) REFERENCES automation_occurrences(id),
|
|
120
|
+
FOREIGN KEY (automation_id) REFERENCES automation_definitions(id),
|
|
121
|
+
FOREIGN KEY (task_id) REFERENCES automation_tasks(id),
|
|
122
|
+
FOREIGN KEY (attempt_id) REFERENCES automation_attempts(id)
|
|
123
|
+
) STRICT;
|
|
124
|
+
|
|
125
|
+
CREATE TABLE duty_lease (
|
|
126
|
+
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
127
|
+
owner_id TEXT NOT NULL,
|
|
128
|
+
fencing_token INTEGER NOT NULL CHECK (fencing_token >= 1),
|
|
129
|
+
lease_until INTEGER NOT NULL,
|
|
130
|
+
updated_at INTEGER NOT NULL
|
|
131
|
+
) STRICT;
|
|
132
|
+
|
|
133
|
+
CREATE TABLE automation_proposals (
|
|
134
|
+
id TEXT PRIMARY KEY,
|
|
135
|
+
policy_proposal_id TEXT UNIQUE,
|
|
136
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
137
|
+
requester TEXT NOT NULL,
|
|
138
|
+
principal TEXT NOT NULL,
|
|
139
|
+
dispatch_json TEXT CHECK (dispatch_json IS NULL OR json_valid(dispatch_json)),
|
|
140
|
+
change_hash TEXT NOT NULL,
|
|
141
|
+
change_json TEXT NOT NULL,
|
|
142
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired', 'conflicted')),
|
|
143
|
+
expires_at INTEGER NOT NULL,
|
|
144
|
+
ttl_ms INTEGER NOT NULL CHECK (ttl_ms > 0),
|
|
145
|
+
result_automation_id TEXT,
|
|
146
|
+
created_at INTEGER NOT NULL,
|
|
147
|
+
updated_at INTEGER NOT NULL,
|
|
148
|
+
version INTEGER NOT NULL DEFAULT 1
|
|
149
|
+
) STRICT;
|
|
150
|
+
|
|
151
|
+
CREATE TABLE automation_system_reconciles (
|
|
152
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
153
|
+
system_owner TEXT NOT NULL,
|
|
154
|
+
automation_id TEXT NOT NULL,
|
|
155
|
+
input_hash TEXT NOT NULL,
|
|
156
|
+
result_json TEXT NOT NULL,
|
|
157
|
+
created_at INTEGER NOT NULL,
|
|
158
|
+
FOREIGN KEY (automation_id) REFERENCES automation_definitions(id)
|
|
159
|
+
) STRICT;
|
|
160
|
+
|
|
161
|
+
PRAGMA user_version = 4;
|
|
162
|
+
COMMIT;
|
|
163
|
+
`);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (version === 1) {
|
|
167
|
+
database.exec(`
|
|
168
|
+
BEGIN IMMEDIATE;
|
|
169
|
+
ALTER TABLE automation_definitions ADD COLUMN system_owner TEXT;
|
|
170
|
+
CREATE TABLE automation_system_reconciles (
|
|
171
|
+
idempotency_key TEXT PRIMARY KEY,
|
|
172
|
+
system_owner TEXT NOT NULL,
|
|
173
|
+
automation_id TEXT NOT NULL,
|
|
174
|
+
input_hash TEXT NOT NULL,
|
|
175
|
+
result_json TEXT NOT NULL,
|
|
176
|
+
created_at INTEGER NOT NULL,
|
|
177
|
+
FOREIGN KEY (automation_id) REFERENCES automation_definitions(id)
|
|
178
|
+
) STRICT;
|
|
179
|
+
PRAGMA user_version = 2;
|
|
180
|
+
COMMIT;
|
|
181
|
+
`);
|
|
182
|
+
version = 2;
|
|
183
|
+
}
|
|
184
|
+
if (version === 2) {
|
|
185
|
+
database.exec(`
|
|
186
|
+
BEGIN IMMEDIATE;
|
|
187
|
+
ALTER TABLE automation_runs ADD COLUMN evidence_status TEXT NOT NULL DEFAULT 'suppressed'
|
|
188
|
+
CHECK (evidence_status IN ('pending', 'recorded', 'suppressed'));
|
|
189
|
+
ALTER TABLE automation_runs ADD COLUMN evidence_json TEXT;
|
|
190
|
+
WITH evidence_eligible(id) AS (
|
|
191
|
+
SELECT run.id
|
|
192
|
+
FROM automation_runs AS run
|
|
193
|
+
JOIN automation_definitions AS definition ON definition.id = run.automation_id
|
|
194
|
+
WHERE run.status IN ('succeeded', 'failed', 'timed_out')
|
|
195
|
+
AND json_valid(definition.definition_json)
|
|
196
|
+
AND json_type(definition.definition_json, '$.name') = 'text'
|
|
197
|
+
AND length(CAST(json_extract(definition.definition_json, '$.name') AS BLOB)) BETWEEN 1 AND 500
|
|
198
|
+
AND json_type(definition.definition_json, '$.workspace') = 'text'
|
|
199
|
+
AND length(CAST(json_extract(definition.definition_json, '$.workspace') AS BLOB)) BETWEEN 1 AND 4096
|
|
200
|
+
AND json_type(definition.definition_json, '$.agentPreset') = 'text'
|
|
201
|
+
AND length(CAST(json_extract(definition.definition_json, '$.agentPreset') AS BLOB)) BETWEEN 1 AND 200
|
|
202
|
+
)
|
|
203
|
+
UPDATE automation_runs AS run
|
|
204
|
+
SET evidence_status = CASE
|
|
205
|
+
WHEN run.id IN (SELECT id FROM evidence_eligible) THEN 'pending'
|
|
206
|
+
ELSE 'suppressed'
|
|
207
|
+
END,
|
|
208
|
+
evidence_json = CASE
|
|
209
|
+
WHEN run.id IN (SELECT id FROM evidence_eligible) THEN (
|
|
210
|
+
SELECT json_object(
|
|
211
|
+
'situation', 'automation:' || run.automation_id,
|
|
212
|
+
'outcome', CASE WHEN run.status = 'succeeded' THEN 'succeeded' ELSE 'failed' END,
|
|
213
|
+
'detail', 'automation "' || json_extract(definition_json, '$.name') || '": run ' || run.status,
|
|
214
|
+
'idempotencyKey', 'automation-run:' || run.id,
|
|
215
|
+
'occurredAt', run.created_at,
|
|
216
|
+
'workspace', json_extract(definition_json, '$.workspace'),
|
|
217
|
+
'agentPreset', json_extract(definition_json, '$.agentPreset'),
|
|
218
|
+
'automationId', run.automation_id,
|
|
219
|
+
'runId', run.id
|
|
220
|
+
)
|
|
221
|
+
FROM automation_definitions
|
|
222
|
+
WHERE id = run.automation_id
|
|
223
|
+
)
|
|
224
|
+
ELSE NULL
|
|
225
|
+
END;
|
|
226
|
+
PRAGMA user_version = 3;
|
|
227
|
+
COMMIT;
|
|
228
|
+
`);
|
|
229
|
+
version = 3;
|
|
230
|
+
}
|
|
231
|
+
if (version === 3) {
|
|
232
|
+
const proposalsTable = database.prepare(`
|
|
233
|
+
SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = 'automation_proposals'
|
|
234
|
+
`).get();
|
|
235
|
+
if (proposalsTable === undefined) {
|
|
236
|
+
// Some narrow rc.8 test/repair databases contain only the execution tables.
|
|
237
|
+
// They cannot host proposals, but may still be opened read-only by AutomationStore.
|
|
238
|
+
database.exec('PRAGMA user_version = 4');
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
database.exec(`
|
|
242
|
+
BEGIN IMMEDIATE;
|
|
243
|
+
ALTER TABLE automation_proposals ADD COLUMN dispatch_json TEXT
|
|
244
|
+
CHECK (dispatch_json IS NULL OR json_valid(dispatch_json));
|
|
245
|
+
ALTER TABLE automation_proposals ADD COLUMN ttl_ms INTEGER;
|
|
246
|
+
UPDATE automation_proposals
|
|
247
|
+
SET ttl_ms = expires_at - created_at
|
|
248
|
+
WHERE ttl_ms IS NULL AND expires_at > created_at;
|
|
249
|
+
PRAGMA user_version = 4;
|
|
250
|
+
COMMIT;
|
|
251
|
+
`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
export function openAutomationDatabase(path) {
|
|
256
|
+
if (path !== ':memory:' && !isAbsolute(path)) {
|
|
257
|
+
throw new AutomationDatabaseError('invalid-path', 'automation database path must be absolute');
|
|
258
|
+
}
|
|
259
|
+
if (path !== ':memory:') {
|
|
260
|
+
const directory = dirname(path);
|
|
261
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
262
|
+
chmodSync(directory, 0o700);
|
|
263
|
+
}
|
|
264
|
+
const database = new DatabaseSync(path);
|
|
265
|
+
try {
|
|
266
|
+
database.exec('PRAGMA foreign_keys = ON');
|
|
267
|
+
database.exec('PRAGMA busy_timeout = 5000');
|
|
268
|
+
database.exec('PRAGMA synchronous = FULL');
|
|
269
|
+
migrate(database);
|
|
270
|
+
if (path !== ':memory:') {
|
|
271
|
+
database.exec('PRAGMA journal_mode = WAL');
|
|
272
|
+
chmodSync(path, 0o600);
|
|
273
|
+
}
|
|
274
|
+
return database;
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
database.close();
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"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"}
|
package/lib/store.d.ts
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { AutomationDefinition, AutomationEvidenceAttribution, AutomationOccurrence, AutomationRecord, AutomationRun, AutomationRunStatus, AutomationTask, DutyLease, OccurrenceTriggerKind } from './types.js';
|
|
2
|
+
export type AutomationStoreErrorCode = 'idempotency-conflict' | 'invalid-definition' | 'invalid-path' | 'invalid-state' | 'not-found' | 'schema-too-new' | 'stale-fence' | 'version-conflict';
|
|
3
|
+
export declare class AutomationStoreError extends Error {
|
|
4
|
+
readonly code: AutomationStoreErrorCode;
|
|
5
|
+
constructor(code: AutomationStoreErrorCode, message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeAutomationDefinition(value: unknown, maxPromptBytes?: number, maxAllowedTools?: number): AutomationDefinition;
|
|
8
|
+
export declare function stableOccurrenceId(automationId: string, triggerKind: OccurrenceTriggerKind, triggerKey: string): string;
|
|
9
|
+
export declare class AutomationStore {
|
|
10
|
+
private readonly database;
|
|
11
|
+
private readonly now;
|
|
12
|
+
private readonly maxPromptBytes;
|
|
13
|
+
private readonly maxAllowedTools;
|
|
14
|
+
private closed;
|
|
15
|
+
constructor(options: {
|
|
16
|
+
path: string;
|
|
17
|
+
now?: () => number;
|
|
18
|
+
maxPromptBytes?: number;
|
|
19
|
+
maxAllowedTools?: number;
|
|
20
|
+
});
|
|
21
|
+
close(): void;
|
|
22
|
+
private transaction;
|
|
23
|
+
createApproved(input: {
|
|
24
|
+
automationId: string;
|
|
25
|
+
idempotencyKey: string;
|
|
26
|
+
definition: unknown;
|
|
27
|
+
}): AutomationRecord;
|
|
28
|
+
reconcileSystemOwned(input: {
|
|
29
|
+
owner: string;
|
|
30
|
+
automationId: string;
|
|
31
|
+
idempotencyKey: string;
|
|
32
|
+
desiredStatus?: 'active' | 'paused';
|
|
33
|
+
definition: unknown;
|
|
34
|
+
}): AutomationRecord;
|
|
35
|
+
get(id: string): AutomationRecord | undefined;
|
|
36
|
+
list(): AutomationRecord[];
|
|
37
|
+
health(): {
|
|
38
|
+
activeAutomations: number;
|
|
39
|
+
pausedAutomations: number;
|
|
40
|
+
pendingTasks: number;
|
|
41
|
+
runningTasks: number;
|
|
42
|
+
failedRuns: number;
|
|
43
|
+
unknownRuns: number;
|
|
44
|
+
};
|
|
45
|
+
changeApproved(input: {
|
|
46
|
+
automationId: string;
|
|
47
|
+
operation: 'delete' | 'pause' | 'resume';
|
|
48
|
+
expectedVersion: number;
|
|
49
|
+
idempotencyKey: string;
|
|
50
|
+
}): AutomationRecord;
|
|
51
|
+
materializeDue(input: {
|
|
52
|
+
now: number;
|
|
53
|
+
misfireGraceMs: number;
|
|
54
|
+
maxCatchUp: number;
|
|
55
|
+
}): AutomationOccurrence[];
|
|
56
|
+
ingestExternal(input: {
|
|
57
|
+
automationId: string;
|
|
58
|
+
externalEventId: string;
|
|
59
|
+
occurredAt: number;
|
|
60
|
+
}): AutomationOccurrence;
|
|
61
|
+
createManual(input: {
|
|
62
|
+
automationId: string;
|
|
63
|
+
requestId: string;
|
|
64
|
+
dryRun: boolean;
|
|
65
|
+
}): AutomationOccurrence;
|
|
66
|
+
listOccurrences(input: {
|
|
67
|
+
automationId?: string;
|
|
68
|
+
limit: number;
|
|
69
|
+
}): AutomationOccurrence[];
|
|
70
|
+
getOccurrence(id: string): AutomationOccurrence | undefined;
|
|
71
|
+
listTasks(input: {
|
|
72
|
+
automationId?: string;
|
|
73
|
+
limit: number;
|
|
74
|
+
}): AutomationTask[];
|
|
75
|
+
getTaskRecord(id: string): AutomationTask | undefined;
|
|
76
|
+
acquireDuty(input: {
|
|
77
|
+
ownerId: string;
|
|
78
|
+
now: number;
|
|
79
|
+
leaseMs: number;
|
|
80
|
+
}): DutyLease;
|
|
81
|
+
renewDuty(input: {
|
|
82
|
+
ownerId: string;
|
|
83
|
+
fencingToken: number;
|
|
84
|
+
now: number;
|
|
85
|
+
leaseMs: number;
|
|
86
|
+
}): DutyLease;
|
|
87
|
+
claimNextTask(input: {
|
|
88
|
+
ownerId: string;
|
|
89
|
+
fencingToken: number;
|
|
90
|
+
now: number;
|
|
91
|
+
leaseMs: number;
|
|
92
|
+
}): AutomationTask | undefined;
|
|
93
|
+
claimTask(input: {
|
|
94
|
+
taskId: string;
|
|
95
|
+
ownerId: string;
|
|
96
|
+
fencingToken: number;
|
|
97
|
+
now: number;
|
|
98
|
+
leaseMs: number;
|
|
99
|
+
}): AutomationTask | undefined;
|
|
100
|
+
startTask(input: {
|
|
101
|
+
taskId: string;
|
|
102
|
+
ownerId: string;
|
|
103
|
+
fencingToken: number;
|
|
104
|
+
now: number;
|
|
105
|
+
leaseMs: number;
|
|
106
|
+
sessionId: string;
|
|
107
|
+
}): AutomationTask;
|
|
108
|
+
heartbeatTask(input: {
|
|
109
|
+
taskId: string;
|
|
110
|
+
ownerId: string;
|
|
111
|
+
fencingToken: number;
|
|
112
|
+
now: number;
|
|
113
|
+
leaseMs: number;
|
|
114
|
+
}): AutomationTask;
|
|
115
|
+
requestCancellation(input: {
|
|
116
|
+
taskId: string;
|
|
117
|
+
now: number;
|
|
118
|
+
}): AutomationTask;
|
|
119
|
+
completeTask(input: {
|
|
120
|
+
taskId: string;
|
|
121
|
+
ownerId: string;
|
|
122
|
+
fencingToken: number;
|
|
123
|
+
now: number;
|
|
124
|
+
outcome: AutomationRunStatus;
|
|
125
|
+
sessionId?: string;
|
|
126
|
+
artifactRef?: string;
|
|
127
|
+
outputPreview: string;
|
|
128
|
+
usage: Readonly<Record<string, unknown>>;
|
|
129
|
+
evidenceAttribution?: AutomationEvidenceAttribution;
|
|
130
|
+
}): AutomationRun;
|
|
131
|
+
listPendingEvidence(limit: number): AutomationRun[];
|
|
132
|
+
deferRunEvidence(input: {
|
|
133
|
+
runId: string;
|
|
134
|
+
expectedStatus: 'pending';
|
|
135
|
+
now: number;
|
|
136
|
+
}): AutomationRun;
|
|
137
|
+
completeRunEvidence(input: {
|
|
138
|
+
runId: string;
|
|
139
|
+
expectedStatus: 'pending';
|
|
140
|
+
now: number;
|
|
141
|
+
}): AutomationRun;
|
|
142
|
+
listPendingDeliveries(limit: number): AutomationRun[];
|
|
143
|
+
completeRunDelivery(input: {
|
|
144
|
+
runId: string;
|
|
145
|
+
expectedStatus: 'pending';
|
|
146
|
+
deliveryRef: string;
|
|
147
|
+
now: number;
|
|
148
|
+
}): AutomationRun;
|
|
149
|
+
suppressRunDelivery(input: {
|
|
150
|
+
runId: string;
|
|
151
|
+
expectedStatus: 'pending';
|
|
152
|
+
now: number;
|
|
153
|
+
}): AutomationRun;
|
|
154
|
+
listRuns(input: {
|
|
155
|
+
automationId?: string;
|
|
156
|
+
limit: number;
|
|
157
|
+
}): AutomationRun[];
|
|
158
|
+
recoverExpiredTasks(input: {
|
|
159
|
+
now: number;
|
|
160
|
+
limit?: number;
|
|
161
|
+
}): AutomationTask[];
|
|
162
|
+
private validateLease;
|
|
163
|
+
private requireDuty;
|
|
164
|
+
private getTask;
|
|
165
|
+
private requireMutableTask;
|
|
166
|
+
private claimTaskInTransaction;
|
|
167
|
+
private insertOccurrence;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|