@askexenow/exe-os 0.9.102 → 0.9.104

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 (92) hide show
  1. package/dist/bin/agentic-ontology-backfill.js +334 -100
  2. package/dist/bin/agentic-reflection-backfill.js +328 -97
  3. package/dist/bin/agentic-semantic-label.js +328 -97
  4. package/dist/bin/backfill-conversations.js +332 -97
  5. package/dist/bin/backfill-responses.js +332 -97
  6. package/dist/bin/backfill-vectors.js +337 -106
  7. package/dist/bin/bulk-sync-postgres.js +335 -101
  8. package/dist/bin/cleanup-stale-review-tasks.js +356 -108
  9. package/dist/bin/cli.js +653 -405
  10. package/dist/bin/exe-agent.js +21 -3
  11. package/dist/bin/exe-assign.js +338 -94
  12. package/dist/bin/exe-boot.js +472 -239
  13. package/dist/bin/exe-call.js +22 -5
  14. package/dist/bin/exe-cloud.js +404 -158
  15. package/dist/bin/exe-dispatch.js +390 -142
  16. package/dist/bin/exe-doctor.js +349 -103
  17. package/dist/bin/exe-export-behaviors.js +351 -105
  18. package/dist/bin/exe-forget.js +352 -103
  19. package/dist/bin/exe-gateway.js +420 -172
  20. package/dist/bin/exe-heartbeat.js +361 -113
  21. package/dist/bin/exe-kill.js +344 -98
  22. package/dist/bin/exe-launch-agent.js +375 -129
  23. package/dist/bin/exe-new-employee.js +83 -67
  24. package/dist/bin/exe-pending-messages.js +356 -108
  25. package/dist/bin/exe-pending-notifications.js +358 -110
  26. package/dist/bin/exe-pending-reviews.js +359 -111
  27. package/dist/bin/exe-rename.js +354 -108
  28. package/dist/bin/exe-review.js +343 -97
  29. package/dist/bin/exe-search.js +363 -113
  30. package/dist/bin/exe-session-cleanup.js +403 -155
  31. package/dist/bin/exe-settings.js +14 -9
  32. package/dist/bin/exe-start-codex.js +365 -131
  33. package/dist/bin/exe-start-opencode.js +359 -125
  34. package/dist/bin/exe-status.js +356 -108
  35. package/dist/bin/exe-team.js +343 -97
  36. package/dist/bin/git-sweep.js +390 -142
  37. package/dist/bin/graph-backfill.js +334 -100
  38. package/dist/bin/graph-export.js +346 -100
  39. package/dist/bin/install.js +1 -0
  40. package/dist/bin/intercom-check.js +403 -155
  41. package/dist/bin/pre-publish.js +12 -0
  42. package/dist/bin/scan-tasks.js +393 -145
  43. package/dist/bin/setup.js +331 -159
  44. package/dist/bin/shard-migrate.js +328 -94
  45. package/dist/gateway/index.js +406 -158
  46. package/dist/hooks/bug-report-worker.js +396 -148
  47. package/dist/hooks/codex-stop-task-finalizer.js +374 -126
  48. package/dist/hooks/commit-complete.js +390 -142
  49. package/dist/hooks/error-recall.js +365 -115
  50. package/dist/hooks/ingest.js +357 -111
  51. package/dist/hooks/instructions-loaded.js +351 -105
  52. package/dist/hooks/notification.js +343 -97
  53. package/dist/hooks/post-compact.js +358 -110
  54. package/dist/hooks/post-tool-combined.js +384 -132
  55. package/dist/hooks/pre-compact.js +391 -143
  56. package/dist/hooks/pre-tool-use.js +362 -114
  57. package/dist/hooks/prompt-submit.js +422 -170
  58. package/dist/hooks/session-end.js +393 -145
  59. package/dist/hooks/session-start.js +390 -138
  60. package/dist/hooks/stop.js +361 -113
  61. package/dist/hooks/subagent-stop.js +354 -106
  62. package/dist/hooks/summary-worker.js +418 -185
  63. package/dist/index.js +400 -152
  64. package/dist/lib/cloud-sync.js +291 -131
  65. package/dist/lib/consolidation.js +8 -2
  66. package/dist/lib/database.js +233 -73
  67. package/dist/lib/db.js +233 -73
  68. package/dist/lib/device-registry.js +237 -77
  69. package/dist/lib/employee-templates.js +19 -1
  70. package/dist/lib/exe-daemon.js +705 -409
  71. package/dist/lib/hybrid-search.js +363 -113
  72. package/dist/lib/identity.js +9 -5
  73. package/dist/lib/messaging.js +26 -20
  74. package/dist/lib/reminders.js +5 -1
  75. package/dist/lib/schedules.js +320 -89
  76. package/dist/lib/skill-learning.js +28 -24
  77. package/dist/lib/store.js +342 -96
  78. package/dist/lib/tasks.js +82 -76
  79. package/dist/lib/tmux-routing.js +74 -68
  80. package/dist/lib/token-spend.js +5 -1
  81. package/dist/mcp/server.js +628 -355
  82. package/dist/mcp/tools/complete-reminder.js +5 -1
  83. package/dist/mcp/tools/create-reminder.js +5 -1
  84. package/dist/mcp/tools/create-task.js +89 -83
  85. package/dist/mcp/tools/deactivate-behavior.js +7 -3
  86. package/dist/mcp/tools/list-reminders.js +5 -1
  87. package/dist/mcp/tools/list-tasks.js +28 -21
  88. package/dist/mcp/tools/send-message.js +28 -22
  89. package/dist/mcp/tools/update-task.js +89 -83
  90. package/dist/runtime/index.js +390 -142
  91. package/dist/tui/App.js +437 -189
  92. package/package.json +1 -1
