@hasna/mementos 0.14.74 → 0.14.78

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.
Files changed (68) hide show
  1. package/bun.lock +93 -0
  2. package/dist/cli/commands/agent.d.ts.map +1 -1
  3. package/dist/cli/commands/info-context.d.ts.map +1 -1
  4. package/dist/cli/commands/info-stale.d.ts.map +1 -1
  5. package/dist/cli/commands/io-export.d.ts.map +1 -1
  6. package/dist/cli/commands/memory-cmd-crud.d.ts.map +1 -1
  7. package/dist/cli/commands/memory-cmd-list.d.ts.map +1 -1
  8. package/dist/cli/commands/memory-cmd-recall.d.ts.map +1 -1
  9. package/dist/cli/commands/memory-cmd-search.d.ts.map +1 -1
  10. package/dist/cli/commands/memory-cmd-tail.d.ts.map +1 -1
  11. package/dist/cli/commands/project.d.ts.map +1 -1
  12. package/dist/cli/commands/system-watch.d.ts.map +1 -1
  13. package/dist/cli/helpers.d.ts +38 -0
  14. package/dist/cli/helpers.d.ts.map +1 -1
  15. package/dist/cli/index.js +2077 -299
  16. package/dist/db/__fixtures__/fail-closed-stub-server.d.ts.map +1 -1
  17. package/dist/db/agents.d.ts +6 -0
  18. package/dist/db/agents.d.ts.map +1 -1
  19. package/dist/db/audit.d.ts +14 -0
  20. package/dist/db/audit.d.ts.map +1 -1
  21. package/dist/db/memory-project-link.d.ts +13 -0
  22. package/dist/db/memory-project-link.d.ts.map +1 -0
  23. package/dist/db/migrations.d.ts.map +1 -1
  24. package/dist/db/pg-migrations.d.ts +0 -6
  25. package/dist/db/pg-migrations.d.ts.map +1 -1
  26. package/dist/db/projects.d.ts +22 -1
  27. package/dist/db/projects.d.ts.map +1 -1
  28. package/dist/index.d.ts +5 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2909 -173
  31. package/dist/lib/package-version.d.ts +3 -0
  32. package/dist/lib/package-version.d.ts.map +1 -0
  33. package/dist/mcp/index.js +524 -10
  34. package/dist/memory-project-link/index.d.ts +2 -0
  35. package/dist/memory-project-link/index.d.ts.map +1 -0
  36. package/dist/memory-project-link/schema.d.ts +5 -0
  37. package/dist/memory-project-link/schema.d.ts.map +1 -0
  38. package/dist/project-registration/authority.d.ts +39 -0
  39. package/dist/project-registration/authority.d.ts.map +1 -0
  40. package/dist/project-registration/http.d.ts +29 -0
  41. package/dist/project-registration/http.d.ts.map +1 -0
  42. package/dist/project-registration/index.d.ts +8 -0
  43. package/dist/project-registration/index.d.ts.map +1 -0
  44. package/dist/project-registration/project-references.d.ts +71 -0
  45. package/dist/project-registration/project-references.d.ts.map +1 -0
  46. package/dist/project-registration/schema.d.ts +5 -0
  47. package/dist/project-registration/schema.d.ts.map +1 -0
  48. package/dist/project-registration/types.d.ts +168 -0
  49. package/dist/project-registration/types.d.ts.map +1 -0
  50. package/dist/project-registration.d.ts +2 -0
  51. package/dist/project-registration.d.ts.map +1 -0
  52. package/dist/project-registration.js +1496 -0
  53. package/dist/sdk/index.d.ts +127 -0
  54. package/dist/sdk/index.d.ts.map +1 -1
  55. package/dist/sdk/index.js +74 -0
  56. package/dist/server/index.d.ts +1 -0
  57. package/dist/server/index.d.ts.map +1 -1
  58. package/dist/server/index.js +2667 -149
  59. package/dist/server/routes/memories.d.ts +1 -0
  60. package/dist/server/routes/memories.d.ts.map +1 -1
  61. package/dist/server/routes/memory-project-link.d.ts +2 -0
  62. package/dist/server/routes/memory-project-link.d.ts.map +1 -0
  63. package/dist/server/routes/project-registration.d.ts +2 -0
  64. package/dist/server/routes/project-registration.d.ts.map +1 -0
  65. package/dist/types/index.d.ts +119 -0
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/package.json +9 -3
  68. package/dashboard/bun.lock +0 -519
@@ -0,0 +1,3 @@
1
+ /** Read the package version from source or either bundled output layout. */
2
+ export declare function getMementosPackageVersion(): string;
3
+ //# sourceMappingURL=package-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../../src/lib/package-version.ts"],"names":[],"mappings":"AAIA,4EAA4E;AAC5E,wBAAgB,yBAAyB,IAAI,MAAM,CAclD"}
package/dist/mcp/index.js CHANGED
@@ -1241,6 +1241,394 @@ var init_api_mode = __esm(() => {
1241
1241
  };
1242
1242
  });
1243
1243
 
