@dsh-enhanced/assistant-delivery 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 +225 -0
- package/cordis.patch.yml +29 -0
- package/lib/agent-runtime.d.ts +112 -0
- package/lib/agent-runtime.d.ts.map +1 -0
- package/lib/agent-runtime.js +1866 -0
- package/lib/agent-runtime.js.map +1 -0
- package/lib/canonical.d.ts +18 -0
- package/lib/canonical.d.ts.map +1 -0
- package/lib/canonical.js +83 -0
- package/lib/canonical.js.map +1 -0
- package/lib/coordinator.d.ts +124 -0
- package/lib/coordinator.d.ts.map +1 -0
- package/lib/coordinator.js +676 -0
- package/lib/coordinator.js.map +1 -0
- package/lib/inbound-images.d.ts +38 -0
- package/lib/inbound-images.d.ts.map +1 -0
- package/lib/inbound-images.js +267 -0
- package/lib/inbound-images.js.map +1 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +12 -0
- package/lib/index.js.map +1 -0
- package/lib/operator.d.ts +23 -0
- package/lib/operator.d.ts.map +1 -0
- package/lib/operator.js +38 -0
- package/lib/operator.js.map +1 -0
- package/lib/service.d.ts +269 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +1698 -0
- package/lib/service.js.map +1 -0
- package/lib/session-commands.d.ts +17 -0
- package/lib/session-commands.d.ts.map +1 -0
- package/lib/session-commands.js +39 -0
- package/lib/session-commands.js.map +1 -0
- package/lib/sqlite.d.ts +8 -0
- package/lib/sqlite.d.ts.map +1 -0
- package/lib/sqlite.js +411 -0
- package/lib/sqlite.js.map +1 -0
- package/lib/store.d.ts +353 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +2614 -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 +54 -0
- package/lib/tools.js.map +1 -0
- package/lib/types.d.ts +329 -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 +122 -0
package/lib/sqlite.js
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { chmodSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, isAbsolute } from 'node:path';
|
|
3
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
4
|
+
export const deliverySchemaVersion = 8;
|
|
5
|
+
const deliveryInstanceSchema = `
|
|
6
|
+
CREATE TABLE delivery_instance (
|
|
7
|
+
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
8
|
+
instance_id TEXT NOT NULL UNIQUE CHECK (
|
|
9
|
+
length(instance_id) = 32 AND instance_id NOT GLOB '*[^0-9a-f]*'
|
|
10
|
+
)
|
|
11
|
+
) STRICT;
|
|
12
|
+
INSERT INTO delivery_instance (singleton, instance_id)
|
|
13
|
+
VALUES (1, lower(hex(randomblob(16))));
|
|
14
|
+
`;
|
|
15
|
+
const approvalDispatchCursorSchema = `
|
|
16
|
+
CREATE TABLE approval_dispatch_cursor (
|
|
17
|
+
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
18
|
+
after_created_at INTEGER CHECK (after_created_at IS NULL OR after_created_at >= 0),
|
|
19
|
+
after_proposal_id TEXT,
|
|
20
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
21
|
+
updated_at INTEGER NOT NULL,
|
|
22
|
+
CHECK ((after_created_at IS NULL) = (after_proposal_id IS NULL))
|
|
23
|
+
) STRICT;
|
|
24
|
+
`;
|
|
25
|
+
const modelPickerStateSchema = `
|
|
26
|
+
CREATE TABLE conversation_model_epochs (
|
|
27
|
+
conversation_hash TEXT PRIMARY KEY,
|
|
28
|
+
conversation_json TEXT NOT NULL,
|
|
29
|
+
epoch INTEGER NOT NULL CHECK (epoch >= 1),
|
|
30
|
+
updated_at INTEGER NOT NULL
|
|
31
|
+
) STRICT;
|
|
32
|
+
|
|
33
|
+
CREATE TABLE model_picker_states (
|
|
34
|
+
operation_id TEXT PRIMARY KEY,
|
|
35
|
+
binding_id TEXT NOT NULL,
|
|
36
|
+
revision INTEGER NOT NULL CHECK (revision >= 1),
|
|
37
|
+
provider TEXT NOT NULL,
|
|
38
|
+
model TEXT NOT NULL,
|
|
39
|
+
reasoning_effort TEXT,
|
|
40
|
+
created_at INTEGER NOT NULL,
|
|
41
|
+
updated_at INTEGER NOT NULL,
|
|
42
|
+
FOREIGN KEY (binding_id) REFERENCES conversation_bindings(id)
|
|
43
|
+
) STRICT;
|
|
44
|
+
|
|
45
|
+
CREATE TABLE model_selection_settlements (
|
|
46
|
+
operation_id TEXT PRIMARY KEY,
|
|
47
|
+
binding_id TEXT NOT NULL,
|
|
48
|
+
conversation_hash TEXT NOT NULL,
|
|
49
|
+
command_epoch INTEGER NOT NULL CHECK (command_epoch >= 1),
|
|
50
|
+
payload_hash TEXT NOT NULL,
|
|
51
|
+
payload_json TEXT NOT NULL,
|
|
52
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'processing', 'completed')),
|
|
53
|
+
result_json TEXT,
|
|
54
|
+
outbox_id TEXT,
|
|
55
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
56
|
+
claimed_by TEXT,
|
|
57
|
+
lease_until INTEGER,
|
|
58
|
+
created_at INTEGER NOT NULL,
|
|
59
|
+
updated_at INTEGER NOT NULL,
|
|
60
|
+
FOREIGN KEY (binding_id) REFERENCES conversation_bindings(id),
|
|
61
|
+
FOREIGN KEY (conversation_hash) REFERENCES conversation_model_epochs(conversation_hash),
|
|
62
|
+
FOREIGN KEY (outbox_id) REFERENCES outbox_messages(id)
|
|
63
|
+
) STRICT;
|
|
64
|
+
CREATE INDEX model_selection_claim
|
|
65
|
+
ON model_selection_settlements(status, lease_until, created_at, operation_id);
|
|
66
|
+
`;
|
|
67
|
+
export class DeliveryDatabaseError extends Error {
|
|
68
|
+
code;
|
|
69
|
+
constructor(code, message) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.code = code;
|
|
72
|
+
this.name = 'DeliveryDatabaseError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function migrate(database) {
|
|
76
|
+
const row = database.prepare('PRAGMA user_version').get();
|
|
77
|
+
let version = row.user_version;
|
|
78
|
+
if (version > deliverySchemaVersion) {
|
|
79
|
+
throw new DeliveryDatabaseError('schema-too-new', `delivery schema ${version} is newer than supported schema ${deliverySchemaVersion}`);
|
|
80
|
+
}
|
|
81
|
+
if (version === deliverySchemaVersion)
|
|
82
|
+
return;
|
|
83
|
+
if (version === 1) {
|
|
84
|
+
database.exec(`
|
|
85
|
+
BEGIN IMMEDIATE;
|
|
86
|
+
ALTER TABLE delivery_attachments ADD COLUMN resource_kind TEXT;
|
|
87
|
+
ALTER TABLE delivery_attachments ADD COLUMN provider_ref TEXT;
|
|
88
|
+
ALTER TABLE delivery_attachments ADD COLUMN file_name TEXT;
|
|
89
|
+
PRAGMA user_version = 2;
|
|
90
|
+
COMMIT;
|
|
91
|
+
`);
|
|
92
|
+
version = 2;
|
|
93
|
+
}
|
|
94
|
+
if (version === 2) {
|
|
95
|
+
database.exec(`
|
|
96
|
+
BEGIN IMMEDIATE;
|
|
97
|
+
CREATE TABLE conversation_model_selections (
|
|
98
|
+
conversation_hash TEXT PRIMARY KEY,
|
|
99
|
+
conversation_json TEXT NOT NULL,
|
|
100
|
+
provider TEXT NOT NULL,
|
|
101
|
+
model TEXT NOT NULL,
|
|
102
|
+
reasoning_effort TEXT,
|
|
103
|
+
updated_at INTEGER NOT NULL,
|
|
104
|
+
version INTEGER NOT NULL CHECK (version >= 1)
|
|
105
|
+
) STRICT;
|
|
106
|
+
PRAGMA user_version = 4;
|
|
107
|
+
COMMIT;
|
|
108
|
+
`);
|
|
109
|
+
version = 4;
|
|
110
|
+
}
|
|
111
|
+
if (version === 3) {
|
|
112
|
+
database.exec(`
|
|
113
|
+
BEGIN IMMEDIATE;
|
|
114
|
+
ALTER TABLE conversation_model_selections ADD COLUMN reasoning_effort TEXT;
|
|
115
|
+
PRAGMA user_version = 4;
|
|
116
|
+
COMMIT;
|
|
117
|
+
`);
|
|
118
|
+
version = 4;
|
|
119
|
+
}
|
|
120
|
+
if (version === 4) {
|
|
121
|
+
database.exec(`
|
|
122
|
+
BEGIN IMMEDIATE;
|
|
123
|
+
${modelPickerStateSchema}
|
|
124
|
+
PRAGMA user_version = 5;
|
|
125
|
+
COMMIT;
|
|
126
|
+
`);
|
|
127
|
+
version = 5;
|
|
128
|
+
}
|
|
129
|
+
if (version === 5) {
|
|
130
|
+
database.exec(`
|
|
131
|
+
BEGIN IMMEDIATE;
|
|
132
|
+
${approvalDispatchCursorSchema}
|
|
133
|
+
PRAGMA user_version = 6;
|
|
134
|
+
COMMIT;
|
|
135
|
+
`);
|
|
136
|
+
version = 6;
|
|
137
|
+
}
|
|
138
|
+
if (version === 6) {
|
|
139
|
+
database.exec(`
|
|
140
|
+
BEGIN IMMEDIATE;
|
|
141
|
+
CREATE TABLE delivery_attachments_v7 (
|
|
142
|
+
id TEXT PRIMARY KEY,
|
|
143
|
+
owner_kind TEXT NOT NULL CHECK (owner_kind IN ('inbox', 'outbox')),
|
|
144
|
+
owner_id TEXT NOT NULL,
|
|
145
|
+
ordinal INTEGER NOT NULL CHECK (ordinal >= 0),
|
|
146
|
+
media_type TEXT NOT NULL,
|
|
147
|
+
size_bytes INTEGER NOT NULL CHECK (size_bytes >= 0),
|
|
148
|
+
sha256 TEXT NOT NULL,
|
|
149
|
+
spool_ref TEXT,
|
|
150
|
+
resource_kind TEXT,
|
|
151
|
+
provider_ref TEXT,
|
|
152
|
+
file_name TEXT,
|
|
153
|
+
status TEXT NOT NULL CHECK (status IN ('metadata', 'quarantined', 'ready', 'expired')),
|
|
154
|
+
expires_at INTEGER,
|
|
155
|
+
created_at INTEGER NOT NULL
|
|
156
|
+
) STRICT;
|
|
157
|
+
INSERT INTO delivery_attachments_v7 (
|
|
158
|
+
id, owner_kind, owner_id, ordinal, media_type, size_bytes, sha256, spool_ref,
|
|
159
|
+
resource_kind, provider_ref, file_name, status, expires_at, created_at
|
|
160
|
+
)
|
|
161
|
+
SELECT attachment.id, attachment.owner_kind, attachment.owner_id,
|
|
162
|
+
ROW_NUMBER() OVER (
|
|
163
|
+
PARTITION BY attachment.owner_kind, attachment.owner_id
|
|
164
|
+
ORDER BY attachment.rowid
|
|
165
|
+
) - 1,
|
|
166
|
+
attachment.media_type, attachment.size_bytes, attachment.sha256, attachment.spool_ref,
|
|
167
|
+
attachment.resource_kind, attachment.provider_ref, attachment.file_name, attachment.status,
|
|
168
|
+
attachment.expires_at, attachment.created_at
|
|
169
|
+
FROM delivery_attachments AS attachment;
|
|
170
|
+
DROP TABLE delivery_attachments;
|
|
171
|
+
ALTER TABLE delivery_attachments_v7 RENAME TO delivery_attachments;
|
|
172
|
+
CREATE UNIQUE INDEX delivery_attachment_owner_ordinal
|
|
173
|
+
ON delivery_attachments(owner_kind, owner_id, ordinal);
|
|
174
|
+
PRAGMA user_version = 7;
|
|
175
|
+
COMMIT;
|
|
176
|
+
`);
|
|
177
|
+
version = 7;
|
|
178
|
+
}
|
|
179
|
+
if (version === 7) {
|
|
180
|
+
database.exec(`
|
|
181
|
+
BEGIN IMMEDIATE;
|
|
182
|
+
${deliveryInstanceSchema}
|
|
183
|
+
PRAGMA user_version = 8;
|
|
184
|
+
COMMIT;
|
|
185
|
+
`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
database.exec(`
|
|
189
|
+
BEGIN IMMEDIATE;
|
|
190
|
+
${deliveryInstanceSchema}
|
|
191
|
+
CREATE TABLE delivery_principals (
|
|
192
|
+
id TEXT PRIMARY KEY,
|
|
193
|
+
key_hash TEXT NOT NULL UNIQUE,
|
|
194
|
+
principal_json TEXT NOT NULL,
|
|
195
|
+
role TEXT NOT NULL CHECK (role IN ('owner', 'linked')),
|
|
196
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'revoked')),
|
|
197
|
+
linked_to_id TEXT,
|
|
198
|
+
created_at INTEGER NOT NULL,
|
|
199
|
+
updated_at INTEGER NOT NULL,
|
|
200
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
201
|
+
FOREIGN KEY (linked_to_id) REFERENCES delivery_principals(id)
|
|
202
|
+
) STRICT;
|
|
203
|
+
|
|
204
|
+
CREATE TABLE pairing_challenges (
|
|
205
|
+
id TEXT PRIMARY KEY,
|
|
206
|
+
principal_hash TEXT NOT NULL,
|
|
207
|
+
principal_json TEXT NOT NULL,
|
|
208
|
+
code_salt TEXT NOT NULL,
|
|
209
|
+
code_hash TEXT NOT NULL,
|
|
210
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'consumed', 'expired', 'locked')),
|
|
211
|
+
attempts INTEGER NOT NULL DEFAULT 0 CHECK (attempts >= 0),
|
|
212
|
+
max_attempts INTEGER NOT NULL CHECK (max_attempts >= 1),
|
|
213
|
+
expires_at INTEGER NOT NULL,
|
|
214
|
+
created_at INTEGER NOT NULL,
|
|
215
|
+
updated_at INTEGER NOT NULL
|
|
216
|
+
) STRICT;
|
|
217
|
+
CREATE INDEX pairing_active ON pairing_challenges(principal_hash, status, expires_at);
|
|
218
|
+
|
|
219
|
+
CREATE TABLE conversation_bindings (
|
|
220
|
+
id TEXT PRIMARY KEY,
|
|
221
|
+
conversation_hash TEXT NOT NULL,
|
|
222
|
+
conversation_json TEXT NOT NULL,
|
|
223
|
+
principal_id TEXT NOT NULL,
|
|
224
|
+
principal_json TEXT NOT NULL,
|
|
225
|
+
workspace TEXT NOT NULL,
|
|
226
|
+
agent_preset TEXT NOT NULL,
|
|
227
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
228
|
+
generation INTEGER NOT NULL CHECK (generation >= 1),
|
|
229
|
+
policy_ref TEXT NOT NULL,
|
|
230
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'revoked')),
|
|
231
|
+
created_at INTEGER NOT NULL,
|
|
232
|
+
updated_at INTEGER NOT NULL,
|
|
233
|
+
version INTEGER NOT NULL CHECK (version >= 1),
|
|
234
|
+
UNIQUE (conversation_hash, generation),
|
|
235
|
+
FOREIGN KEY (principal_id) REFERENCES delivery_principals(id)
|
|
236
|
+
) STRICT;
|
|
237
|
+
CREATE UNIQUE INDEX binding_one_active ON conversation_bindings(conversation_hash) WHERE status = 'active';
|
|
238
|
+
|
|
239
|
+
CREATE TABLE conversation_model_selections (
|
|
240
|
+
conversation_hash TEXT PRIMARY KEY,
|
|
241
|
+
conversation_json TEXT NOT NULL,
|
|
242
|
+
provider TEXT NOT NULL,
|
|
243
|
+
model TEXT NOT NULL,
|
|
244
|
+
reasoning_effort TEXT,
|
|
245
|
+
updated_at INTEGER NOT NULL,
|
|
246
|
+
version INTEGER NOT NULL CHECK (version >= 1)
|
|
247
|
+
) STRICT;
|
|
248
|
+
|
|
249
|
+
CREATE TABLE inbox_messages (
|
|
250
|
+
id TEXT PRIMARY KEY,
|
|
251
|
+
channel TEXT NOT NULL,
|
|
252
|
+
account TEXT NOT NULL,
|
|
253
|
+
event_id TEXT NOT NULL,
|
|
254
|
+
envelope_hash TEXT NOT NULL,
|
|
255
|
+
envelope_json TEXT NOT NULL,
|
|
256
|
+
status TEXT NOT NULL CHECK (status IN ('received', 'authorized', 'queued', 'claimed', 'processed', 'retry_wait', 'dead_letter')),
|
|
257
|
+
binding_id TEXT,
|
|
258
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
259
|
+
next_attempt_at INTEGER,
|
|
260
|
+
claimed_by TEXT,
|
|
261
|
+
fencing_token INTEGER,
|
|
262
|
+
lease_until INTEGER,
|
|
263
|
+
failure_code TEXT,
|
|
264
|
+
received_at INTEGER NOT NULL,
|
|
265
|
+
updated_at INTEGER NOT NULL,
|
|
266
|
+
UNIQUE (channel, account, event_id),
|
|
267
|
+
FOREIGN KEY (binding_id) REFERENCES conversation_bindings(id)
|
|
268
|
+
) STRICT;
|
|
269
|
+
CREATE INDEX inbox_claim ON inbox_messages(status, next_attempt_at, received_at, id);
|
|
270
|
+
|
|
271
|
+
CREATE TABLE inbox_attempts (
|
|
272
|
+
id TEXT PRIMARY KEY,
|
|
273
|
+
inbox_id TEXT NOT NULL,
|
|
274
|
+
attempt_number INTEGER NOT NULL,
|
|
275
|
+
owner_id TEXT NOT NULL,
|
|
276
|
+
fencing_token INTEGER NOT NULL,
|
|
277
|
+
status TEXT NOT NULL CHECK (status IN ('claimed', 'processed', 'retry_wait', 'dead_letter', 'lost')),
|
|
278
|
+
failure_code TEXT,
|
|
279
|
+
created_at INTEGER NOT NULL,
|
|
280
|
+
finished_at INTEGER,
|
|
281
|
+
UNIQUE (inbox_id, attempt_number),
|
|
282
|
+
FOREIGN KEY (inbox_id) REFERENCES inbox_messages(id)
|
|
283
|
+
) STRICT;
|
|
284
|
+
|
|
285
|
+
CREATE TABLE outbox_messages (
|
|
286
|
+
id TEXT PRIMARY KEY,
|
|
287
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
288
|
+
binding_id TEXT NOT NULL,
|
|
289
|
+
intent_hash TEXT NOT NULL,
|
|
290
|
+
intent_json TEXT NOT NULL,
|
|
291
|
+
channel TEXT NOT NULL,
|
|
292
|
+
account TEXT NOT NULL,
|
|
293
|
+
lane_hash TEXT NOT NULL,
|
|
294
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'attempting', 'accepted', 'delivered', 'read', 'retry_wait', 'dead', 'unknown_after_send')),
|
|
295
|
+
provider_message_id TEXT,
|
|
296
|
+
attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
|
|
297
|
+
next_attempt_at INTEGER,
|
|
298
|
+
claimed_by TEXT,
|
|
299
|
+
fencing_token INTEGER,
|
|
300
|
+
lease_until INTEGER,
|
|
301
|
+
failure_code TEXT,
|
|
302
|
+
created_at INTEGER NOT NULL,
|
|
303
|
+
updated_at INTEGER NOT NULL,
|
|
304
|
+
FOREIGN KEY (binding_id) REFERENCES conversation_bindings(id)
|
|
305
|
+
) STRICT;
|
|
306
|
+
CREATE INDEX outbox_claim ON outbox_messages(status, next_attempt_at, created_at, id);
|
|
307
|
+
CREATE INDEX outbox_lane ON outbox_messages(lane_hash, created_at, id);
|
|
308
|
+
CREATE UNIQUE INDEX outbox_provider_message ON outbox_messages(channel, account, provider_message_id)
|
|
309
|
+
WHERE provider_message_id IS NOT NULL;
|
|
310
|
+
|
|
311
|
+
CREATE TABLE outbox_attempts (
|
|
312
|
+
id TEXT PRIMARY KEY,
|
|
313
|
+
outbox_id TEXT NOT NULL,
|
|
314
|
+
attempt_number INTEGER NOT NULL,
|
|
315
|
+
owner_id TEXT NOT NULL,
|
|
316
|
+
fencing_token INTEGER NOT NULL,
|
|
317
|
+
operation TEXT NOT NULL CHECK (operation IN ('send', 'reconcile')),
|
|
318
|
+
status TEXT NOT NULL CHECK (status IN ('attempting', 'accepted', 'retry_wait', 'dead', 'unknown_after_send', 'reconciled')),
|
|
319
|
+
provider_message_id TEXT,
|
|
320
|
+
failure_code TEXT,
|
|
321
|
+
created_at INTEGER NOT NULL,
|
|
322
|
+
finished_at INTEGER,
|
|
323
|
+
UNIQUE (outbox_id, attempt_number),
|
|
324
|
+
FOREIGN KEY (outbox_id) REFERENCES outbox_messages(id)
|
|
325
|
+
) STRICT;
|
|
326
|
+
|
|
327
|
+
CREATE TABLE delivery_receipts (
|
|
328
|
+
id TEXT PRIMARY KEY,
|
|
329
|
+
channel TEXT NOT NULL,
|
|
330
|
+
account TEXT NOT NULL,
|
|
331
|
+
provider_message_id TEXT NOT NULL,
|
|
332
|
+
status TEXT NOT NULL CHECK (status IN ('accepted', 'delivered', 'read')),
|
|
333
|
+
receipt_hash TEXT NOT NULL UNIQUE,
|
|
334
|
+
receipt_json TEXT NOT NULL,
|
|
335
|
+
occurred_at INTEGER NOT NULL,
|
|
336
|
+
created_at INTEGER NOT NULL,
|
|
337
|
+
UNIQUE (channel, account, provider_message_id, status)
|
|
338
|
+
) STRICT;
|
|
339
|
+
|
|
340
|
+
CREATE TABLE delivery_attachments (
|
|
341
|
+
id TEXT PRIMARY KEY,
|
|
342
|
+
owner_kind TEXT NOT NULL CHECK (owner_kind IN ('inbox', 'outbox')),
|
|
343
|
+
owner_id TEXT NOT NULL,
|
|
344
|
+
ordinal INTEGER NOT NULL CHECK (ordinal >= 0),
|
|
345
|
+
media_type TEXT NOT NULL,
|
|
346
|
+
size_bytes INTEGER NOT NULL CHECK (size_bytes >= 0),
|
|
347
|
+
sha256 TEXT NOT NULL,
|
|
348
|
+
spool_ref TEXT,
|
|
349
|
+
resource_kind TEXT,
|
|
350
|
+
provider_ref TEXT,
|
|
351
|
+
file_name TEXT,
|
|
352
|
+
status TEXT NOT NULL CHECK (status IN ('metadata', 'quarantined', 'ready', 'expired')),
|
|
353
|
+
expires_at INTEGER,
|
|
354
|
+
created_at INTEGER NOT NULL
|
|
355
|
+
) STRICT;
|
|
356
|
+
CREATE UNIQUE INDEX delivery_attachment_owner_ordinal
|
|
357
|
+
ON delivery_attachments(owner_kind, owner_id, ordinal);
|
|
358
|
+
|
|
359
|
+
CREATE TABLE approval_settlements (
|
|
360
|
+
operation_id TEXT PRIMARY KEY,
|
|
361
|
+
payload_hash TEXT NOT NULL,
|
|
362
|
+
payload_json TEXT NOT NULL,
|
|
363
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'completed')),
|
|
364
|
+
result_json TEXT,
|
|
365
|
+
created_at INTEGER NOT NULL,
|
|
366
|
+
updated_at INTEGER NOT NULL
|
|
367
|
+
) STRICT;
|
|
368
|
+
|
|
369
|
+
${modelPickerStateSchema}
|
|
370
|
+
|
|
371
|
+
CREATE TABLE delivery_duty_lease (
|
|
372
|
+
singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
|
|
373
|
+
owner_id TEXT NOT NULL,
|
|
374
|
+
fencing_token INTEGER NOT NULL CHECK (fencing_token >= 1),
|
|
375
|
+
lease_until INTEGER NOT NULL,
|
|
376
|
+
updated_at INTEGER NOT NULL
|
|
377
|
+
) STRICT;
|
|
378
|
+
|
|
379
|
+
${approvalDispatchCursorSchema}
|
|
380
|
+
|
|
381
|
+
PRAGMA user_version = 8;
|
|
382
|
+
COMMIT;
|
|
383
|
+
`);
|
|
384
|
+
}
|
|
385
|
+
export function openDeliveryDatabase(path) {
|
|
386
|
+
if (path !== ':memory:' && !isAbsolute(path)) {
|
|
387
|
+
throw new DeliveryDatabaseError('invalid-path', 'delivery database path must be absolute');
|
|
388
|
+
}
|
|
389
|
+
if (path !== ':memory:') {
|
|
390
|
+
const directory = dirname(path);
|
|
391
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
392
|
+
chmodSync(directory, 0o700);
|
|
393
|
+
}
|
|
394
|
+
const database = new DatabaseSync(path);
|
|
395
|
+
try {
|
|
396
|
+
database.exec('PRAGMA foreign_keys = ON');
|
|
397
|
+
database.exec('PRAGMA busy_timeout = 5000');
|
|
398
|
+
database.exec('PRAGMA synchronous = FULL');
|
|
399
|
+
migrate(database);
|
|
400
|
+
if (path !== ':memory:') {
|
|
401
|
+
database.exec('PRAGMA journal_mode = WAL');
|
|
402
|
+
chmodSync(path, 0o600);
|
|
403
|
+
}
|
|
404
|
+
return database;
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
database.close();
|
|
408
|
+
throw error;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"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"}
|