@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.
- package/dist/bin/agentic-ontology-backfill.js +334 -100
- package/dist/bin/agentic-reflection-backfill.js +328 -97
- package/dist/bin/agentic-semantic-label.js +328 -97
- package/dist/bin/backfill-conversations.js +332 -97
- package/dist/bin/backfill-responses.js +332 -97
- package/dist/bin/backfill-vectors.js +337 -106
- package/dist/bin/bulk-sync-postgres.js +335 -101
- package/dist/bin/cleanup-stale-review-tasks.js +356 -108
- package/dist/bin/cli.js +653 -405
- package/dist/bin/exe-agent.js +21 -3
- package/dist/bin/exe-assign.js +338 -94
- package/dist/bin/exe-boot.js +472 -239
- package/dist/bin/exe-call.js +22 -5
- package/dist/bin/exe-cloud.js +404 -158
- package/dist/bin/exe-dispatch.js +390 -142
- package/dist/bin/exe-doctor.js +349 -103
- package/dist/bin/exe-export-behaviors.js +351 -105
- package/dist/bin/exe-forget.js +352 -103
- package/dist/bin/exe-gateway.js +420 -172
- package/dist/bin/exe-heartbeat.js +361 -113
- package/dist/bin/exe-kill.js +344 -98
- package/dist/bin/exe-launch-agent.js +375 -129
- package/dist/bin/exe-new-employee.js +83 -67
- package/dist/bin/exe-pending-messages.js +356 -108
- package/dist/bin/exe-pending-notifications.js +358 -110
- package/dist/bin/exe-pending-reviews.js +359 -111
- package/dist/bin/exe-rename.js +354 -108
- package/dist/bin/exe-review.js +343 -97
- package/dist/bin/exe-search.js +363 -113
- package/dist/bin/exe-session-cleanup.js +403 -155
- package/dist/bin/exe-settings.js +14 -9
- package/dist/bin/exe-start-codex.js +365 -131
- package/dist/bin/exe-start-opencode.js +359 -125
- package/dist/bin/exe-status.js +356 -108
- package/dist/bin/exe-team.js +343 -97
- package/dist/bin/git-sweep.js +390 -142
- package/dist/bin/graph-backfill.js +334 -100
- package/dist/bin/graph-export.js +346 -100
- package/dist/bin/install.js +1 -0
- package/dist/bin/intercom-check.js +403 -155
- package/dist/bin/pre-publish.js +12 -0
- package/dist/bin/scan-tasks.js +393 -145
- package/dist/bin/setup.js +331 -159
- package/dist/bin/shard-migrate.js +328 -94
- package/dist/gateway/index.js +406 -158
- package/dist/hooks/bug-report-worker.js +396 -148
- package/dist/hooks/codex-stop-task-finalizer.js +374 -126
- package/dist/hooks/commit-complete.js +390 -142
- package/dist/hooks/error-recall.js +365 -115
- package/dist/hooks/ingest.js +357 -111
- package/dist/hooks/instructions-loaded.js +351 -105
- package/dist/hooks/notification.js +343 -97
- package/dist/hooks/post-compact.js +358 -110
- package/dist/hooks/post-tool-combined.js +384 -132
- package/dist/hooks/pre-compact.js +391 -143
- package/dist/hooks/pre-tool-use.js +362 -114
- package/dist/hooks/prompt-submit.js +422 -170
- package/dist/hooks/session-end.js +393 -145
- package/dist/hooks/session-start.js +390 -138
- package/dist/hooks/stop.js +361 -113
- package/dist/hooks/subagent-stop.js +354 -106
- package/dist/hooks/summary-worker.js +418 -185
- package/dist/index.js +400 -152
- package/dist/lib/cloud-sync.js +291 -131
- package/dist/lib/consolidation.js +8 -2
- package/dist/lib/database.js +233 -73
- package/dist/lib/db.js +233 -73
- package/dist/lib/device-registry.js +237 -77
- package/dist/lib/employee-templates.js +19 -1
- package/dist/lib/exe-daemon.js +705 -409
- package/dist/lib/hybrid-search.js +363 -113
- package/dist/lib/identity.js +9 -5
- package/dist/lib/messaging.js +26 -20
- package/dist/lib/reminders.js +5 -1
- package/dist/lib/schedules.js +320 -89
- package/dist/lib/skill-learning.js +28 -24
- package/dist/lib/store.js +342 -96
- package/dist/lib/tasks.js +82 -76
- package/dist/lib/tmux-routing.js +74 -68
- package/dist/lib/token-spend.js +5 -1
- package/dist/mcp/server.js +628 -355
- package/dist/mcp/tools/complete-reminder.js +5 -1
- package/dist/mcp/tools/create-reminder.js +5 -1
- package/dist/mcp/tools/create-task.js +89 -83
- package/dist/mcp/tools/deactivate-behavior.js +7 -3
- package/dist/mcp/tools/list-reminders.js +5 -1
- package/dist/mcp/tools/list-tasks.js +28 -21
- package/dist/mcp/tools/send-message.js +28 -22
- package/dist/mcp/tools/update-task.js +89 -83
- package/dist/runtime/index.js +390 -142
- package/dist/tui/App.js +437 -189
- 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")
|
|
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,
|