1244
+ // src/project-registration/schema.ts
1245
+ function sqliteMementosProjectRegistrationSchemaSql() {
1246
+ return `
1247
+ CREATE TABLE IF NOT EXISTS mementos_project_registration_receipts (
1248
+ receipt_id TEXT PRIMARY KEY,
1249
+ authority TEXT NOT NULL CHECK(authority = 'mementos'),
1250
+ route TEXT NOT NULL,
1251
+ package_version TEXT NOT NULL,
1252
+ authority_id TEXT NOT NULL,
1253
+ tenant_id TEXT NOT NULL,
1254
+ corpus_id TEXT NOT NULL,
1255
+ operation_id TEXT NOT NULL,
1256
+ step_id TEXT NOT NULL,
1257
+ resource_kind TEXT NOT NULL CHECK(resource_kind = 'project'),
1258
+ direction TEXT NOT NULL CHECK(direction IN ('forward', 'inverse')),
1259
+ target_selector TEXT NOT NULL,
1260
+ idempotency_key TEXT NOT NULL,
1261
+ request_digest TEXT NOT NULL,
1262
+ precondition_digest TEXT NOT NULL,
1263
+ normalized_call_digest TEXT NOT NULL,
1264
+ outcome TEXT NOT NULL CHECK(outcome IN (
1265
+ 'accepted', 'duplicate_of_accepted', 'terminal_nonacceptance'
1266
+ )),
1267
+ reason TEXT,
1268
+ target_id TEXT,
1269
+ result_revision TEXT,
1270
+ result_digest TEXT,
1271
+ duplicate_of_receipt_id TEXT,
1272
+ accepted_receipt_id TEXT,
1273
+ created_by_operation INTEGER NOT NULL CHECK(created_by_operation IN (0, 1)),
1274
+ created_at TEXT NOT NULL
1275
+ );
1276
+
1277
+ CREATE INDEX IF NOT EXISTS idx_mementos_project_registration_receipts_lookup
1278
+ ON mementos_project_registration_receipts (
1279
+ authority_id, tenant_id, corpus_id, operation_id, step_id,
1280
+ resource_kind, direction, idempotency_key, target_selector
1281
+ );
1282
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_mementos_project_registration_receipts_accepted_step
1283
+ ON mementos_project_registration_receipts (
1284
+ authority_id, tenant_id, corpus_id, operation_id, step_id,
1285
+ resource_kind, direction
1286
+ )
1287
+ WHERE outcome = 'accepted';
1288
+
1289
+ CREATE TABLE IF NOT EXISTS mementos_project_registration_bindings (
1290
+ authority_id TEXT NOT NULL,
1291
+ tenant_id TEXT NOT NULL,
1292
+ corpus_id TEXT NOT NULL,
1293
+ resource_kind TEXT NOT NULL CHECK(resource_kind = 'project'),
1294
+ target_selector TEXT NOT NULL,
1295
+ operation_id TEXT NOT NULL,
1296
+ step_id TEXT NOT NULL,
1297
+ direction TEXT NOT NULL CHECK(direction = 'forward'),
1298
+ idempotency_key TEXT NOT NULL,
1299
+ request_digest TEXT NOT NULL,
1300
+ precondition_digest TEXT NOT NULL,
1301
+ normalized_call_digest TEXT NOT NULL,
1302
+ state TEXT NOT NULL CHECK(state IN (
1303
+ 'pending', 'accepted', 'terminal_nonacceptance', 'removed'
1304
+ )),
1305
+ target_id TEXT,
1306
+ accepted_receipt_id TEXT,
1307
+ result_revision TEXT,
1308
+ result_digest TEXT,
1309
+ removed_receipt_id TEXT,
1310
+ created_at TEXT NOT NULL,
1311
+ updated_at TEXT NOT NULL,
1312
+ PRIMARY KEY(authority_id, tenant_id, corpus_id, resource_kind, target_selector),
1313
+ UNIQUE(accepted_receipt_id)
1314
+ );
1315
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_mementos_project_registration_binding_target
1316
+ ON mementos_project_registration_bindings(
1317
+ authority_id, tenant_id, corpus_id, resource_kind, target_id
1318
+ )
1319
+ WHERE target_id IS NOT NULL;
1320
+
1321
+ CREATE TRIGGER IF NOT EXISTS mementos_project_registration_receipts_immutable_update
1322
+ BEFORE UPDATE ON mementos_project_registration_receipts
1323
+ BEGIN
1324
+ SELECT RAISE(ABORT, 'mementos project registration receipts are immutable');
1325
+ END;
1326
+
1327
+ CREATE TRIGGER IF NOT EXISTS mementos_project_registration_receipts_immutable_delete
1328
+ BEFORE DELETE ON mementos_project_registration_receipts
1329
+ BEGIN
1330
+ SELECT RAISE(ABORT, 'mementos project registration receipts are immutable');
1331
+ END;
1332
+ `;
1333
+ }
1334
+ function postgresMementosProjectRegistrationSchemaSql() {
1335
+ return `
1336
+ CREATE TABLE IF NOT EXISTS mementos_project_registration_receipts (
1337
+ receipt_id TEXT PRIMARY KEY,
1338
+ authority TEXT NOT NULL CHECK(authority = 'mementos'),
1339
+ route TEXT NOT NULL,
1340
+ package_version TEXT NOT NULL,
1341
+ authority_id TEXT NOT NULL,
1342
+ tenant_id TEXT NOT NULL,
1343
+ corpus_id TEXT NOT NULL,
1344
+ operation_id TEXT NOT NULL,
1345
+ step_id TEXT NOT NULL,
1346
+ resource_kind TEXT NOT NULL CHECK(resource_kind = 'project'),
1347
+ direction TEXT NOT NULL CHECK(direction IN ('forward', 'inverse')),
1348
+ target_selector TEXT NOT NULL,
1349
+ idempotency_key TEXT NOT NULL,
1350
+ request_digest TEXT NOT NULL,
1351
+ precondition_digest TEXT NOT NULL,
1352
+ normalized_call_digest TEXT NOT NULL,
1353
+ outcome TEXT NOT NULL CHECK(outcome IN (
1354
+ 'accepted', 'duplicate_of_accepted', 'terminal_nonacceptance'
1355
+ )),
1356
+ reason TEXT,
1357
+ target_id TEXT,
1358
+ result_revision TEXT,
1359
+ result_digest TEXT,
1360
+ duplicate_of_receipt_id TEXT,
1361
+ accepted_receipt_id TEXT,
1362
+ created_by_operation BOOLEAN NOT NULL,
1363
+ created_at TIMESTAMPTZ NOT NULL
1364
+ );
1365
+
1366
+ CREATE INDEX IF NOT EXISTS idx_mementos_project_registration_receipts_lookup
1367
+ ON mementos_project_registration_receipts (
1368
+ authority_id, tenant_id, corpus_id, operation_id, step_id,
1369
+ resource_kind, direction, idempotency_key, target_selector
1370
+ );
1371
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_mementos_project_registration_receipts_accepted_step
1372
+ ON mementos_project_registration_receipts (
1373
+ authority_id, tenant_id, corpus_id, operation_id, step_id,
1374
+ resource_kind, direction
1375
+ )
1376
+ WHERE outcome = 'accepted';
1377
+
1378
+ CREATE TABLE IF NOT EXISTS mementos_project_registration_bindings (
1379
+ authority_id TEXT NOT NULL,
1380
+ tenant_id TEXT NOT NULL,
1381
+ corpus_id TEXT NOT NULL,
1382
+ resource_kind TEXT NOT NULL CHECK(resource_kind = 'project'),
1383
+ target_selector TEXT NOT NULL,
1384
+ operation_id TEXT NOT NULL,
1385
+ step_id TEXT NOT NULL,
1386
+ direction TEXT NOT NULL CHECK(direction = 'forward'),
1387
+ idempotency_key TEXT NOT NULL,
1388
+ request_digest TEXT NOT NULL,
1389
+ precondition_digest TEXT NOT NULL,
1390
+ normalized_call_digest TEXT NOT NULL,
1391
+ state TEXT NOT NULL CHECK(state IN (
1392
+ 'pending', 'accepted', 'terminal_nonacceptance', 'removed'
1393
+ )),
1394
+ target_id TEXT,
1395
+ accepted_receipt_id TEXT UNIQUE,
1396
+ result_revision TEXT,
1397
+ result_digest TEXT,
1398
+ removed_receipt_id TEXT,
1399
+ created_at TIMESTAMPTZ NOT NULL,
1400
+ updated_at TIMESTAMPTZ NOT NULL,
1401
+ PRIMARY KEY(authority_id, tenant_id, corpus_id, resource_kind, target_selector)
1402
+ );
1403
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_mementos_project_registration_binding_target
1404
+ ON mementos_project_registration_bindings(
1405
+ authority_id, tenant_id, corpus_id, resource_kind, target_id
1406
+ )
1407
+ WHERE target_id IS NOT NULL;
1408
+
1409
+ CREATE OR REPLACE FUNCTION mementos_project_registration_receipts_immutable()
1410
+ RETURNS trigger
1411
+ LANGUAGE plpgsql
1412
+ AS $$
1413
+ BEGIN
1414
+ RAISE EXCEPTION 'mementos project registration receipts are immutable';
1415
+ END;
1416
+ $$;
1417
+ DROP TRIGGER IF EXISTS mementos_project_registration_receipts_immutable
1418
+ ON mementos_project_registration_receipts;
1419
+ CREATE TRIGGER mementos_project_registration_receipts_immutable
1420
+ BEFORE UPDATE OR DELETE ON mementos_project_registration_receipts
1421
+ FOR EACH ROW EXECUTE FUNCTION mementos_project_registration_receipts_immutable();
1422
+ `;
1423
+ }
1424
+ function sqliteMementosProjectGuardedUpdateSchemaSql() {
1425
+ return `
1426
+ CREATE TABLE IF NOT EXISTS mementos_project_update_receipts (
1427
+ receipt_id TEXT PRIMARY KEY,
1428
+ authority TEXT NOT NULL CHECK(authority = 'mementos'),
1429
+ route TEXT NOT NULL CHECK(route = 'mementos.project-guarded-update.v1'),
1430
+ package_version TEXT NOT NULL,
1431
+ authority_id TEXT NOT NULL,
1432
+ tenant_id TEXT NOT NULL,
1433
+ corpus_id TEXT NOT NULL,
1434
+ operation_id TEXT NOT NULL,
1435
+ step_id TEXT NOT NULL,
1436
+ direction TEXT NOT NULL CHECK(direction IN ('forward', 'rollback')),
1437
+ idempotency_key TEXT NOT NULL,
1438
+ request_digest TEXT NOT NULL,
1439
+ outcome TEXT NOT NULL CHECK(outcome = 'accepted'),
1440
+ target_id TEXT NOT NULL,
1441
+ expected_revision TEXT NOT NULL,
1442
+ result_revision TEXT NOT NULL,
1443
+ result_digest TEXT NOT NULL,
1444
+ accepted_receipt_id TEXT,
1445
+ before_project_json TEXT NOT NULL,
1446
+ after_project_json TEXT NOT NULL,
1447
+ created_at TEXT NOT NULL,
1448
+ UNIQUE(authority_id, tenant_id, corpus_id, direction, idempotency_key)
1449
+ );
1450
+
1451
+ CREATE INDEX IF NOT EXISTS idx_mementos_project_update_receipts_target
1452
+ ON mementos_project_update_receipts(
1453
+ authority_id, tenant_id, corpus_id, target_id, created_at
1454
+ );
1455
+
1456
+ CREATE TRIGGER IF NOT EXISTS mementos_project_update_receipts_immutable_update
1457
+ BEFORE UPDATE ON mementos_project_update_receipts
1458
+ BEGIN
1459
+ SELECT RAISE(ABORT, 'mementos project update receipts are immutable');
1460
+ END;
1461
+
1462
+ CREATE TRIGGER IF NOT EXISTS mementos_project_update_receipts_immutable_delete
1463
+ BEFORE DELETE ON mementos_project_update_receipts
1464
+ BEGIN
1465
+ SELECT RAISE(ABORT, 'mementos project update receipts are immutable');
1466
+ END;
1467
+ `;
1468
+ }
1469
+ function postgresMementosProjectGuardedUpdateSchemaSql() {
1470
+ return `
1471
+ CREATE TABLE IF NOT EXISTS mementos_project_update_receipts (
1472
+ receipt_id TEXT PRIMARY KEY,
1473
+ authority TEXT NOT NULL CHECK(authority = 'mementos'),
1474
+ route TEXT NOT NULL CHECK(route = 'mementos.project-guarded-update.v1'),
1475
+ package_version TEXT NOT NULL,
1476
+ authority_id TEXT NOT NULL,
1477
+ tenant_id TEXT NOT NULL,
1478
+ corpus_id TEXT NOT NULL,
1479
+ operation_id TEXT NOT NULL,
1480
+ step_id TEXT NOT NULL,
1481
+ direction TEXT NOT NULL CHECK(direction IN ('forward', 'rollback')),
1482
+ idempotency_key TEXT NOT NULL,
1483
+ request_digest TEXT NOT NULL,
1484
+ outcome TEXT NOT NULL CHECK(outcome = 'accepted'),
1485
+ target_id TEXT NOT NULL,
1486
+ expected_revision TEXT NOT NULL,
1487
+ result_revision TEXT NOT NULL,
1488
+ result_digest TEXT NOT NULL,
1489
+ accepted_receipt_id TEXT,
1490
+ before_project_json JSONB NOT NULL,
1491
+ after_project_json JSONB NOT NULL,
1492
+ created_at TIMESTAMPTZ NOT NULL,
1493
+ UNIQUE(authority_id, tenant_id, corpus_id, direction, idempotency_key)
1494
+ );
1495
+
1496
+ CREATE INDEX IF NOT EXISTS idx_mementos_project_update_receipts_target
1497
+ ON mementos_project_update_receipts(
1498
+ authority_id, tenant_id, corpus_id, target_id, created_at
1499
+ );
1500
+
1501
+ CREATE OR REPLACE FUNCTION mementos_project_update_receipts_immutable()
1502
+ RETURNS trigger
1503
+ LANGUAGE plpgsql
1504
+ AS $$
1505
+ BEGIN
1506
+ RAISE EXCEPTION 'mementos project update receipts are immutable';
1507
+ END;
1508
+ $$;
1509
+ DROP TRIGGER IF EXISTS mementos_project_update_receipts_immutable
1510
+ ON mementos_project_update_receipts;
1511
+ CREATE TRIGGER mementos_project_update_receipts_immutable
1512
+ BEFORE UPDATE OR DELETE ON mementos_project_update_receipts
1513
+ FOR EACH ROW EXECUTE FUNCTION mementos_project_update_receipts_immutable();
1514
+ `;
1515
+ }
1516
+
1517
+ // src/memory-project-link/schema.ts
1518
+ function sqliteMementosMemoryProjectLinkSchemaSql() {
1519
+ return `
1520
+ CREATE TABLE IF NOT EXISTS mementos_memory_project_link_receipts (
1521
+ receipt_id TEXT PRIMARY KEY,
1522
+ authority TEXT NOT NULL CHECK(authority = 'mementos'),
1523
+ route TEXT NOT NULL CHECK(route = 'mementos.memory-project-link.v1'),
1524
+ package_version TEXT NOT NULL,
1525
+ authority_id TEXT NOT NULL,
1526
+ tenant_id TEXT NOT NULL,
1527
+ corpus_id TEXT NOT NULL,
1528
+ operation_id TEXT NOT NULL,
1529
+ step_id TEXT NOT NULL,
1530
+ direction TEXT NOT NULL CHECK(direction IN ('forward', 'rollback')),
1531
+ idempotency_key TEXT NOT NULL,
1532
+ request_digest TEXT NOT NULL,
1533
+ outcome TEXT NOT NULL CHECK(outcome IN ('accepted', 'no_change')),
1534
+ target_memory_id TEXT NOT NULL,
1535
+ requested_project_id TEXT NOT NULL,
1536
+ expected_memory_version INTEGER NOT NULL,
1537
+ expected_memory_revision TEXT NOT NULL,
1538
+ expected_project_revision TEXT,
1539
+ result_memory_version INTEGER NOT NULL,
1540
+ result_memory_revision TEXT NOT NULL,
1541
+ result_memory_digest TEXT NOT NULL,
1542
+ result_project_revision TEXT,
1543
+ result_project_digest TEXT,
1544
+ accepted_receipt_id TEXT,
1545
+ before_link_json TEXT NOT NULL,
1546
+ after_link_json TEXT NOT NULL,
1547
+ before_project_revision TEXT,
1548
+ before_project_digest TEXT,
1549
+ after_project_revision TEXT,
1550
+ after_project_digest TEXT,
1551
+ created_at TEXT NOT NULL,
1552
+ UNIQUE(authority_id, tenant_id, corpus_id, direction, idempotency_key)
1553
+ );
1554
+
1555
+ CREATE INDEX IF NOT EXISTS idx_mementos_memory_project_link_receipts_target
1556
+ ON mementos_memory_project_link_receipts(
1557
+ authority_id, tenant_id, corpus_id, target_memory_id, created_at
1558
+ );
1559
+
1560
+ CREATE TRIGGER IF NOT EXISTS mementos_memory_project_link_receipts_immutable_update
1561
+ BEFORE UPDATE ON mementos_memory_project_link_receipts
1562
+ BEGIN
1563
+ SELECT RAISE(ABORT, 'mementos memory project link receipts are immutable');
1564
+ END;
1565
+
1566
+ CREATE TRIGGER IF NOT EXISTS mementos_memory_project_link_receipts_immutable_delete
1567
+ BEFORE DELETE ON mementos_memory_project_link_receipts
1568
+ BEGIN
1569
+ SELECT RAISE(ABORT, 'mementos memory project link receipts are immutable');
1570
+ END;
1571
+ `;
1572
+ }
1573
+ function postgresMementosMemoryProjectLinkSchemaSql() {
1574
+ return `
1575
+ CREATE TABLE IF NOT EXISTS mementos_memory_project_link_receipts (
1576
+ receipt_id TEXT PRIMARY KEY,
1577
+ authority TEXT NOT NULL CHECK(authority = 'mementos'),
1578
+ route TEXT NOT NULL CHECK(route = 'mementos.memory-project-link.v1'),
1579
+ package_version TEXT NOT NULL,
1580
+ authority_id TEXT NOT NULL,
1581
+ tenant_id TEXT NOT NULL,
1582
+ corpus_id TEXT NOT NULL,
1583
+ operation_id TEXT NOT NULL,
1584
+ step_id TEXT NOT NULL,
1585
+ direction TEXT NOT NULL CHECK(direction IN ('forward', 'rollback')),
1586
+ idempotency_key TEXT NOT NULL,
1587
+ request_digest TEXT NOT NULL,
1588
+ outcome TEXT NOT NULL CHECK(outcome IN ('accepted', 'no_change')),
1589
+ target_memory_id TEXT NOT NULL,
1590
+ requested_project_id TEXT NOT NULL,
1591
+ expected_memory_version INTEGER NOT NULL,
1592
+ expected_memory_revision TEXT NOT NULL,
1593
+ expected_project_revision TEXT,
1594
+ result_memory_version INTEGER NOT NULL,
1595
+ result_memory_revision TEXT NOT NULL,
1596
+ result_memory_digest TEXT NOT NULL,
1597
+ result_project_revision TEXT,
1598
+ result_project_digest TEXT,
1599
+ accepted_receipt_id TEXT,
1600
+ before_link_json JSONB NOT NULL,
1601
+ after_link_json JSONB NOT NULL,
1602
+ before_project_revision TEXT,
1603
+ before_project_digest TEXT,
1604
+ after_project_revision TEXT,
1605
+ after_project_digest TEXT,
1606
+ created_at TIMESTAMPTZ NOT NULL,
1607
+ UNIQUE(authority_id, tenant_id, corpus_id, direction, idempotency_key)
1608
+ );
1609
+
1610
+ CREATE INDEX IF NOT EXISTS idx_mementos_memory_project_link_receipts_target
1611
+ ON mementos_memory_project_link_receipts(
1612
+ authority_id, tenant_id, corpus_id, target_memory_id, created_at
1613
+ );
1614
+
1615
+ CREATE OR REPLACE FUNCTION mementos_memory_project_link_receipts_immutable()
1616
+ RETURNS trigger
1617
+ LANGUAGE plpgsql
1618
+ AS $$
1619
+ BEGIN
1620
+ RAISE EXCEPTION 'mementos memory project link receipts are immutable';
1621
+ END;
1622
+ $$;
1623
+ DROP TRIGGER IF EXISTS mementos_memory_project_link_receipts_immutable
1624
+ ON mementos_memory_project_link_receipts;
1625
+ CREATE TRIGGER mementos_memory_project_link_receipts_immutable
1626
+ BEFORE UPDATE OR DELETE ON mementos_memory_project_link_receipts
1627
+ FOR EACH ROW EXECUTE FUNCTION mementos_memory_project_link_receipts_immutable();
1628
+ `;
1629
+ }
1630
+ var init_schema = () => {};
1631
+
1244
1632
  // src/db/migrations.ts
