@dsh-enhanced/personal-memory 0.1.7 → 0.1.14

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/sqlite.js CHANGED
@@ -1,7 +1,7 @@
1
- import { chmodSync, mkdirSync } from 'node:fs';
1
+ import { chmodSync, closeSync, constants, lstatSync, mkdirSync, openSync } from 'node:fs';
2
2
  import { dirname, isAbsolute } from 'node:path';
3
3
  import { DatabaseSync } from 'node:sqlite';
4
- export const memorySchemaVersion = 2;
4
+ export const memorySchemaVersion = 4;
5
5
  export class MemoryDatabaseError extends Error {
6
6
  code;
7
7
  constructor(code, message) {
@@ -10,24 +10,37 @@ export class MemoryDatabaseError extends Error {
10
10
  this.name = 'MemoryDatabaseError';
11
11
  }
12
12
  }
13
- function migrate(database) {
14
- const row = database.prepare('PRAGMA user_version').get();
15
- if (row.user_version > memorySchemaVersion) {
16
- throw new MemoryDatabaseError('schema-too-new', `memory schema ${row.user_version} is newer than supported schema ${memorySchemaVersion}`);
17
- }
18
- if (row.user_version === memorySchemaVersion)
19
- return;
20
- if (row.user_version === 0) {
21
- database.exec(`
22
- BEGIN IMMEDIATE;
23
-
24
- CREATE TABLE schema_meta (
25
- key TEXT PRIMARY KEY,
26
- value TEXT NOT NULL
27
- ) STRICT;
28
-
13
+ const namespaceColumns = `
14
+ namespace_mode TEXT NOT NULL CHECK (namespace_mode IN ('delivery', 'headless', 'legacy-quarantine')),
15
+ namespace_key TEXT NOT NULL,
16
+ principal_digest TEXT,
17
+ principal_record_id TEXT,
18
+ principal_version INTEGER,
19
+ headless_lineage_id TEXT,
20
+ headless_lineage_version INTEGER`;
21
+ const namespaceConstraint = `CHECK (
22
+ (namespace_mode = 'legacy-quarantine' AND namespace_key = 'legacy-v2'
23
+ AND principal_digest IS NULL AND principal_record_id IS NULL AND principal_version IS NULL
24
+ AND headless_lineage_id IS NULL AND headless_lineage_version IS NULL)
25
+ OR
26
+ (namespace_mode = 'delivery' AND length(namespace_key) = 64
27
+ AND namespace_key NOT GLOB '*[^0-9a-f]*'
28
+ AND length(principal_digest) = 64 AND principal_digest NOT GLOB '*[^0-9a-f]*'
29
+ AND principal_record_id IS NOT NULL AND principal_record_id <> '' AND principal_version >= 1
30
+ AND headless_lineage_id IS NULL AND headless_lineage_version IS NULL)
31
+ OR
32
+ (namespace_mode = 'headless' AND length(namespace_key) = 64
33
+ AND namespace_key NOT GLOB '*[^0-9a-f]*'
34
+ AND length(principal_digest) = 64 AND principal_digest NOT GLOB '*[^0-9a-f]*'
35
+ AND principal_record_id IS NULL AND principal_version IS NULL
36
+ AND headless_lineage_id IS NOT NULL AND headless_lineage_id <> ''
37
+ AND headless_lineage_version >= 1)
38
+ )`;
39
+ function createV3Tables(database) {
40
+ database.exec(`
29
41
  CREATE TABLE memory_records (
30
42
  id TEXT PRIMARY KEY,
43
+ ${namespaceColumns},
31
44
  owner TEXT NOT NULL CHECK (owner IN ('user', 'agent')),
32
45
  scope TEXT NOT NULL CHECK (scope IN ('user-global', 'workspace')),
33
46
  workspace TEXT NOT NULL,
@@ -44,14 +57,10 @@ function migrate(database) {
44
57
  status TEXT NOT NULL CHECK (status IN ('active', 'removed')),
45
58
  created_at INTEGER NOT NULL,
46
59
  updated_at INTEGER NOT NULL,
47
- version INTEGER NOT NULL CHECK (version >= 1)
60
+ version INTEGER NOT NULL CHECK (version >= 1),
61
+ ${namespaceConstraint}
48
62
  ) STRICT;
49
63
 
50
- CREATE INDEX memory_records_scope
51
- ON memory_records(owner, scope, workspace, agent_preset, status, updated_at DESC);
52
- CREATE INDEX memory_records_hash
53
- ON memory_records(owner, scope, workspace, agent_preset, content_hash, status);
54
-
55
64
  CREATE TABLE memory_tokens (
56
65
  memory_id TEXT NOT NULL,
57
66
  token TEXT NOT NULL,
@@ -59,71 +68,225 @@ function migrate(database) {
59
68
  PRIMARY KEY (memory_id, token),
60
69
  FOREIGN KEY (memory_id) REFERENCES memory_records(id) ON DELETE CASCADE
61
70
  ) STRICT;
62
- CREATE INDEX memory_tokens_token ON memory_tokens(token, memory_id);
63
71
 
64
72
  CREATE TABLE memory_proposals (
65
73
  id TEXT PRIMARY KEY,
74
+ ${namespaceColumns},
66
75
  policy_proposal_id TEXT NOT NULL UNIQUE,
67
- idempotency_key TEXT NOT NULL UNIQUE,
76
+ idempotency_key TEXT NOT NULL,
68
77
  requester TEXT NOT NULL,
69
78
  principal TEXT NOT NULL,
70
79
  mutation_hash TEXT NOT NULL,
71
80
  mutation_json TEXT NOT NULL,
81
+ promotion_json TEXT,
72
82
  status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired', 'conflicted')),
83
+ not_after INTEGER NOT NULL,
73
84
  expires_at INTEGER NOT NULL,
74
85
  result_memory_id TEXT,
75
86
  created_at INTEGER NOT NULL,
76
87
  updated_at INTEGER NOT NULL,
77
- version INTEGER NOT NULL DEFAULT 1
88
+ version INTEGER NOT NULL DEFAULT 1,
89
+ ${namespaceConstraint}
78
90
  ) STRICT;
79
91
 
80
- CREATE INDEX memory_proposals_reconcile
81
- ON memory_proposals(status, updated_at, id);
82
-
83
92
  CREATE TABLE memory_proposal_intents (
84
93
  id TEXT PRIMARY KEY,
85
- idempotency_key TEXT NOT NULL UNIQUE,
94
+ ${namespaceColumns},
95
+ idempotency_key TEXT NOT NULL,
86
96
  requester TEXT NOT NULL,
87
97
  principal TEXT NOT NULL,
88
98
  mutation_hash TEXT NOT NULL,
89
99
  mutation_json TEXT NOT NULL,
100
+ promotion_json TEXT,
90
101
  ttl_ms INTEGER NOT NULL CHECK (ttl_ms > 0),
91
- dispatch_source_id TEXT,
92
- dispatch_binding_id TEXT,
93
- dispatch_workspace TEXT,
94
- dispatch_principal TEXT,
102
+ not_after INTEGER NOT NULL,
103
+ dispatch_json TEXT,
95
104
  created_at INTEGER NOT NULL,
96
105
  updated_at INTEGER NOT NULL,
97
- CHECK (
98
- (dispatch_source_id IS NULL AND dispatch_binding_id IS NULL
99
- AND dispatch_workspace IS NULL AND dispatch_principal IS NULL)
100
- OR
101
- (dispatch_source_id IS NOT NULL AND dispatch_binding_id IS NOT NULL
102
- AND dispatch_workspace IS NOT NULL AND dispatch_principal IS NOT NULL)
103
- )
106
+ ${namespaceConstraint}
104
107
  ) STRICT;
105
108
 
106
- CREATE INDEX memory_proposal_intents_reconcile
107
- ON memory_proposal_intents(updated_at, id);
108
-
109
109
  CREATE TABLE memory_audit (
110
110
  sequence INTEGER PRIMARY KEY AUTOINCREMENT,
111
- idempotency_key TEXT NOT NULL UNIQUE,
111
+ ${namespaceColumns},
112
+ idempotency_key TEXT NOT NULL,
112
113
  mutation_hash TEXT NOT NULL,
113
114
  operation TEXT NOT NULL,
114
115
  memory_id TEXT NOT NULL,
115
116
  result_version INTEGER NOT NULL,
116
- occurred_at INTEGER NOT NULL
117
+ occurred_at INTEGER NOT NULL,
118
+ ${namespaceConstraint}
117
119
  ) STRICT;
118
120
 
119
- INSERT INTO schema_meta(key, value) VALUES ('schema-version', '2');
120
- PRAGMA user_version = 2;
121
- COMMIT;
122
- `);
123
- return;
121
+ CREATE TABLE memory_promotion_results (
122
+ promotion_id TEXT NOT NULL,
123
+ promotion_generation INTEGER NOT NULL CHECK (promotion_generation >= 1),
124
+ request_digest TEXT NOT NULL CHECK (length(request_digest) = 64 AND request_digest NOT GLOB '*[^0-9a-f]*'),
125
+ ${namespaceColumns},
126
+ owner_generation INTEGER NOT NULL CHECK (owner_generation >= 1),
127
+ contract_version INTEGER NOT NULL CHECK (contract_version = 1),
128
+ result_version INTEGER NOT NULL CHECK (result_version >= 1),
129
+ status TEXT NOT NULL CHECK (status IN ('confirmed', 'rejected', 'expired', 'conflicted', 'stale-owner')),
130
+ memory_proposal_id TEXT NOT NULL UNIQUE,
131
+ memory_proposal_version INTEGER NOT NULL CHECK (memory_proposal_version >= 1),
132
+ occurred_at INTEGER NOT NULL,
133
+ receipt_digest TEXT NOT NULL CHECK (length(receipt_digest) = 64 AND receipt_digest NOT GLOB '*[^0-9a-f]*'),
134
+ memory_record_id TEXT,
135
+ memory_record_version INTEGER,
136
+ memory_record_digest TEXT,
137
+ state TEXT NOT NULL CHECK (state IN ('pending', 'completed')),
138
+ attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (attempt_count >= 0),
139
+ last_error TEXT,
140
+ created_at INTEGER NOT NULL,
141
+ updated_at INTEGER NOT NULL,
142
+ PRIMARY KEY (promotion_id, promotion_generation),
143
+ CHECK (
144
+ (status = 'confirmed' AND memory_record_id IS NOT NULL AND memory_record_version >= 1
145
+ AND length(memory_record_digest) = 64 AND memory_record_digest NOT GLOB '*[^0-9a-f]*')
146
+ OR
147
+ (status <> 'confirmed' AND memory_record_id IS NULL
148
+ AND memory_record_version IS NULL AND memory_record_digest IS NULL)
149
+ ),
150
+ ${namespaceConstraint}
151
+ ) STRICT;
152
+
153
+ CREATE TABLE memory_promotion_cancellations (
154
+ promotion_id TEXT NOT NULL,
155
+ promotion_generation INTEGER NOT NULL CHECK (promotion_generation >= 1),
156
+ request_digest TEXT NOT NULL CHECK (length(request_digest) = 64 AND request_digest NOT GLOB '*[^0-9a-f]*'),
157
+ principal_record_id TEXT NOT NULL CHECK (principal_record_id <> ''),
158
+ principal_version INTEGER NOT NULL CHECK (principal_version >= 1),
159
+ owner_generation INTEGER NOT NULL CHECK (owner_generation >= 1),
160
+ cancellation_digest TEXT NOT NULL CHECK (
161
+ length(cancellation_digest) = 64 AND cancellation_digest NOT GLOB '*[^0-9a-f]*'
162
+ ),
163
+ reason TEXT NOT NULL CHECK (reason IN ('forget', 'owner-rotated', 'superseded')),
164
+ occurred_at INTEGER NOT NULL CHECK (occurred_at >= 0),
165
+ receipt_digest TEXT NOT NULL CHECK (
166
+ length(receipt_digest) = 64 AND receipt_digest NOT GLOB '*[^0-9a-f]*'
167
+ ),
168
+ created_at INTEGER NOT NULL,
169
+ updated_at INTEGER NOT NULL,
170
+ PRIMARY KEY (promotion_id, promotion_generation)
171
+ ) STRICT;
172
+ `);
173
+ }
174
+ function createV4CompensationTable(database) {
175
+ database.exec(`
176
+ CREATE TABLE memory_promotion_compensations (
177
+ promotion_id TEXT NOT NULL,
178
+ promotion_generation INTEGER NOT NULL CHECK (promotion_generation >= 1),
179
+ request_digest TEXT NOT NULL CHECK (
180
+ length(request_digest) = 64 AND request_digest NOT GLOB '*[^0-9a-f]*'
181
+ ),
182
+ cancellation_digest TEXT NOT NULL CHECK (
183
+ length(cancellation_digest) = 64 AND cancellation_digest NOT GLOB '*[^0-9a-f]*'
184
+ ),
185
+ memory_proposal_id TEXT NOT NULL,
186
+ memory_proposal_version INTEGER NOT NULL CHECK (memory_proposal_version >= 1),
187
+ memory_record_id TEXT NOT NULL,
188
+ memory_record_version INTEGER NOT NULL CHECK (memory_record_version >= 1),
189
+ memory_record_digest TEXT NOT NULL CHECK (
190
+ length(memory_record_digest) = 64 AND memory_record_digest NOT GLOB '*[^0-9a-f]*'
191
+ ),
192
+ removed_record_version INTEGER NOT NULL CHECK (removed_record_version >= 2),
193
+ compensated_at INTEGER NOT NULL CHECK (compensated_at >= 0),
194
+ PRIMARY KEY (promotion_id, promotion_generation)
195
+ ) STRICT;
196
+ `);
197
+ }
198
+ function createV3Indexes(database) {
199
+ database.exec(`
200
+ CREATE INDEX memory_records_scope
201
+ ON memory_records(namespace_key, owner, scope, workspace, agent_preset, status, updated_at DESC);
202
+ CREATE INDEX memory_records_hash
203
+ ON memory_records(namespace_key, owner, scope, workspace, agent_preset, content_hash, status);
204
+ CREATE INDEX memory_tokens_token ON memory_tokens(token, memory_id);
205
+ CREATE UNIQUE INDEX memory_proposals_idempotency
206
+ ON memory_proposals(namespace_key, idempotency_key);
207
+ CREATE INDEX memory_proposals_reconcile
208
+ ON memory_proposals(namespace_mode, status, updated_at, id);
209
+ CREATE UNIQUE INDEX memory_proposal_intents_idempotency
210
+ ON memory_proposal_intents(namespace_key, idempotency_key);
211
+ CREATE INDEX memory_proposal_intents_reconcile
212
+ ON memory_proposal_intents(namespace_mode, updated_at, id);
213
+ CREATE UNIQUE INDEX memory_audit_idempotency
214
+ ON memory_audit(namespace_key, idempotency_key);
215
+ CREATE INDEX memory_promotion_results_pending
216
+ ON memory_promotion_results(state, updated_at, promotion_id, promotion_generation);
217
+ `);
218
+ }
219
+ function assertSafeFile(path) {
220
+ const stat = lstatSync(path);
221
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1) {
222
+ throw new MemoryDatabaseError('unsafe-file', 'memory database must be one regular, unlinked file');
223
+ }
224
+ if ((stat.mode & 0o077) !== 0) {
225
+ throw new MemoryDatabaseError('unsafe-file', 'memory database permissions must not allow group or other access');
226
+ }
227
+ const uid = process.getuid?.();
228
+ if (uid !== undefined && stat.uid !== uid) {
229
+ throw new MemoryDatabaseError('unsafe-file', 'memory database must be owned by the current OS user');
230
+ }
231
+ }
232
+ function preparePrivateFile(path) {
233
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
234
+ try {
235
+ const descriptor = openSync(path, constants.O_CREAT | constants.O_EXCL | constants.O_RDWR, 0o600);
236
+ closeSync(descriptor);
124
237
  }
238
+ catch (error) {
239
+ if (!(error instanceof Error && 'code' in error && error.code === 'EEXIST'))
240
+ throw error;
241
+ }
242
+ assertSafeFile(path);
243
+ for (const sidecar of [`${path}-wal`, `${path}-shm`]) {
244
+ try {
245
+ assertSafeFile(sidecar);
246
+ }
247
+ catch (error) {
248
+ if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))
249
+ throw error;
250
+ }
251
+ }
252
+ }
253
+ const walRetryWait = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
254
+ function enableWal(database) {
255
+ const deadline = Date.now() + 5_000;
256
+ while (true) {
257
+ try {
258
+ const row = database.prepare('PRAGMA journal_mode = WAL').get();
259
+ if (row.journal_mode.toLowerCase() !== 'wal') {
260
+ throw new Error(`memory database refused WAL mode: ${row.journal_mode}`);
261
+ }
262
+ return;
263
+ }
264
+ catch (error) {
265
+ const retryable = error instanceof Error && /database is (?:busy|locked)/i.test(error.message);
266
+ if (!retryable || Date.now() >= deadline)
267
+ throw error;
268
+ Atomics.wait(walRetryWait, 0, 0, 10);
269
+ }
270
+ }
271
+ }
272
+ function createFresh(database) {
273
+ database.exec(`
274
+ CREATE TABLE schema_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL) STRICT;
275
+ INSERT INTO schema_meta(key, value) VALUES ('schema-version', '4');
276
+ `);
277
+ createV3Tables(database);
278
+ createV4CompensationTable(database);
279
+ createV3Indexes(database);
280
+ }
281
+ function migrateV3ToV4(database) {
282
+ createV4CompensationTable(database);
283
+ database.exec(`
284
+ UPDATE schema_meta SET value = '4' WHERE key = 'schema-version';
285
+ PRAGMA user_version = 4;
286
+ `);
287
+ }
288
+ function migrateV1ToV2(database) {
125
289
  database.exec(`
126
- BEGIN IMMEDIATE;
127
290
  CREATE INDEX memory_proposals_reconcile
128
291
  ON memory_proposals(status, updated_at, id);
129
292
  CREATE TABLE memory_proposal_intents (
@@ -152,24 +315,121 @@ function migrate(database) {
152
315
  ON memory_proposal_intents(updated_at, id);
153
316
  UPDATE schema_meta SET value = '2' WHERE key = 'schema-version';
154
317
  PRAGMA user_version = 2;
155
- COMMIT;
156
318
  `);
157
319
  }
320
+ function migrateV2ToV3(database) {
321
+ database.exec(`
322
+ ALTER TABLE memory_records RENAME TO memory_records_v2;
323
+ ALTER TABLE memory_tokens RENAME TO memory_tokens_v2;
324
+ ALTER TABLE memory_proposals RENAME TO memory_proposals_v2;
325
+ ALTER TABLE memory_proposal_intents RENAME TO memory_proposal_intents_v2;
326
+ ALTER TABLE memory_audit RENAME TO memory_audit_v2;
327
+ `);
328
+ createV3Tables(database);
329
+ database.exec(`
330
+ INSERT INTO memory_records(
331
+ id, namespace_mode, namespace_key, principal_digest, principal_record_id, principal_version,
332
+ headless_lineage_id, headless_lineage_version, owner, scope, workspace, agent_preset,
333
+ kind, content, content_hash, sensitivity, trust, confidence, provenance_json, supersedes, expires_at,
334
+ status, created_at, updated_at, version
335
+ ) SELECT id, 'legacy-quarantine', 'legacy-v2', NULL, NULL, NULL, NULL, NULL, owner, scope, workspace,
336
+ agent_preset, kind, content, content_hash, sensitivity, trust, confidence, provenance_json, supersedes,
337
+ expires_at, status, created_at, updated_at, version FROM memory_records_v2;
338
+ INSERT INTO memory_tokens(memory_id, token, weight)
339
+ SELECT memory_id, token, weight FROM memory_tokens_v2;
340
+ INSERT INTO memory_proposals(
341
+ id, namespace_mode, namespace_key, principal_digest, principal_record_id, principal_version,
342
+ headless_lineage_id, headless_lineage_version, policy_proposal_id, idempotency_key,
343
+ requester, principal, mutation_hash, mutation_json, promotion_json, status, not_after, expires_at, result_memory_id,
344
+ created_at, updated_at, version
345
+ ) SELECT id, 'legacy-quarantine', 'legacy-v2', NULL, NULL, NULL, NULL, NULL, policy_proposal_id,
346
+ idempotency_key, requester, principal, mutation_hash, mutation_json, NULL,
347
+ CASE WHEN status = 'pending' THEN 'conflicted' ELSE status END, expires_at, expires_at, result_memory_id,
348
+ created_at, updated_at, CASE WHEN status = 'pending' THEN version + 1 ELSE version END
349
+ FROM memory_proposals_v2;
350
+ INSERT INTO memory_proposal_intents(
351
+ id, namespace_mode, namespace_key, principal_digest, principal_record_id, principal_version,
352
+ headless_lineage_id, headless_lineage_version, idempotency_key, requester, principal,
353
+ mutation_hash, mutation_json, promotion_json, ttl_ms, not_after, dispatch_json, created_at, updated_at
354
+ ) SELECT id, 'legacy-quarantine', 'legacy-v2', NULL, NULL, NULL, NULL, NULL, idempotency_key, requester,
355
+ principal, mutation_hash, mutation_json, NULL, ttl_ms, created_at + ttl_ms,
356
+ CASE WHEN dispatch_source_id IS NULL THEN NULL ELSE json_object(
357
+ 'sourceId', dispatch_source_id, 'bindingId', dispatch_binding_id,
358
+ 'workspace', dispatch_workspace, 'principal', dispatch_principal) END, created_at, updated_at
359
+ FROM memory_proposal_intents_v2;
360
+ INSERT INTO memory_audit(
361
+ sequence, namespace_mode, namespace_key, principal_digest, principal_record_id, principal_version,
362
+ headless_lineage_id, headless_lineage_version, idempotency_key, mutation_hash,
363
+ operation, memory_id, result_version, occurred_at
364
+ ) SELECT sequence, 'legacy-quarantine', 'legacy-v2', NULL, NULL, NULL, NULL, NULL, idempotency_key,
365
+ mutation_hash, operation, memory_id, result_version, occurred_at FROM memory_audit_v2;
366
+
367
+ DROP TABLE memory_tokens_v2;
368
+ DROP TABLE memory_records_v2;
369
+ DROP TABLE memory_proposals_v2;
370
+ DROP TABLE memory_proposal_intents_v2;
371
+ DROP TABLE memory_audit_v2;
372
+ `);
373
+ createV3Indexes(database);
374
+ database.exec(`
375
+ UPDATE schema_meta SET value = '3' WHERE key = 'schema-version';
376
+ PRAGMA user_version = 3;
377
+ `);
378
+ }
379
+ function migrate(database) {
380
+ database.exec('BEGIN IMMEDIATE');
381
+ try {
382
+ let row = database.prepare('PRAGMA user_version').get();
383
+ if (row.user_version > memorySchemaVersion) {
384
+ throw new MemoryDatabaseError('schema-too-new', `memory schema ${row.user_version} is newer than supported schema ${memorySchemaVersion}`);
385
+ }
386
+ if (row.user_version === 0) {
387
+ createFresh(database);
388
+ database.exec('PRAGMA user_version = 4');
389
+ }
390
+ else {
391
+ if (row.user_version === 1)
392
+ migrateV1ToV2(database);
393
+ row = database.prepare('PRAGMA user_version').get();
394
+ if (row.user_version === 2)
395
+ migrateV2ToV3(database);
396
+ row = database.prepare('PRAGMA user_version').get();
397
+ if (row.user_version === 3)
398
+ migrateV3ToV4(database);
399
+ }
400
+ database.exec('COMMIT');
401
+ }
402
+ catch (error) {
403
+ database.exec('ROLLBACK');
404
+ throw error;
405
+ }
406
+ }
158
407
  export function openMemoryDatabase(path) {
159
408
  if (path !== ':memory:' && !isAbsolute(path)) {
160
409
  throw new MemoryDatabaseError('invalid-path', 'memory database path must be absolute');
161
410
  }
162
411
  if (path !== ':memory:')
163
- mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
412
+ preparePrivateFile(path);
164
413
  const database = new DatabaseSync(path);
165
414
  try {
166
415
  database.exec('PRAGMA foreign_keys = ON');
167
416
  database.exec('PRAGMA busy_timeout = 5000');
168
417
  database.exec('PRAGMA synchronous = FULL');
418
+ database.exec('PRAGMA secure_delete = ON');
169
419
  migrate(database);
170
420
  if (path !== ':memory:') {
171
- database.exec('PRAGMA journal_mode = WAL');
421
+ enableWal(database);
172
422
  chmodSync(path, 0o600);
423
+ for (const sidecar of [`${path}-wal`, `${path}-shm`]) {
424
+ try {
425
+ chmodSync(sidecar, 0o600);
426
+ assertSafeFile(sidecar);
427
+ }
428
+ catch (error) {
429
+ if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))
430
+ throw error;
431
+ }
432
+ }
173
433
  }
174
434
  return database;
175
435
  }
