@dsh-enhanced/event-triggers 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 +48 -0
- package/cordis.patch.yml +18 -0
- package/lib/config.d.ts +73 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +149 -0
- package/lib/config.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -0
- package/lib/sensors.d.ts +52 -0
- package/lib/sensors.d.ts.map +1 -0
- package/lib/sensors.js +440 -0
- package/lib/sensors.js.map +1 -0
- package/lib/service.d.ts +73 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +334 -0
- package/lib/service.js.map +1 -0
- package/lib/sqlite.d.ts +7 -0
- package/lib/sqlite.d.ts.map +1 -0
- package/lib/sqlite.js +128 -0
- package/lib/sqlite.js.map +1 -0
- package/lib/store.d.ts +81 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +259 -0
- package/lib/store.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 +81 -0
package/lib/store.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { EventTriggerDatabaseError, openEventTriggerDatabase } from './sqlite.js';
|
|
3
|
+
export class EventTriggerStoreError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(code, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.name = 'EventTriggerStoreError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function event(row) {
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
id: row.id, triggerId: row.trigger_id, eventId: row.event_id, occurredAt: row.occurred_at,
|
|
14
|
+
status: row.status, attempts: row.attempts,
|
|
15
|
+
...(row.delivered_at === null ? {} : { deliveredAt: row.delivered_at }),
|
|
16
|
+
nextAttemptAt: row.next_attempt_at,
|
|
17
|
+
...(row.last_attempt_at === null ? {} : { lastAttemptAt: row.last_attempt_at }),
|
|
18
|
+
...(row.last_error === null ? {} : { lastError: row.last_error }),
|
|
19
|
+
createdAt: row.created_at,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function stableEventId(triggerId, key) {
|
|
23
|
+
return `event-${createHash('sha256').update(`${triggerId}\0${key}`).digest('hex')}`;
|
|
24
|
+
}
|
|
25
|
+
function validTime(value, field) {
|
|
26
|
+
if (!Number.isSafeInteger(value) || value < 0)
|
|
27
|
+
throw new EventTriggerStoreError('invalid-input', `${field} is invalid`);
|
|
28
|
+
}
|
|
29
|
+
function errorText(value) {
|
|
30
|
+
try {
|
|
31
|
+
const candidate = value instanceof Error ? value.message : value;
|
|
32
|
+
const text = typeof candidate === 'string' ? candidate : 'unknown failure';
|
|
33
|
+
const printable = [...text.slice(0, 2_048).normalize('NFC')].map(character => {
|
|
34
|
+
const codePoint = character.codePointAt(0);
|
|
35
|
+
return codePoint <= 0x1f || codePoint === 0x7f ? ' ' : character;
|
|
36
|
+
}).join('');
|
|
37
|
+
return printable.slice(0, 512) || 'unknown failure';
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return 'unknown failure';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class EventTriggerStore {
|
|
44
|
+
database;
|
|
45
|
+
now;
|
|
46
|
+
closed = false;
|
|
47
|
+
constructor(options) {
|
|
48
|
+
this.now = options.now ?? Date.now;
|
|
49
|
+
try {
|
|
50
|
+
this.database = openEventTriggerDatabase(options.path);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof EventTriggerDatabaseError)
|
|
54
|
+
throw new EventTriggerStoreError(error.code, error.message);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
close() { if (!this.closed) {
|
|
59
|
+
this.closed = true;
|
|
60
|
+
this.database.close();
|
|
61
|
+
} }
|
|
62
|
+
observe(input) {
|
|
63
|
+
validTime(input.occurredAt, 'occurredAt');
|
|
64
|
+
return this.transaction(() => {
|
|
65
|
+
let state = this.state(input.triggerId);
|
|
66
|
+
if (state === undefined) {
|
|
67
|
+
this.database.prepare(`
|
|
68
|
+
INSERT INTO trigger_state(
|
|
69
|
+
trigger_id, first_observed_at, last_observed_at, last_fingerprint, last_truthy,
|
|
70
|
+
edge_revision, pending_fingerprint, pending_since, pending_revision, last_fire_at, fire_count
|
|
71
|
+
) VALUES (?, ?, ?, ?, ?, 0, NULL, NULL, NULL, NULL, 0)
|
|
72
|
+
`).run(input.triggerId, input.occurredAt, input.occurredAt, input.fingerprint, input.truthy ? 1 : 0);
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
if ((input.ttlMs !== undefined && input.occurredAt >= state.first_observed_at + input.ttlMs)
|
|
76
|
+
|| state.fire_count >= input.maxFires)
|
|
77
|
+
return [];
|
|
78
|
+
if (state.last_fingerprint !== input.fingerprint) {
|
|
79
|
+
const revision = state.edge_revision + 1;
|
|
80
|
+
const qualifies = input.fireWhen === 'changed' || (input.truthy && state.last_truthy === 0);
|
|
81
|
+
this.database.prepare(`
|
|
82
|
+
UPDATE trigger_state
|
|
83
|
+
SET last_observed_at = ?, last_fingerprint = ?, last_truthy = ?, edge_revision = ?,
|
|
84
|
+
pending_fingerprint = ?, pending_since = ?, pending_revision = ?
|
|
85
|
+
WHERE trigger_id = ?
|
|
86
|
+
`).run(input.occurredAt, input.fingerprint, input.truthy ? 1 : 0, revision, qualifies ? input.fingerprint : null, qualifies ? input.occurredAt : null, qualifies ? revision : null, input.triggerId);
|
|
87
|
+
state = this.state(input.triggerId);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.database.prepare('UPDATE trigger_state SET last_observed_at = ? WHERE trigger_id = ?')
|
|
91
|
+
.run(input.occurredAt, input.triggerId);
|
|
92
|
+
}
|
|
93
|
+
if (state.pending_revision === null || state.pending_since === null)
|
|
94
|
+
return [];
|
|
95
|
+
if (input.occurredAt < state.pending_since + input.debounceMs)
|
|
96
|
+
return [];
|
|
97
|
+
if (state.last_fire_at !== null && input.occurredAt < state.last_fire_at + input.cooldownMs)
|
|
98
|
+
return [];
|
|
99
|
+
const created = this.insertOutbox(input.triggerId, `edge:${state.pending_revision}`, input.occurredAt);
|
|
100
|
+
this.database.prepare(`
|
|
101
|
+
UPDATE trigger_state SET pending_fingerprint = NULL, pending_since = NULL, pending_revision = NULL,
|
|
102
|
+
last_fire_at = ?, fire_count = fire_count + 1 WHERE trigger_id = ?
|
|
103
|
+
`).run(input.occurredAt, input.triggerId);
|
|
104
|
+
return created === undefined ? [] : [created];
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
acceptWebhook(input) {
|
|
108
|
+
validTime(input.occurredAt, 'occurredAt');
|
|
109
|
+
const acceptedAt = input.acceptedAt ?? input.occurredAt;
|
|
110
|
+
validTime(acceptedAt, 'acceptedAt');
|
|
111
|
+
return this.transaction(() => {
|
|
112
|
+
const prior = this.byEventId(stableEventId(input.triggerId, `webhook:${input.eventId}`));
|
|
113
|
+
if (prior !== undefined)
|
|
114
|
+
return { accepted: false, event: prior, reason: 'replay' };
|
|
115
|
+
let state = this.state(input.triggerId);
|
|
116
|
+
if (state === undefined) {
|
|
117
|
+
this.database.prepare(`
|
|
118
|
+
INSERT INTO trigger_state(
|
|
119
|
+
trigger_id, first_observed_at, last_observed_at, last_fingerprint, last_truthy,
|
|
120
|
+
edge_revision, pending_fingerprint, pending_since, pending_revision, last_fire_at, fire_count
|
|
121
|
+
) VALUES (?, ?, ?, '', 1, 0, NULL, NULL, NULL, NULL, 0)
|
|
122
|
+
`).run(input.triggerId, acceptedAt, acceptedAt);
|
|
123
|
+
state = this.state(input.triggerId);
|
|
124
|
+
}
|
|
125
|
+
if (input.ttlMs !== undefined && acceptedAt >= state.first_observed_at + input.ttlMs) {
|
|
126
|
+
return { accepted: false, reason: 'ttl' };
|
|
127
|
+
}
|
|
128
|
+
if (state.fire_count >= input.maxFires)
|
|
129
|
+
return { accepted: false, reason: 'limit' };
|
|
130
|
+
if (state.last_fire_at !== null && acceptedAt < state.last_fire_at + (input.cooldownMs ?? 0)) {
|
|
131
|
+
return { accepted: false, reason: 'cooldown' };
|
|
132
|
+
}
|
|
133
|
+
const created = this.insertOutbox(input.triggerId, `webhook:${input.eventId}`, input.occurredAt);
|
|
134
|
+
if (created === undefined)
|
|
135
|
+
return { accepted: false, reason: 'replay' };
|
|
136
|
+
this.database.prepare(`
|
|
137
|
+
UPDATE trigger_state SET last_observed_at = ?, last_fire_at = ?, fire_count = fire_count + 1
|
|
138
|
+
WHERE trigger_id = ?
|
|
139
|
+
`).run(acceptedAt, acceptedAt, input.triggerId);
|
|
140
|
+
return { accepted: true, event: created };
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
hasWebhookEvent(triggerId, externalEventId) {
|
|
144
|
+
return this.byEventId(stableEventId(triggerId, `webhook:${externalEventId}`)) !== undefined;
|
|
145
|
+
}
|
|
146
|
+
pending(limit = 1_000) {
|
|
147
|
+
return this.database.prepare(`
|
|
148
|
+
SELECT * FROM event_outbox
|
|
149
|
+
WHERE status = 'pending' AND next_attempt_at <= ?
|
|
150
|
+
ORDER BY next_attempt_at, created_at, id LIMIT ?
|
|
151
|
+
`).all(this.now(), limit).map(event);
|
|
152
|
+
}
|
|
153
|
+
markAttempt(id) {
|
|
154
|
+
this.database.prepare(`
|
|
155
|
+
UPDATE event_outbox SET attempts = attempts + 1, last_attempt_at = ?
|
|
156
|
+
WHERE id = ? AND status = 'pending'
|
|
157
|
+
`).run(this.now(), id);
|
|
158
|
+
}
|
|
159
|
+
markRetry(id, error, nextAttemptAt) {
|
|
160
|
+
validTime(nextAttemptAt, 'nextAttemptAt');
|
|
161
|
+
this.database.prepare(`
|
|
162
|
+
UPDATE event_outbox SET next_attempt_at = ?, last_error = ?
|
|
163
|
+
WHERE id = ? AND status = 'pending'
|
|
164
|
+
`).run(nextAttemptAt, errorText(error), id);
|
|
165
|
+
}
|
|
166
|
+
quarantine(id, reason) {
|
|
167
|
+
this.database.prepare(`
|
|
168
|
+
UPDATE event_outbox
|
|
169
|
+
SET status = 'quarantined', last_attempt_at = ?, last_error = ?
|
|
170
|
+
WHERE id = ? AND status = 'pending'
|
|
171
|
+
`).run(this.now(), errorText(reason), id);
|
|
172
|
+
}
|
|
173
|
+
markDelivered(id) {
|
|
174
|
+
const now = this.now();
|
|
175
|
+
this.database.prepare(`
|
|
176
|
+
UPDATE event_outbox
|
|
177
|
+
SET status = 'delivered', delivered_at = ?, last_error = NULL
|
|
178
|
+
WHERE id = ? AND status = 'pending'
|
|
179
|
+
`).run(now, id);
|
|
180
|
+
const row = this.database.prepare('SELECT * FROM event_outbox WHERE id = ?').get(id);
|
|
181
|
+
if (row === undefined)
|
|
182
|
+
throw new EventTriggerStoreError('invalid-input', 'event outbox row was not found');
|
|
183
|
+
return event(row);
|
|
184
|
+
}
|
|
185
|
+
markTriggerFailure(triggerId, error, failedAt = this.now()) {
|
|
186
|
+
validTime(failedAt, 'failedAt');
|
|
187
|
+
this.database.prepare(`
|
|
188
|
+
INSERT INTO trigger_health(trigger_id, consecutive_failures, last_error, last_failed_at, last_success_at)
|
|
189
|
+
VALUES (?, 1, ?, ?, NULL)
|
|
190
|
+
ON CONFLICT(trigger_id) DO UPDATE SET
|
|
191
|
+
consecutive_failures = consecutive_failures + 1,
|
|
192
|
+
last_error = excluded.last_error,
|
|
193
|
+
last_failed_at = excluded.last_failed_at
|
|
194
|
+
`).run(triggerId, errorText(error), failedAt);
|
|
195
|
+
}
|
|
196
|
+
markTriggerSuccess(triggerId, succeededAt = this.now()) {
|
|
197
|
+
validTime(succeededAt, 'succeededAt');
|
|
198
|
+
this.database.prepare(`
|
|
199
|
+
INSERT INTO trigger_health(trigger_id, consecutive_failures, last_error, last_failed_at, last_success_at)
|
|
200
|
+
VALUES (?, 0, NULL, NULL, ?)
|
|
201
|
+
ON CONFLICT(trigger_id) DO UPDATE SET
|
|
202
|
+
consecutive_failures = 0, last_error = NULL, last_success_at = excluded.last_success_at
|
|
203
|
+
`).run(triggerId, succeededAt);
|
|
204
|
+
}
|
|
205
|
+
health() {
|
|
206
|
+
const count = (sql) => this.database.prepare(sql).get().count;
|
|
207
|
+
const outboxError = this.database.prepare(`
|
|
208
|
+
SELECT last_error FROM event_outbox WHERE last_error IS NOT NULL
|
|
209
|
+
ORDER BY COALESCE(last_attempt_at, created_at) DESC, id DESC LIMIT 1
|
|
210
|
+
`).get();
|
|
211
|
+
const triggerError = this.database.prepare(`
|
|
212
|
+
SELECT last_error FROM trigger_health WHERE consecutive_failures > 0 AND last_error IS NOT NULL
|
|
213
|
+
ORDER BY last_failed_at DESC, trigger_id DESC LIMIT 1
|
|
214
|
+
`).get();
|
|
215
|
+
return Object.freeze({
|
|
216
|
+
pendingEvents: count("SELECT COUNT(*) AS count FROM event_outbox WHERE status = 'pending'"),
|
|
217
|
+
retryingEvents: count("SELECT COUNT(*) AS count FROM event_outbox WHERE status = 'pending' AND attempts > 0"),
|
|
218
|
+
quarantinedEvents: count("SELECT COUNT(*) AS count FROM event_outbox WHERE status = 'quarantined'"),
|
|
219
|
+
deliveredEvents: count("SELECT COUNT(*) AS count FROM event_outbox WHERE status = 'delivered'"),
|
|
220
|
+
triggersObserved: count('SELECT COUNT(*) AS count FROM trigger_state'),
|
|
221
|
+
failingTriggers: count('SELECT COUNT(*) AS count FROM trigger_health WHERE consecutive_failures > 0'),
|
|
222
|
+
...(outboxError === undefined ? {} : { lastOutboxError: outboxError.last_error }),
|
|
223
|
+
...(triggerError === undefined ? {} : { lastTriggerError: triggerError.last_error }),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
state(id) {
|
|
227
|
+
return this.database.prepare('SELECT * FROM trigger_state WHERE trigger_id = ?').get(id);
|
|
228
|
+
}
|
|
229
|
+
byEventId(eventId) {
|
|
230
|
+
const row = this.database.prepare('SELECT * FROM event_outbox WHERE event_id = ?').get(eventId);
|
|
231
|
+
return row === undefined ? undefined : event(row);
|
|
232
|
+
}
|
|
233
|
+
insertOutbox(triggerId, key, occurredAt) {
|
|
234
|
+
const eventId = stableEventId(triggerId, key);
|
|
235
|
+
const id = `outbox-${eventId.slice('event-'.length)}`;
|
|
236
|
+
const result = this.database.prepare(`
|
|
237
|
+
INSERT OR IGNORE INTO event_outbox(
|
|
238
|
+
id, trigger_id, event_id, occurred_at, status, attempts, delivered_at, created_at,
|
|
239
|
+
next_attempt_at, last_attempt_at, last_error
|
|
240
|
+
) VALUES (?, ?, ?, ?, 'pending', 0, NULL, ?, ?, NULL, NULL)
|
|
241
|
+
`).run(id, triggerId, eventId, occurredAt, this.now(), this.now());
|
|
242
|
+
if (result.changes === 0)
|
|
243
|
+
return undefined;
|
|
244
|
+
return this.byEventId(eventId);
|
|
245
|
+
}
|
|
246
|
+
transaction(operation) {
|
|
247
|
+
this.database.exec('BEGIN IMMEDIATE');
|
|
248
|
+
try {
|
|
249
|
+
const result = operation();
|
|
250
|
+
this.database.exec('COMMIT');
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
this.database.exec('ROLLBACK');
|
|
255
|
+
throw error;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=store.js.map
|
package/lib/store.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/lib/version.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAA"}
|
package/lib/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dsh-enhanced/event-triggers",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Durable bounded file, HTTP/JSON, and HMAC webhook triggers for DSH automations.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./lib/index.js",
|
|
8
|
+
"types": "./lib/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./lib/index.d.ts",
|
|
12
|
+
"default": "./lib/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"lib",
|
|
19
|
+
"cordis.patch.yml",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/22-ai-00/dsh-enhanced.git",
|
|
32
|
+
"directory": "plugins/event-triggers"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"deepseek",
|
|
36
|
+
"deepseek-harness",
|
|
37
|
+
"dsh-plugin"
|
|
38
|
+
],
|
|
39
|
+
"dsh": {
|
|
40
|
+
"bundle": {
|
|
41
|
+
"patch": "./cordis.patch.yml"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@deepseek-ai/schemastery": "3.18.1"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
49
|
+
"@dsh-enhanced/assistant-automations": ">=0.1.0 <0.2.0",
|
|
50
|
+
"@dsh-enhanced/assistant-policy": ">=0.1.0 <0.2.0",
|
|
51
|
+
"@dsh-enhanced/credentials-keychain": ">=0.1.0 <0.2.0"
|
|
52
|
+
},
|
|
53
|
+
"peerDependenciesMeta": {
|
|
54
|
+
"@deepseek-ai/cordis": {
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
"@dsh-enhanced/assistant-automations": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"@dsh-enhanced/assistant-policy": {
|
|
61
|
+
"optional": true
|
|
62
|
+
},
|
|
63
|
+
"@dsh-enhanced/credentials-keychain": {
|
|
64
|
+
"optional": true
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@deepseek-ai/cordis": "4.0.1",
|
|
69
|
+
"@types/node": "22.20.0",
|
|
70
|
+
"typescript": "6.0.3",
|
|
71
|
+
"vitest": "4.1.8",
|
|
72
|
+
"@dsh-enhanced/assistant-automations": "0.1.3",
|
|
73
|
+
"@dsh-enhanced/assistant-policy": "0.1.3",
|
|
74
|
+
"@dsh-enhanced/credentials-keychain": "0.1.3"
|
|
75
|
+
},
|
|
76
|
+
"scripts": {
|
|
77
|
+
"build": "tsc -p tsconfig.build.json",
|
|
78
|
+
"test": "vitest run",
|
|
79
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
80
|
+
}
|
|
81
|
+
}
|