1245
1633
  var MEMORY_VERSION_SNAPSHOT_TRIGGER = `
1246
1634
  CREATE TRIGGER IF NOT EXISTS memories_version_snapshot
@@ -1261,6 +1649,7 @@ BEGIN
1261
1649
  END;
1262
1650
  `, MIGRATIONS;
1263
1651
  var init_migrations = __esm(() => {
1652
+ init_schema();
1264
1653
  MIGRATIONS = [
1265
1654
  `
1266
1655
  CREATE TABLE IF NOT EXISTS projects (
@@ -2161,6 +2550,51 @@ INSERT OR IGNORE INTO _migrations (id) VALUES (35);
2161
2550
  `
2162
2551
  ${MEMORY_VERSION_SNAPSHOT_TRIGGER}
2163
2552
  INSERT OR IGNORE INTO _migrations (id) VALUES (36);
2553
+ `,
2554
+ `
2555
+ DROP TRIGGER IF EXISTS audit_memory_insert;
2556
+ CREATE TRIGGER audit_memory_insert AFTER INSERT ON memories BEGIN
2557
+ INSERT INTO memory_audit_log (id, memory_id, memory_key, operation, agent_id, created_at)
2558
+ VALUES (hex(randomblob(4)), new.id, new.key, 'create', new.agent_id, datetime('now'));
2559
+ END;
2560
+
2561
+ DROP TRIGGER IF EXISTS audit_memory_update;
2562
+ CREATE TRIGGER audit_memory_update AFTER UPDATE ON memories BEGIN
2563
+ INSERT INTO memory_audit_log (id, memory_id, memory_key, operation, agent_id, changes, created_at)
2564
+ VALUES (hex(randomblob(4)), new.id, new.key, 'update', new.agent_id,
2565
+ json_object('version_from', old.version, 'version_to', new.version, 'importance_from', old.importance, 'importance_to', new.importance),
2566
+ datetime('now'));
2567
+ END;
2568
+
2569
+ DROP TRIGGER IF EXISTS audit_memory_delete;
2570
+ CREATE TRIGGER audit_memory_delete AFTER DELETE ON memories BEGIN
2571
+ INSERT INTO memory_audit_log (id, memory_id, memory_key, operation, agent_id, created_at)
2572
+ VALUES (hex(randomblob(4)), old.id, old.key, 'delete', old.agent_id, datetime('now'));
2573
+ END;
2574
+
2575
+ UPDATE memory_audit_log SET old_value_hash = NULL
2576
+ WHERE old_value_hash IS NOT NULL
2577
+ AND length(old_value_hash) = 32
2578
+ AND old_value_hash NOT GLOB '*[^0-9A-F]*';
2579
+
2580
+ UPDATE memory_audit_log SET new_value_hash = NULL
2581
+ WHERE new_value_hash IS NOT NULL
2582
+ AND length(new_value_hash) = 32
2583
+ AND new_value_hash NOT GLOB '*[^0-9A-F]*';
2584
+
2585
+ INSERT OR IGNORE INTO _migrations (id) VALUES (37);
2586
+ `,
2587
+ `
2588
+ ${sqliteMementosProjectRegistrationSchemaSql()}
2589
+ INSERT OR IGNORE INTO _migrations (id) VALUES (38);
2590
+ `,
2591
+ `
2592
+ ${sqliteMementosProjectGuardedUpdateSchemaSql()}
2593
+ INSERT OR IGNORE INTO _migrations (id) VALUES (39);
2594
+ `,
2595
+ `
2596
+ ${sqliteMementosMemoryProjectLinkSchemaSql()}
2597
+ INSERT OR IGNORE INTO _migrations (id) VALUES (40);
2164
2598
  `
2165
2599
  ];
2166
2600
  });
@@ -12284,6 +12718,7 @@ var init_retention = __esm(() => {
12284
12718
  // src/db/pg-migrations.ts
12285
12719
  var PG_MIGRATIONS;
12286
12720
  var init_pg_migrations = __esm(() => {
12721
+ init_schema();
12287
12722
  PG_MIGRATIONS = [
12288
12723
  `
12289
12724
  CREATE TABLE IF NOT EXISTS projects (
@@ -13016,6 +13451,47 @@ var init_pg_migrations = __esm(() => {
13016
13451
  EXECUTE FUNCTION snapshot_memory_version();
13017
13452
 
13018
13453
  INSERT INTO _migrations (id) VALUES (36) ON CONFLICT DO NOTHING;
13454
+ `,
13455
+ `
13456
+ CREATE OR REPLACE FUNCTION audit_memory_insert() RETURNS trigger AS $$
13457
+ BEGIN
13458
+ INSERT INTO memory_audit_log (id, memory_id, memory_key, operation, agent_id, new_value_hash, created_at)
13459
+ VALUES (gen_random_uuid()::text, NEW.id, NEW.key, 'create', NEW.agent_id, md5(COALESCE(NEW.value, '')), NOW());
13460
+ RETURN NEW;
13461
+ END;
13462
+ $$ LANGUAGE plpgsql;
13463
+
13464
+ CREATE OR REPLACE FUNCTION audit_memory_update() RETURNS trigger AS $$
13465
+ BEGIN
13466
+ INSERT INTO memory_audit_log (id, memory_id, memory_key, operation, agent_id, old_value_hash, new_value_hash, changes, created_at)
13467
+ VALUES (gen_random_uuid()::text, NEW.id, NEW.key, 'update', NEW.agent_id, md5(COALESCE(OLD.value, '')), md5(COALESCE(NEW.value, '')),
13468
+ json_build_object('version_from', OLD.version, 'version_to', NEW.version, 'importance_from', OLD.importance, 'importance_to', NEW.importance)::text,
13469
+ NOW());
13470
+ RETURN NEW;
13471
+ END;
13472
+ $$ LANGUAGE plpgsql;
13473
+
13474
+ CREATE OR REPLACE FUNCTION audit_memory_delete() RETURNS trigger AS $$
13475
+ BEGIN
13476
+ INSERT INTO memory_audit_log (id, memory_id, memory_key, operation, agent_id, old_value_hash, created_at)
13477
+ VALUES (gen_random_uuid()::text, OLD.id, OLD.key, 'delete', OLD.agent_id, md5(COALESCE(OLD.value, '')), NOW());
13478
+ RETURN OLD;
13479
+ END;
13480
+ $$ LANGUAGE plpgsql;
13481
+
13482
+ INSERT INTO _migrations (id) VALUES (37) ON CONFLICT DO NOTHING;
13483
+ `,
13484
+ `
13485
+ ${postgresMementosProjectRegistrationSchemaSql()}
13486
+ INSERT INTO _migrations (id) VALUES (38) ON CONFLICT DO NOTHING;
13487
+ `,
13488
+ `
13489
+ ${postgresMementosProjectGuardedUpdateSchemaSql()}
13490
+ INSERT INTO _migrations (id) VALUES (39) ON CONFLICT DO NOTHING;
13491
+ `,
13492
+ `
13493
+ ${postgresMementosMemoryProjectLinkSchemaSql()}
13494
+ INSERT INTO _migrations (id) VALUES (40) ON CONFLICT DO NOTHING;
13019
13495
  `
13020
13496
  ];
13021
13497
  });
@@ -55743,6 +56219,7 @@ init_types();
55743
56219
  init_database();
55744
56220
  init_api_mode();
55745
56221
  var CONFLICT_WINDOW_MS = 30 * 60 * 1000;
56222
+ var UNBOUNDED_AGENT_LIST_LIMIT = Number.MAX_SAFE_INTEGER;
55746
56223
  function parseAgentRow(row) {
55747
56224
  return {
55748
56225
  id: row["id"],
@@ -55834,13 +56311,46 @@ function getAgent(idOrName, db) {
55834
56311
  return parseAgentRow(rows[0]);
55835
56312
  return null;
55836
56313
  }
55837
- function listAgents(db) {
55838
- if (!db && isApiMode()) {
55839
- const { data } = apiJson("GET", "/agents");
56314
+ function normalizedAgentListFilter(filter) {
56315
+ const limit = Number.isFinite(filter.limit) ? Math.max(0, Math.floor(filter.limit)) : undefined;
56316
+ const offset = Number.isFinite(filter.offset) ? Math.max(0, Math.floor(filter.offset)) : undefined;
56317
+ return { limit, offset };
56318
+ }
56319
+ function isDatabaseAdapter(value) {
56320
+ return typeof value === "object" && value !== null && "query" in value && typeof value.query === "function";
56321
+ }
56322
+ function paginatedAgentQuery(baseSql, baseParams, filter) {
56323
+ const { limit, offset } = normalizedAgentListFilter(filter);
56324
+ let sql = `${baseSql} ORDER BY created_at ASC, id ASC`;
56325
+ const params = [...baseParams];
56326
+ if (limit !== undefined) {
56327
+ sql += " LIMIT ?";
56328
+ params.push(limit);
56329
+ } else if ((offset ?? 0) > 0) {
56330
+ sql += " LIMIT ?";
56331
+ params.push(UNBOUNDED_AGENT_LIST_LIMIT);
56332
+ }
56333
+ if ((offset ?? 0) > 0) {
56334
+ sql += " OFFSET ?";
56335
+ params.push(offset);
56336
+ }
56337
+ return { sql, params };
56338
+ }
56339
+ function listAgents(filterOrDb = {}, db) {
56340
+ const explicitDb = isDatabaseAdapter(filterOrDb) ? filterOrDb : db;
56341
+ const filter = isDatabaseAdapter(filterOrDb) ? {} : filterOrDb;
56342
+ const normalized = normalizedAgentListFilter(filter);
56343
+ if (!explicitDb && isApiMode()) {
56344
+ const q = toQuery({
56345
+ limit: normalized.limit,
56346
+ offset: normalized.offset
56347
+ });
56348
+ const { data } = apiJson("GET", `/agents${q}`);
55840
56349
  return data?.agents ?? [];
55841
56350
  }
55842
- const d = db || getDatabase();
55843
- const rows = d.query("SELECT * FROM agents ORDER BY last_seen_at DESC").all();
56351
+ const d = explicitDb || getDatabase();
56352
+ const { sql, params } = paginatedAgentQuery("SELECT * FROM agents", [], normalized);
56353
+ const rows = d.query(sql).all(...params);
55844
56354
  return rows.map(parseAgentRow);
55845
56355
  }
55846
56356
  function touchAgent(idOrName, db) {
@@ -55857,15 +56367,19 @@ function touchAgent(idOrName, db) {
55857
56367
  return;
55858
56368
  d.run("UPDATE agents SET last_seen_at = ? WHERE id = ?", [now(), agent.id]);
55859
56369
  }
55860
- function listAgentsByProject(projectId, db) {
55861
- if (!db && isApiMode()) {
55862
- const q = toQuery({ project_id: projectId });
56370
+ function listAgentsByProject(projectId, filterOrDb = {}, db) {
56371
+ const explicitDb = isDatabaseAdapter(filterOrDb) ? filterOrDb : db;
56372
+ const filter = isDatabaseAdapter(filterOrDb) ? {} : filterOrDb;
56373
+ const normalized = normalizedAgentListFilter(filter);
56374
+ if (!explicitDb && isApiMode()) {
56375
+ const q = toQuery({ project_id: projectId, ...normalized });
55863
56376
  const { data } = apiJson("GET", `/agents${q}`);
55864
56377
  return data?.agents ?? [];
55865
56378
  }
55866
- const d = db || getDatabase();
56379
+ const d = explicitDb || getDatabase();
55867
56380
  const resolvedId = resolvePartialId(d, "projects", projectId) || projectId;
55868
- const rows = d.query("SELECT * FROM agents WHERE active_project_id = ? ORDER BY last_seen_at DESC").all(resolvedId);
56381
+ const { sql, params } = paginatedAgentQuery("SELECT * FROM agents WHERE active_project_id = ?", [resolvedId], normalized);
56382
+ const rows = d.query(sql).all(...params);
55869
56383
  return rows.map(parseAgentRow);
55870
56384
  }
55871
56385
  function updateAgent(id, updates, db) {
@@ -0,0 +1,2 @@
1
+ export { MEMENTOS_MEMORY_PROJECT_LINK_ROUTE, MEMORY_PROJECT_LINK_RECEIPT_COLUMNS, postgresMementosMemoryProjectLinkSchemaSql, sqliteMementosMemoryProjectLinkSchemaSql, } from "./schema.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory-project-link/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,EAClC,mCAAmC,EACnC,0CAA0C,EAC1C,wCAAwC,GACzC,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const MEMENTOS_MEMORY_PROJECT_LINK_ROUTE: "mementos.memory-project-link.v1";
2
+ export declare const MEMORY_PROJECT_LINK_RECEIPT_COLUMNS: readonly ["receipt_id", "authority", "route", "package_version", "authority_id", "tenant_id", "corpus_id", "operation_id", "step_id", "direction", "idempotency_key", "request_digest", "outcome", "target_memory_id", "requested_project_id", "expected_memory_version", "expected_memory_revision", "expected_project_revision", "result_memory_version", "result_memory_revision", "result_memory_digest", "result_project_revision", "result_project_digest", "accepted_receipt_id", "before_link_json", "after_link_json", "before_project_revision", "before_project_digest", "after_project_revision", "after_project_digest", "created_at"];
3
+ export declare function sqliteMementosMemoryProjectLinkSchemaSql(): string;
4
+ export declare function postgresMementosMemoryProjectLinkSchemaSql(): string;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/memory-project-link/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kCAAkC,EAC7C,iCAA0C,CAAC;AAE7C,eAAO,MAAM,mCAAmC,qnBAgCtC,CAAC;AAEX,wBAAgB,wCAAwC,IAAI,MAAM,CAsDjE;AAED,wBAAgB,0CAA0C,IAAI,MAAM,CAwDnE"}
@@ -0,0 +1,39 @@
1
+ import type { DbAdapter } from "../storage.js";
2
+ import { type MementosProjectRegistrationAuthority, type MementosProjectRegistrationAuthorityOptions, type MementosProjectRegistrationCapability, type MementosProjectRegistrationDirection, type MementosProjectRegistrationInverseVerification, type MementosProjectRegistrationLookupRequest, type MementosProjectRegistrationLookupResult, type MementosProjectRegistrationPathHandle, type MementosProjectRegistrationReceipt, type MementosProjectRegistrationRecord, type MementosProjectRegistrationRequest } from "./types.js";
3
+ export declare function canonicalMementosProjectRegistrationJson(value: unknown): string;
4
+ export declare function digestMementosProjectRegistrationValue(value: unknown): string;
5
+ export declare function deriveMementosProjectRegistrationIdempotencyKey(input: {
6
+ operation_id: string;
7
+ step_id: string;
8
+ direction: MementosProjectRegistrationDirection;
9
+ target_selector: string;
10
+ request_digest: string;
11
+ precondition_digest: string;
12
+ }): string;
13
+ export declare class PackageOwnedMementosProjectRegistrationAuthority implements MementosProjectRegistrationAuthority {
14
+ private readonly db;
15
+ readonly authority: "mementos";
16
+ private readonly capabilityValue;
17
+ private readonly now;
18
+ private readonly faultInjector?;
19
+ constructor(db: DbAdapter, options?: MementosProjectRegistrationAuthorityOptions);
20
+ private fault;
21
+ private writeBoundary;
22
+ private terminal;
23
+ private duplicateForwardOrTerminal;
24
+ capability(): Promise<MementosProjectRegistrationCapability>;
25
+ create(request: MementosProjectRegistrationRequest): Promise<MementosProjectRegistrationReceipt>;
26
+ readExact(request: {
27
+ resource_kind: "project";
28
+ target_id: string;
29
+ target: MementosProjectRegistrationPathHandle;
30
+ response_byte_limit: number;
31
+ time_budget_ms: number;
32
+ }): Promise<MementosProjectRegistrationRecord>;
33
+ lookupReceipt(request: MementosProjectRegistrationLookupRequest): Promise<MementosProjectRegistrationLookupResult>;
34
+ compensate(request: MementosProjectRegistrationRequest): Promise<MementosProjectRegistrationReceipt>;
35
+ verifyInverse(request: MementosProjectRegistrationRequest): Promise<MementosProjectRegistrationInverseVerification>;
36
+ }
37
+ export declare function createMementosProjectRegistrationAuthority(db: DbAdapter, options?: MementosProjectRegistrationAuthorityOptions): MementosProjectRegistrationAuthority;
38
+ export declare const createLocalMementosProjectRegistrationAuthority: typeof createMementosProjectRegistrationAuthority;
39
+ //# sourceMappingURL=authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/project-registration/authority.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAS/C,OAAO,EAIL,KAAK,oCAAoC,EACzC,KAAK,2CAA2C,EAEhD,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EAEzC,KAAK,8CAA8C,EACnD,KAAK,wCAAwC,EAC7C,KAAK,uCAAuC,EAC5C,KAAK,qCAAqC,EAC1C,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACxC,MAAM,YAAY,CAAC;AA8CpB,wBAAgB,wCAAwC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE/E;AAaD,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI7E;AAMD,wBAAgB,+CAA+C,CAAC,KAAK,EAAE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oCAAoC,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAUT;AAqwBD,qBAAa,gDACb,YAAW,oCAAoC;IAO3C,OAAO,CAAC,QAAQ,CAAC,EAAE;IANrB,QAAQ,CAAC,SAAS,EAAG,UAAU,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAA+D;gBAG3E,EAAE,EAAE,SAAS,EAC9B,OAAO,GAAE,2CAAgD;IA0B3D,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,0BAA0B;IA6C5B,UAAU,IAAI,OAAO,CAAC,qCAAqC,CAAC;IAO5D,MAAM,CACV,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,kCAAkC,CAAC;IAkHxC,SAAS,CAAC,OAAO,EAAE;QACvB,aAAa,EAAE,SAAS,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,qCAAqC,CAAC;QAC9C,mBAAmB,EAAE,MAAM,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,iCAAiC,CAAC;IA2BxC,aAAa,CACjB,OAAO,EAAE,wCAAwC,GAChD,OAAO,CAAC,uCAAuC,CAAC;IAa7C,UAAU,CACd,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,kCAAkC,CAAC;IA4LxC,aAAa,CACjB,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,8CAA8C,CAAC;CAgD3D;AAED,wBAAgB,0CAA0C,CACxD,EAAE,EAAE,SAAS,EACb,OAAO,GAAE,2CAAgD,GACxD,oCAAoC,CAEtC;AAED,eAAO,MAAM,+CAA+C,mDAChB,CAAC"}