@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/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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const version = "0.1.3";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -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,2 @@
1
+ export const version = '0.1.3';
2
+ //# sourceMappingURL=version.js.map
@@ -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
+ }