package/dist/lib/db.js CHANGED
@@ -635,8 +635,10 @@ var init_db_daemon_client = __esm({
635
635
  });
636
636
 
637
637
  // src/lib/database.ts
638
- import { chmodSync as chmodSync2 } from "fs";
638
+ import { chmodSync as chmodSync2, existsSync as existsSync6, statSync as statSync2, copyFileSync, unlinkSync as unlinkSync3, openSync as openSync2, closeSync as closeSync2, mkdirSync as mkdirSync2 } from "fs";
639
639
  import { createClient } from "@libsql/client";
640
+ import { homedir } from "os";
641
+ import { join } from "path";
640
642
 
641
643
  // src/lib/db-retry.ts
642
644
  var MAX_RETRIES = 5;
@@ -1301,13 +1303,84 @@ async function createPrismaDbAdapter(fallbackClient) {
1301
1303
  var EMBEDDING_DIM = 1024;
1302
1304
 
1303
1305
  // src/lib/database.ts
1306
+ var _debugDb = process.env.EXE_DEBUG === "1";
1307
+ function logCatchDebug(context, err) {
1308
+ if (_debugDb) {
1309
+ process.stderr.write(
1310
+ `[database] ${context}: ${err instanceof Error ? err.message : String(err)}
1311
+ `
1312
+ );
1313
+ }
1314
+ }
1304
1315
  var _client = null;
1305
1316
  var _resilientClient = null;
1306
1317
  var _walCheckpointTimer = null;
1307
1318
  var _daemonClient = null;
1308
1319
  var _adapterClient = null;
1320
+ var _lockFd = null;
1321
+ var DB_LOCK_PATH = join(homedir(), ".exe-os", "db.lock");
1322
+ function acquireDbLock() {
1323
+ mkdirSync2(join(homedir(), ".exe-os"), { recursive: true });
1324
+ try {
1325
+ _lockFd = openSync2(DB_LOCK_PATH, "wx");
1326
+ } catch (err) {
1327
+ if (err && typeof err === "object" && "code" in err && err.code === "EEXIST") {
1328
+ try {
1329
+ const lockStat = statSync2(DB_LOCK_PATH);
1330
+ if (Date.now() - lockStat.mtimeMs > 6e4) {
1331
+ unlinkSync3(DB_LOCK_PATH);
1332
+ _lockFd = openSync2(DB_LOCK_PATH, "wx");
1333
+ return;
1334
+ }
1335
+ } catch (e) {
1336
+ logCatchDebug("stale lock check", e);
1337
+ }
1338
+ process.stderr.write(
1339
+ "[database] WARN: Another process holds db.lock \u2014 waiting briefly then proceeding.\n"
1340
+ );
1341
+ return;
1342
+ }
1343
+ throw err;
1344
+ }
1345
+ }
1346
+ function releaseDbLock() {
1347
+ if (_lockFd !== null) {
1348
+ try {
1349
+ closeSync2(_lockFd);
1350
+ } catch (e) {
1351
+ logCatchDebug("lock close", e);
1352
+ }
1353
+ _lockFd = null;
1354
+ }
1355
+ try {
1356
+ unlinkSync3(DB_LOCK_PATH);
1357
+ } catch (e) {
1358
+ logCatchDebug("lock unlink", e);
1359
+ }
1360
+ }
1309
1361
  var initTurso = initDatabase;
1310
1362
  async function initDatabase(config) {
1363
+ acquireDbLock();
1364
+ if (existsSync6(config.dbPath)) {
1365
+ const dbStat = statSync2(config.dbPath);
1366
+ if (dbStat.size === 0) {
1367
+ const walPath = config.dbPath + "-wal";
1368
+ if (existsSync6(walPath) && statSync2(walPath).size > 0) {
1369
+ const backupPath = config.dbPath + ".zeroed-" + Date.now();
1370
+ copyFileSync(config.dbPath, backupPath);
1371
+ unlinkSync3(config.dbPath);
1372
+ process.stderr.write(
1373
+ `[database] CRITICAL: DB was 0 bytes. Moved to ${backupPath}, attempting WAL recovery.
1374
+ `
1375
+ );
1376
+ } else {
1377
+ process.stderr.write(
1378
+ `[database] CRITICAL: DB is 0 bytes and no WAL available for recovery. Data may be lost. Check backups at ${config.dbPath}.bak
1379
+ `
1380
+ );
1381
+ }
1382
+ }
1383
+ }
1311
1384
  if (_walCheckpointTimer) {
1312
1385
  clearInterval(_walCheckpointTimer);
1313
1386
  _walCheckpointTimer = null;
@@ -1334,10 +1407,8 @@ async function initDatabase(config) {
1334
1407
  _client = createClient(opts);
1335
1408
  _resilientClient = wrapWithRetry(_client);
1336
1409
  _adapterClient = _resilientClient;
1337
- _client.execute("PRAGMA busy_timeout = 30000").catch(() => {
1338
- });
1339
- _client.execute("PRAGMA journal_mode = WAL").catch(() => {
1340
- });
1410
+ await _client.execute("PRAGMA busy_timeout = 30000");
1411
+ await _client.execute("PRAGMA journal_mode = WAL");
1341
1412
  if (_walCheckpointTimer) clearInterval(_walCheckpointTimer);
1342
1413
  _walCheckpointTimer = setInterval(() => {
1343
1414
  _client?.execute("PRAGMA wal_checkpoint(PASSIVE)").catch(() => {
@@ -1352,11 +1423,16 @@ async function initDatabase(config) {
1352
1423
  for (const suffix of ["-wal", "-shm"]) {
1353
1424
  try {
1354
1425
  chmodSync2(config.dbPath + suffix, 384);
1355
- } catch {
1426
+ } catch (chmodErr) {
1427
+ process.stderr.write(`[database] chmod ${suffix} failed: ${chmodErr instanceof Error ? chmodErr.message : String(chmodErr)}
1428
+ `);
1356
1429
  }
1357
1430
  }
1358
- } catch {
1431
+ } catch (chmodErr) {
1432
+ process.stderr.write(`[database] chmod db failed: ${chmodErr instanceof Error ? chmodErr.message : String(chmodErr)}
1433
+ `);
1359
1434
  }
1435
+ releaseDbLock();
1360
1436
  }
1361
1437
  function isInitialized() {
1362
1438
  return _adapterClient !== null || _client !== null;
@@ -1412,7 +1488,8 @@ async function ensureSchema() {
1412
1488
  await client.execute("PRAGMA wal_autocheckpoint = 1000");
1413
1489
  try {
1414
1490
  await client.execute("PRAGMA libsql_vector_search_ef = 128");
1415
- } catch {
1491
+ } catch (e) {
1492
+ logCatchDebug("migration", e);
1416
1493
  }
1417
1494
  await client.executeMultiple(`
1418
1495
  CREATE TABLE IF NOT EXISTS memories (
@@ -1477,6 +1554,23 @@ async function ensureSchema() {
1477
1554
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1478
1555
  END;
1479
1556
  `);
1557
+ try {
1558
+ await client.execute("SELECT COUNT(*) FROM memories_fts LIMIT 1");
1559
+ } catch (ftsErr) {
1560
+ process.stderr.write(
1561
+ `[database] WARN: memories_fts corrupted (${ftsErr instanceof Error ? ftsErr.message : String(ftsErr)}) \u2014 rebuilding FTS index.
1562
+ `
1563
+ );
1564
+ try {
1565
+ await client.execute("INSERT INTO memories_fts(memories_fts) VALUES('rebuild')");
1566
+ process.stderr.write("[database] FTS index rebuilt successfully.\n");
1567
+ } catch (rebuildErr) {
1568
+ process.stderr.write(
1569
+ `[database] ERROR: FTS rebuild failed: ${rebuildErr instanceof Error ? rebuildErr.message : String(rebuildErr)}
1570
+ `
1571
+ );
1572
+ }
1573
+ }
1480
1574
  await client.executeMultiple(`
1481
1575
  CREATE TABLE IF NOT EXISTS sync_meta (
1482
1576
  key TEXT PRIMARY KEY,
@@ -1535,35 +1629,40 @@ async function ensureSchema() {
1535
1629
  });
1536
1630
  }
1537
1631
  }
1538
- } catch {
1632
+ } catch (seedErr) {
1633
+ logCatchDebug("behavior seed", seedErr);
1539
1634
  }
1540
1635
  try {
1541
1636
  await client.execute({
1542
1637
  sql: `ALTER TABLE behaviors ADD COLUMN priority TEXT DEFAULT 'p1'`,
1543
1638
  args: []
1544
1639
  });
1545
- } catch {
1640
+ } catch (e) {
1641
+ logCatchDebug("migration", e);
1546
1642
  }
1547
1643
  try {
1548
1644
  await client.execute({
1549
1645
  sql: `ALTER TABLE behaviors ADD COLUMN vector F32_BLOB(${EMBEDDING_DIM})`,
1550
1646
  args: []
1551
1647
  });
1552
- } catch {
1648
+ } catch (e) {
1649
+ logCatchDebug("migration", e);
1553
1650
  }
1554
1651
  try {
1555
1652
  await client.execute({
1556
1653
  sql: `ALTER TABLE tasks ADD COLUMN blocked_by TEXT`,
1557
1654
  args: []
1558
1655
  });
1559
- } catch {
1656
+ } catch (e) {
1657
+ logCatchDebug("migration", e);
1560
1658
  }
1561
1659
  try {
1562
1660
  await client.execute({
1563
1661
  sql: `ALTER TABLE tasks ADD COLUMN parent_task_id TEXT`,
1564
1662
  args: []
1565
1663
  });
1566
- } catch {
1664
+ } catch (e) {
1665
+ logCatchDebug("migration", e);
1567
1666
  }
1568
1667
  try {
1569
1668
  await client.execute({
@@ -1572,98 +1671,112 @@ async function ensureSchema() {
1572
1671
  WHERE parent_task_id IS NOT NULL`,
1573
1672
  args: []
1574
1673
  });
1575
- } catch {
1674
+ } catch (e) {
1675
+ logCatchDebug("migration", e);
1576
1676
  }
1577
1677
  try {
1578
1678
  await client.execute({
1579
1679
  sql: `UPDATE tasks SET status = 'done' WHERE status = 'completed'`,
1580
1680
  args: []
1581
1681
  });
1582
- } catch {
1682
+ } catch (e) {
1683
+ logCatchDebug("migration", e);
1583
1684
  }
1584
1685
  try {
1585
1686
  await client.execute({
1586
1687
  sql: `ALTER TABLE tasks ADD COLUMN reviewer TEXT`,
1587
1688
  args: []
1588
1689
  });
1589
- } catch {
1690
+ } catch (e) {
1691
+ logCatchDebug("migration", e);
1590
1692
  }
1591
1693
  try {
1592
1694
  await client.execute({
1593
1695
  sql: `ALTER TABLE tasks ADD COLUMN context TEXT`,
1594
1696
  args: []
1595
1697
  });
1596
- } catch {
1698
+ } catch (e) {
1699
+ logCatchDebug("migration", e);
1597
1700
  }
1598
1701
  try {
1599
1702
  await client.execute({
1600
1703
  sql: `ALTER TABLE tasks ADD COLUMN result TEXT`,
1601
1704
  args: []
1602
1705
  });
1603
- } catch {
1706
+ } catch (e) {
1707
+ logCatchDebug("migration", e);
1604
1708
  }
1605
1709
  try {
1606
1710
  await client.execute({
1607
1711
  sql: `ALTER TABLE tasks ADD COLUMN assigned_tmux TEXT`,
1608
1712
  args: []
1609
1713
  });
1610
- } catch {
1714
+ } catch (e) {
1715
+ logCatchDebug("migration", e);
1611
1716
  }
1612
1717
  try {
1613
1718
  await client.execute({
1614
1719
  sql: `ALTER TABLE tasks ADD COLUMN checkpoint TEXT`,
1615
1720
  args: []
1616
1721
  });
1617
- } catch {
1722
+ } catch (e) {
1723
+ logCatchDebug("migration", e);
1618
1724
  }
1619
1725
  try {
1620
1726
  await client.execute({
1621
1727
  sql: `ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER NOT NULL DEFAULT 0`,
1622
1728
  args: []
1623
1729
  });
1624
- } catch {
1730
+ } catch (e) {
1731
+ logCatchDebug("migration", e);
1625
1732
  }
1626
1733
  try {
1627
1734
  await client.execute({
1628
1735
  sql: `ALTER TABLE tasks ADD COLUMN complexity TEXT NOT NULL DEFAULT 'standard'`,
1629
1736
  args: []
1630
1737
  });
1631
- } catch {
1738
+ } catch (e) {
1739
+ logCatchDebug("migration", e);
1632
1740
  }
1633
1741
  try {
1634
1742
  await client.execute({
1635
1743
  sql: `ALTER TABLE tasks ADD COLUMN session_scope TEXT`,
1636
1744
  args: []
1637
1745
  });
1638
- } catch {
1746
+ } catch (e) {
1747
+ logCatchDebug("migration", e);
1639
1748
  }
1640
1749
  try {
1641
1750
  await client.execute({
1642
1751
  sql: `ALTER TABLE memories ADD COLUMN task_id TEXT`,
1643
1752
  args: []
1644
1753
  });
1645
- } catch {
1754
+ } catch (e) {
1755
+ logCatchDebug("migration", e);
1646
1756
  }
1647
1757
  try {
1648
1758
  await client.execute({
1649
1759
  sql: `ALTER TABLE memories ADD COLUMN consolidated INTEGER NOT NULL DEFAULT 0`,
1650
1760
  args: []
1651
1761
  });
1652
- } catch {
1762
+ } catch (e) {
1763
+ logCatchDebug("migration", e);
1653
1764
  }
1654
1765
  try {
1655
1766
  await client.execute({
1656
1767
  sql: `ALTER TABLE memories ADD COLUMN author_device_id TEXT`,
1657
1768
  args: []
1658
1769
  });
1659
- } catch {
1770
+ } catch (e) {
1771
+ logCatchDebug("migration", e);
1660
1772
  }
1661
1773
  try {
1662
1774
  await client.execute({
1663
1775
  sql: `ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'business'`,
1664
1776
  args: []
1665
1777
  });
1666
- } catch {
1778
+ } catch (e) {
1779
+ logCatchDebug("migration", e);
1667
1780
  }
1668
1781
  await client.executeMultiple(`
1669
1782
  CREATE TABLE IF NOT EXISTS consolidations (
@@ -1768,14 +1881,16 @@ async function ensureSchema() {
1768
1881
  sql: `ALTER TABLE notifications ADD COLUMN session_scope TEXT`,
1769
1882
  args: []
1770
1883
  });
1771
- } catch {
1884
+ } catch (e) {
1885
+ logCatchDebug("migration", e);
1772
1886
  }
1773
1887
  try {
1774
1888
  await client.execute({
1775
1889
  sql: `ALTER TABLE messages ADD COLUMN session_scope TEXT`,
1776
1890
  args: []
1777
1891
  });
1778
- } catch {
1892
+ } catch (e) {
1893
+ logCatchDebug("migration", e);
1779
1894
  }
1780
1895
  await client.executeMultiple(`
1781
1896
  CREATE INDEX IF NOT EXISTS idx_notifications_agent_scope_read
@@ -1801,7 +1916,8 @@ async function ensureSchema() {
1801
1916
  sql: `UPDATE tasks SET project_name = 'exe-os' WHERE project_name = 'worker'`,
1802
1917
  args: []
1803
1918
  });
1804
- } catch {
1919
+ } catch (e) {
1920
+ logCatchDebug("migration", e);
1805
1921
  }
1806
1922
  await client.executeMultiple(`
1807
1923
  CREATE TABLE IF NOT EXISTS trajectories (
@@ -1825,7 +1941,8 @@ async function ensureSchema() {
1825
1941
  `);
1826
1942
  try {
1827
1943
  await client.execute("ALTER TABLE trajectories ADD COLUMN skill_id TEXT");
1828
- } catch {
1944
+ } catch (e) {
1945
+ logCatchDebug("migration", e);
1829
1946
  }
1830
1947
  await client.executeMultiple(`
1831
1948
  CREATE TABLE IF NOT EXISTS consolidations (
@@ -1862,63 +1979,72 @@ async function ensureSchema() {
1862
1979
  sql: `ALTER TABLE memories ADD COLUMN consolidated INTEGER NOT NULL DEFAULT 0`,
1863
1980
  args: []
1864
1981
  });
1865
- } catch {
1982
+ } catch (e) {
1983
+ logCatchDebug("migration", e);
1866
1984
  }
1867
1985
  try {
1868
1986
  await client.execute({
1869
1987
  sql: `ALTER TABLE memories ADD COLUMN importance INTEGER DEFAULT 5`,
1870
1988
  args: []
1871
1989
  });
1872
- } catch {
1990
+ } catch (e) {
1991
+ logCatchDebug("migration", e);
1873
1992
  }
1874
1993
  try {
1875
1994
  await client.execute({
1876
1995
  sql: `ALTER TABLE memories ADD COLUMN status TEXT DEFAULT 'active'`,
1877
1996
  args: []
1878
1997
  });
1879
- } catch {
1998
+ } catch (e) {
1999
+ logCatchDebug("migration", e);
1880
2000
  }
1881
2001
  try {
1882
2002
  await client.execute({
1883
2003
  sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
1884
2004
  args: []
1885
2005
  });
1886
- } catch {
2006
+ } catch (e) {
2007
+ logCatchDebug("migration", e);
1887
2008
  }
1888
2009
  try {
1889
2010
  await client.execute({
1890
2011
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
1891
2012
  args: []
1892
2013
  });
1893
- } catch {
2014
+ } catch (e) {
2015
+ logCatchDebug("migration", e);
1894
2016
  }
1895
2017
  try {
1896
2018
  await client.execute({
1897
2019
  sql: `ALTER TABLE memories ADD COLUMN last_accessed TEXT`,
1898
2020
  args: []
1899
2021
  });
1900
- } catch {
2022
+ } catch (e) {
2023
+ logCatchDebug("migration", e);
1901
2024
  }
1902
2025
  try {
1903
2026
  await client.execute({
1904
2027
  sql: `UPDATE memories SET last_accessed = timestamp WHERE last_accessed IS NULL`,
1905
2028
  args: []
1906
2029
  });
1907
- } catch {
2030
+ } catch (e) {
2031
+ logCatchDebug("migration", e);
1908
2032
  }
1909
2033
  try {
1910
2034
  await client.execute({
1911
2035
  sql: `ALTER TABLE memories ADD COLUMN wiki_synced INTEGER DEFAULT 0`,
1912
2036
  args: []
1913
2037
  });
1914
- } catch {
2038
+ } catch (e) {
2039
+ logCatchDebug("migration", e);
1915
2040
  }
1916
2041
  try {
1917
2042
  await client.execute({
1918
2043
  sql: `ALTER TABLE memories ADD COLUMN graph_extracted INTEGER DEFAULT 0`,
1919
2044
  args: []
1920
2045
  });
1921
- } catch {
2046
+ } catch (e) {
2047
+ logCatchDebug("migration", e);
1922
2048
  }
1923
2049
  for (const col of [
1924
2050
  "ALTER TABLE memories ADD COLUMN content_hash TEXT",
@@ -1926,14 +2052,16 @@ async function ensureSchema() {
1926
2052
  ]) {
1927
2053
  try {
1928
2054
  await client.execute(col);
1929
- } catch {
2055
+ } catch (e) {
2056
+ logCatchDebug("migration", e);
1930
2057
  }
1931
2058
  }
1932
2059
  try {
1933
2060
  await client.execute(
1934
2061
  `CREATE INDEX IF NOT EXISTS idx_memories_content_hash ON memories(content_hash, agent_id)`
1935
2062
  );
1936
- } catch {
2063
+ } catch (e) {
2064
+ logCatchDebug("migration", e);
1937
2065
  }
1938
2066
  try {
1939
2067
  await client.execute(
@@ -1941,7 +2069,8 @@ async function ensureSchema() {
1941
2069
  ON memories(content_hash, agent_id, project_name, memory_type)
1942
2070
  WHERE content_hash IS NOT NULL`
1943
2071
  );
1944
- } catch {
2072
+ } catch (e) {
2073
+ logCatchDebug("migration", e);
1945
2074
  }
1946
2075
  await client.executeMultiple(`
1947
2076
  CREATE TABLE IF NOT EXISTS entities (
@@ -2017,7 +2146,8 @@ async function ensureSchema() {
2017
2146
  `);
2018
2147
  try {
2019
2148
  await client.execute("INSERT INTO entities_fts(entities_fts) VALUES('rebuild')");
2020
- } catch {
2149
+ } catch (e) {
2150
+ logCatchDebug("migration", e);
2021
2151
  }
2022
2152
  await client.executeMultiple(`
2023
2153
  CREATE TABLE IF NOT EXISTS entity_aliases (
@@ -2032,14 +2162,16 @@ async function ensureSchema() {
2032
2162
  ]) {
2033
2163
  try {
2034
2164
  await client.execute(col);
2035
- } catch {
2165
+ } catch (e) {
2166
+ logCatchDebug("migration", e);
2036
2167
  }
2037
2168
  }
2038
2169
  try {
2039
2170
  await client.execute(
2040
2171
  `CREATE INDEX IF NOT EXISTS idx_memories_status ON memories(status)`
2041
2172
  );
2042
- } catch {
2173
+ } catch (e) {
2174
+ logCatchDebug("migration", e);
2043
2175
  }
2044
2176
  await client.executeMultiple(`
2045
2177
  CREATE TABLE IF NOT EXISTS identity (
@@ -2138,7 +2270,8 @@ async function ensureSchema() {
2138
2270
  sql: `ALTER TABLE memories ADD COLUMN ${column}`,
2139
2271
  args: []
2140
2272
  });
2141
- } catch {
2273
+ } catch (e) {
2274
+ logCatchDebug("migration", e);
2142
2275
  }
2143
2276
  }
2144
2277
  for (const col of [
@@ -2147,7 +2280,8 @@ async function ensureSchema() {
2147
2280
  ]) {
2148
2281
  try {
2149
2282
  await client.execute(col);
2150
- } catch {
2283
+ } catch (e) {
2284
+ logCatchDebug("migration", e);
2151
2285
  }
2152
2286
  }
2153
2287
  await client.executeMultiple(`
@@ -2332,56 +2466,64 @@ async function ensureSchema() {
2332
2466
  args: []
2333
2467
  });
2334
2468
  }
2335
- } catch {
2469
+ } catch (e) {
2470
+ logCatchDebug("session_agent_map backfill", e);
2336
2471
  }
2337
2472
  try {
2338
2473
  await client.execute({
2339
2474
  sql: `ALTER TABLE session_agent_map ADD COLUMN cache_cold_count INTEGER NOT NULL DEFAULT 0`,
2340
2475
  args: []
2341
2476
  });
2342
- } catch {
2477
+ } catch (e) {
2478
+ logCatchDebug("migration", e);
2343
2479
  }
2344
2480
  try {
2345
2481
  await client.execute({
2346
2482
  sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
2347
2483
  args: []
2348
2484
  });
2349
- } catch {
2485
+ } catch (e) {
2486
+ logCatchDebug("migration", e);
2350
2487
  }
2351
2488
  try {
2352
2489
  await client.execute({
2353
2490
  sql: `ALTER TABLE tasks ADD COLUMN budget_fallback_model TEXT`,
2354
2491
  args: []
2355
2492
  });
2356
- } catch {
2493
+ } catch (e) {
2494
+ logCatchDebug("migration", e);
2357
2495
  }
2358
2496
  try {
2359
2497
  await client.execute({
2360
2498
  sql: `ALTER TABLE tasks ADD COLUMN tokens_used INTEGER DEFAULT 0`,
2361
2499
  args: []
2362
2500
  });
2363
- } catch {
2501
+ } catch (e) {
2502
+ logCatchDebug("migration", e);
2364
2503
  }
2365
2504
  try {
2366
2505
  await client.execute({
2367
2506
  sql: `ALTER TABLE tasks ADD COLUMN tokens_warned_at INTEGER`,
2368
2507
  args: []
2369
2508
  });
2370
- } catch {
2509
+ } catch (e) {
2510
+ logCatchDebug("migration", e);
2371
2511
  }
2372
2512
  try {
2373
2513
  await client.execute({
2374
2514
  sql: `ALTER TABLE tasks ADD COLUMN spawn_runtime TEXT`,
2375
2515
  args: []
2376
2516
  });
2377
- } catch {
2517
+ } catch (e) {
2518
+ logCatchDebug("migration", e);
2378
2519
  }
2379
2520
  try {
2380
2521
  await client.execute({
2381
2522
  sql: `ALTER TABLE tasks ADD COLUMN spawn_model TEXT`,
2382
2523
  args: []
2383
2524
  });
2384
- } catch {
2525
+ } catch (e) {
2526
+ logCatchDebug("migration", e);
2385
2527
  }
2386
2528
  await client.executeMultiple(`
2387
2529
  CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
@@ -2580,13 +2722,15 @@ async function ensureSchema() {
2580
2722
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
2581
2723
  args: []
2582
2724
  });
2583
- } catch {
2725
+ } catch (e) {
2726
+ logCatchDebug("migration", e);
2584
2727
  }
2585
2728
  try {
2586
2729
  await client.execute(
2587
2730
  `CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)`
2588
2731
  );
2589
- } catch {
2732
+ } catch (e) {
2733
+ logCatchDebug("migration", e);
2590
2734
  }
2591
2735
  try {
2592
2736
  await client.execute({
@@ -2597,20 +2741,23 @@ async function ensureSchema() {
2597
2741
  sql: `UPDATE memories SET tier = 2 WHERE tool_name IN ('store_memory', 'manual') AND importance >= 5 AND tier = 3`,
2598
2742
  args: []
2599
2743
  });
2600
- } catch {
2744
+ } catch (e) {
2745
+ logCatchDebug("migration", e);
2601
2746
  }
2602
2747
  try {
2603
2748
  await client.execute({
2604
2749
  sql: `ALTER TABLE memories ADD COLUMN supersedes_id TEXT`,
2605
2750
  args: []
2606
2751
  });
2607
- } catch {
2752
+ } catch (e) {
2753
+ logCatchDebug("migration", e);
2608
2754
  }
2609
2755
  try {
2610
2756
  await client.execute(
2611
2757
  `CREATE INDEX IF NOT EXISTS idx_memories_supersedes ON memories(supersedes_id) WHERE supersedes_id IS NOT NULL`
2612
2758
  );
2613
- } catch {
2759
+ } catch (e) {
2760
+ logCatchDebug("migration", e);
2614
2761
  }
2615
2762
  for (const col of [
2616
2763
  "ALTER TABLE tasks ADD COLUMN checkpoint TEXT",
@@ -2618,7 +2765,8 @@ async function ensureSchema() {
2618
2765
  ]) {
2619
2766
  try {
2620
2767
  await client.execute(col);
2621
- } catch {
2768
+ } catch (e) {
2769
+ logCatchDebug("migration", e);
2622
2770
  }
2623
2771
  }
2624
2772
  try {
@@ -2626,13 +2774,15 @@ async function ensureSchema() {
2626
2774
  sql: `ALTER TABLE memories ADD COLUMN draft INTEGER DEFAULT 0`,
2627
2775
  args: []
2628
2776
  });
2629
- } catch {
2777
+ } catch (e) {
2778
+ logCatchDebug("migration", e);
2630
2779
  }
2631
2780
  try {
2632
2781
  await client.execute(
2633
2782
  `CREATE INDEX IF NOT EXISTS idx_memories_draft ON memories(draft) WHERE draft = 1`
2634
2783
  );
2635
- } catch {
2784
+ } catch (e) {
2785
+ logCatchDebug("migration", e);
2636
2786
  }
2637
2787
  for (const col of [
2638
2788
  "ALTER TABLE memories ADD COLUMN valid_from TEXT",
@@ -2640,7 +2790,8 @@ async function ensureSchema() {
2640
2790
  ]) {
2641
2791
  try {
2642
2792
  await client.execute(col);
2643
- } catch {
2793
+ } catch (e) {
2794
+ logCatchDebug("migration", e);
2644
2795
  }
2645
2796
  }
2646
2797
  try {
@@ -2648,27 +2799,31 @@ async function ensureSchema() {
2648
2799
  sql: `UPDATE memories SET valid_from = timestamp WHERE valid_from IS NULL`,
2649
2800
  args: []
2650
2801
  });
2651
- } catch {
2802
+ } catch (e) {
2803
+ logCatchDebug("migration", e);
2652
2804
  }
2653
2805
  try {
2654
2806
  await client.execute({
2655
2807
  sql: `ALTER TABLE memories ADD COLUMN memory_type TEXT DEFAULT 'raw'`,
2656
2808
  args: []
2657
2809
  });
2658
- } catch {
2810
+ } catch (e) {
2811
+ logCatchDebug("migration", e);
2659
2812
  }
2660
2813
  try {
2661
2814
  await client.execute(
2662
2815
  `CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(memory_type)`
2663
2816
  );
2664
- } catch {
2817
+ } catch (e) {
2818
+ logCatchDebug("migration", e);
2665
2819
  }
2666
2820
  try {
2667
2821
  await client.execute({
2668
2822
  sql: `ALTER TABLE memories ADD COLUMN trajectory TEXT`,
2669
2823
  args: []
2670
2824
  });
2671
- } catch {
2825
+ } catch (e) {
2826
+ logCatchDebug("migration", e);
2672
2827
  }
2673
2828
  for (const col of [
2674
2829
  "ALTER TABLE memories ADD COLUMN intent TEXT",
@@ -2689,7 +2844,8 @@ async function ensureSchema() {
2689
2844
  ]) {
2690
2845
  try {
2691
2846
  await client.execute(col);
2692
- } catch {
2847
+ } catch (e) {
2848
+ logCatchDebug("migration", e);
2693
2849
  }
2694
2850
  }
2695
2851
  try {
@@ -2697,14 +2853,16 @@ async function ensureSchema() {
2697
2853
  sql: `ALTER TABLE memories ADD COLUMN procedure_for TEXT`,
2698
2854
  args: []
2699
2855
  });
2700
- } catch {
2856
+ } catch (e) {
2857
+ logCatchDebug("migration", e);
2701
2858
  }
2702
2859
  try {
2703
2860
  await client.execute({
2704
2861
  sql: `UPDATE tasks SET status = 'closed' WHERE status = 'done' AND result IS NOT NULL`,
2705
2862
  args: []
2706
2863
  });
2707
- } catch {
2864
+ } catch (e) {
2865
+ logCatchDebug("migration", e);
2708
2866
  }
2709
2867
  }
2710
2868
  var disposeTurso = disposeDatabase;
@@ -2716,7 +2874,8 @@ async function disposeDatabase() {
2716
2874
  if (_client) {
2717
2875
  try {
2718
2876
  await _client.execute("PRAGMA wal_checkpoint(PASSIVE)");
2719
- } catch {
2877
+ } catch (e) {
2878
+ logCatchDebug("WAL checkpoint", e);
2720
2879
  }
2721
2880
  }
2722
2881
  if (_daemonClient) {
@@ -2732,6 +2891,7 @@ async function disposeDatabase() {
2732
2891
  _client = null;
2733
2892
  _resilientClient = null;
2734
2893
  }
2894
+ releaseDbLock();
2735
2895
  }
2736
2896
  export {
2737
2897
  SOFT_DELETE_RETENTION_DAYS,