package/lib/sqlite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAEpC,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAEjC;IADX,YACW,IAAuC,EAChD,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHL,SAAI,GAAJ,IAAI,CAAmC;QAIhD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,SAAS,OAAO,CAAC,QAAsB;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAA8B,CAAA;IACrF,IAAI,GAAG,CAAC,YAAY,GAAG,mBAAmB,EAAE,CAAC;QAC3C,MAAM,IAAI,mBAAmB,CAC3B,gBAAgB,EAChB,iBAAiB,GAAG,CAAC,YAAY,mCAAmC,mBAAmB,EAAE,CAC1F,CAAA;IACH,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,KAAK,mBAAmB;QAAE,OAAM;IAEpD,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqGb,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+Bb,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,mBAAmB,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAA;IACxF,CAAC;IACD,IAAI,IAAI,KAAK,UAAU;QAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACnF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACzC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QAC3C,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QAC1C,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;YAC1C,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,EAAE,CAAA;QAChB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACzF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAEpC,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAEjC;IADX,YACW,IAAuD,EAChE,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHL,SAAI,GAAJ,IAAI,CAAmD;QAIhE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG;;;;;;;mCAOU,CAAA;AAEnC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;EAiB1B,CAAA;AAEF,SAAS,cAAc,CAAC,QAAsB;IAC5C,QAAQ,CAAC,IAAI,CAAC;;;QAGR,gBAAgB;;;;;;;;;;;;;;;;;;QAkBhB,mBAAmB;;;;;;;;;;;;;QAanB,gBAAgB;;;;;;;;;;;;;;;QAehB,mBAAmB;;;;;QAKnB,gBAAgB;;;;;;;;;;;;QAYhB,mBAAmB;;;;;QAKnB,gBAAgB;;;;;;;QAOhB,mBAAmB;;;;;;;QAOnB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;QAyBhB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;GAsBxB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAsB;IACvD,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;GAqBb,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAsB;IAC7C,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;GAkBb,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,mBAAmB,CAAC,aAAa,EAAE,oDAAoD,CAAC,CAAA;IACpG,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,mBAAmB,CAAC,aAAa,EAAE,kEAAkE,CAAC,CAAA;IAClH,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAA;IAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,mBAAmB,CAAC,aAAa,EAAE,sDAAsD,CAAC,CAAA;IACtG,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACjG,SAAS,CAAC,UAAU,CAAC,CAAA;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAA;IAC1F,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,CAAA;IACpB,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,cAAc,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;gBAAE,MAAM,KAAK,CAAA;QAC1F,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAExF,SAAS,SAAS,CAAC,QAAsB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;IACnC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,EAA8B,CAAA;YAC3F,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAA;YAC1E,CAAC;YACD,OAAM;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC9F,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,MAAM,KAAK,CAAA;YACrD,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAsB;IACzC,QAAQ,CAAC,IAAI,CAAC;;;GAGb,CAAC,CAAA;IACF,cAAc,CAAC,QAAQ,CAAC,CAAA;IACxB,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IACnC,eAAe,CAAC,QAAQ,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,QAAsB;IAC3C,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IACnC,QAAQ,CAAC,IAAI,CAAC;;;GAGb,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAsB;IAC3C,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6Bb,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAsB;IAC3C,QAAQ,CAAC,IAAI,CAAC;;;;;;GAMb,CAAC,CAAA;IACF,cAAc,CAAC,QAAQ,CAAC,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2Cb,CAAC,CAAA;IACF,eAAe,CAAC,QAAQ,CAAC,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC;;;GAGb,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,QAAsB;IACrC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAChC,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAA8B,CAAA;QACnF,IAAI,GAAG,CAAC,YAAY,GAAG,mBAAmB,EAAE,CAAC;YAC3C,MAAM,IAAI,mBAAmB,CAC3B,gBAAgB,EAChB,iBAAiB,GAAG,CAAC,YAAY,mCAAmC,mBAAmB,EAAE,CAC1F,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,QAAQ,CAAC,CAAA;YACrB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC;gBAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;YACnD,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAA8B,CAAA;YAC/E,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC;gBAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;YACnD,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAA8B,CAAA;YAC/E,IAAI,GAAG,CAAC,YAAY,KAAK,CAAC;gBAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;QACrD,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,mBAAmB,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAA;IACxF,CAAC;IACD,IAAI,IAAI,KAAK,UAAU;QAAE,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACzC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QAC3C,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QAC1C,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QAC1C,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,SAAS,CAAC,QAAQ,CAAC,CAAA;YACnB,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACtB,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;oBACzB,cAAc,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;wBAAE,MAAM,KAAK,CAAA;gBAC1F,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,EAAE,CAAA;QAChB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
package/lib/store.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { ApprovedMemoryMutation, MemoryAgentContext, MemoryExportDocument, MemoryIdentity, MemoryMutation, MemoryProposalInput, MemoryRecord, MemorySearchHit, MemorySearchRequest, MemorySnapshot, MemorySnapshotRequest, StoredMemoryProposal, StoredMemoryProposalIntent } from './types.js';
2
- export type MemoryStoreErrorCode = 'content-too-large' | 'duplicate-content' | 'idempotency-conflict' | 'invalid-entry' | 'invalid-identity' | 'invalid-path' | 'not-found' | 'record-limit' | 'schema-too-new' | 'version-conflict';
1
+ import type { ApprovedMemoryMutation, MemoryAgentContext, MemoryExportDocument, MemoryIdentity, MemoryMutation, MemoryOwnerNamespace, MemoryPromotionCancellationInput, MemoryPromotionCancellationResult, MemoryPromotionReference, MemoryPromotionSettlement, MemoryProposalInput, MemoryRecord, MemorySearchHit, MemorySearchRequest, MemorySnapshot, MemorySnapshotRequest, StoredMemoryProposal, StoredMemoryProposalIntent, StoredMemoryPromotionResult } from './types.js';
2
+ export type MemoryStoreErrorCode = 'content-too-large' | 'duplicate-content' | 'idempotency-conflict' | 'invalid-entry' | 'invalid-identity' | 'invalid-path' | 'not-found' | 'record-limit' | 'schema-too-new' | 'unsafe-file' | 'version-conflict';
3
3
  export declare class MemoryStoreError extends Error {
4
4
  readonly code: MemoryStoreErrorCode;
5
5
  constructor(code: MemoryStoreErrorCode, message: string);
@@ -13,6 +13,7 @@ export interface MemoryStoreOptions {
13
13
  export interface PrepareMemoryProposalIntentInput extends MemoryProposalInput {
14
14
  proposalId: string;
15
15
  mutationHash: string;
16
+ notAfter: number;
16
17
  }
17
18
  export type PrepareMemoryProposalStateResult = Readonly<{
18
19
  kind: 'proposal';
@@ -23,6 +24,9 @@ export type PrepareMemoryProposalStateResult = Readonly<{
23
24
  replayed: boolean;
24
25
  }> | Readonly<{
25
26
  kind: 'conflict';
27
+ }> | Readonly<{
28
+ kind: 'cancelled';
29
+ receipt: MemoryPromotionCancellationResult['receipt'];
26
30
  }>;
27
31
  export interface SaveMemoryProposalInput {
28
32
  proposalId: string;
@@ -30,33 +34,45 @@ export interface SaveMemoryProposalInput {
30
34
  idempotencyKey: string;
31
35
  requester: string;
32
36
  principal: string;
37
+ namespace: MemoryOwnerNamespace;
33
38
  mutation: MemoryMutation;
34
39
  mutationHash: string;
35
40
  expiresAt: number;
36
41
  version: number;
42
+ notAfter: number;
43
+ promotion?: Readonly<MemoryPromotionReference>;
37
44
  }
38
45
  export type SettleMemoryProposalInput = {
39
46
  proposalId: string;
40
47
  policyStatus: 'approved' | 'expired' | 'rejected';
41
48
  policyVersion: number;
49
+ promotion?: Readonly<MemoryPromotionSettlement>;
42
50
  } | {
43
51
  proposalId: string;
44
52
  policyStatus: 'conflicted';
53
+ promotion?: Readonly<MemoryPromotionSettlement>;
45
54
  };
46
55
  export interface SettleMemoryProposalResult {
47
56
  proposal: StoredMemoryProposal;
48
57
  record?: MemoryRecord;
49
58
  replayed: boolean;
50
59
  }
60
+ export declare function memoryPrincipalDigest(principal: string): string;
61
+ export declare function normalizeMemoryOwnerNamespace(namespace: MemoryOwnerNamespace): MemoryOwnerNamespace;
62
+ export declare function memoryOwnerNamespaceKey(namespace: MemoryOwnerNamespace): string;
51
63
  export declare function hashMemoryMutation(mutation: MemoryMutation): string;
64
+ export declare function hashMemoryProposalIntent(input: Pick<MemoryProposalInput, 'dispatch' | 'mutation' | 'namespace' | 'promotion' | 'ttlMs'> & {
65
+ notAfter: number;
66
+ }): string;
52
67
  export declare function missingPolicyProposalId(proposalId: string, ttlMs: number, dispatch: MemoryProposalInput['dispatch']): string;
53
68
  export declare function isMissingPolicyProposalId(proposalId: string): boolean;
54
69
  export declare class MemoryStore {
55
70
  #private;
56
71
  constructor(options: MemoryStoreOptions);
57
72
  close(): void;
58
- get(identity: MemoryIdentity, id: string): MemoryRecord | undefined;
59
- list(identity: MemoryIdentity, options?: {
73
+ resolveProposalNotAfter(namespace: MemoryOwnerNamespace, idempotencyKey: string, ttlMs: number, requested?: number): number;
74
+ get(namespace: MemoryOwnerNamespace, identity: MemoryIdentity, id: string): MemoryRecord | undefined;
75
+ list(namespace: MemoryOwnerNamespace, identity: MemoryIdentity, options?: {
60
76
  includeRemoved?: boolean;
61
77
  }): MemoryRecord[];
62
78
  read(context: MemoryAgentContext, ids: readonly string[]): MemoryRecord[];
@@ -69,7 +85,8 @@ export declare class MemoryStore {
69
85
  search(request: MemorySearchRequest): MemorySearchHit[];
70
86
  snapshot(request: MemorySnapshotRequest): MemorySnapshot;
71
87
  exportDocument(context: MemoryAgentContext): MemoryExportDocument;
72
- normalizeMutation(mutation: MemoryMutation, options?: {
88
+ normalizeMutation(mutation: MemoryMutation, options: {
89
+ namespace: MemoryOwnerNamespace;
73
90
  preflight?: boolean;
74
91
  }): MemoryMutation;
75
92
  prepareProposalIntent(input: PrepareMemoryProposalIntentInput): PrepareMemoryProposalStateResult;
@@ -77,7 +94,7 @@ export declare class MemoryStore {
77
94
  listProposalIntents(limit: number): StoredMemoryProposalIntent[];
78
95
  deferProposalIntent(proposalId: string): void;
79
96
  /** Fail closed after Policy atomically abandons or rejects exact recovery. */
80
- conflictProposalIntent(proposalId: string): {
97
+ conflictProposalIntent(proposalId: string, promotion?: Readonly<MemoryPromotionSettlement>): {
81
98
  proposal: StoredMemoryProposal;
82
99
  replayed: boolean;
83
100
  };
@@ -92,6 +109,22 @@ export declare class MemoryStore {
92
109
  */
93
110
  listPendingProposals(limit: number): StoredMemoryProposal[];
94
111
  deferPendingProposal(proposalId: string): void;
112
+ listPendingPromotionResults(limit: number): StoredMemoryPromotionResult[];
113
+ getPromotionResult(promotionId: string, promotionGeneration: number, resultVersion: number): StoredMemoryPromotionResult | undefined;
114
+ getProposalByPromotion(promotionId: string, promotionGeneration: number): (Readonly<{
115
+ kind: 'intent';
116
+ proposal: StoredMemoryProposalIntent;
117
+ requestDigest: string;
118
+ namespace: MemoryOwnerNamespace;
119
+ }> | Readonly<{
120
+ kind: 'proposal';
121
+ proposal: StoredMemoryProposal;
122
+ requestDigest: string;
123
+ namespace: MemoryOwnerNamespace;
124
+ }>) | undefined;
125
+ cancelPromotionBeforeOrAfterSubmit(input: MemoryPromotionCancellationInput): MemoryPromotionCancellationResult;
126
+ completePromotionResult(result: StoredMemoryPromotionResult): boolean;
127
+ deferPromotionResult(result: StoredMemoryPromotionResult, error?: string): boolean;
95
128
  settleProposal(input: SettleMemoryProposalInput): SettleMemoryProposalResult;
96
129
  applyApprovedMutation(mutation: ApprovedMemoryMutation): MemoryRecord;
97
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}