@askexenow/exe-os 0.9.32 → 0.9.34

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 (75) hide show
  1. package/dist/bin/backfill-conversations.js +18 -2
  2. package/dist/bin/backfill-responses.js +18 -2
  3. package/dist/bin/backfill-vectors.js +18 -2
  4. package/dist/bin/cleanup-stale-review-tasks.js +18 -2
  5. package/dist/bin/cli.js +43 -11
  6. package/dist/bin/exe-assign.js +18 -2
  7. package/dist/bin/exe-boot.js +32 -10
  8. package/dist/bin/exe-cloud.js +3 -3
  9. package/dist/bin/exe-dispatch.js +21 -4
  10. package/dist/bin/exe-doctor.js +45 -21
  11. package/dist/bin/exe-export-behaviors.js +18 -2
  12. package/dist/bin/exe-forget.js +27 -8
  13. package/dist/bin/exe-gateway.js +21 -4
  14. package/dist/bin/exe-heartbeat.js +18 -2
  15. package/dist/bin/exe-kill.js +18 -2
  16. package/dist/bin/exe-launch-agent.js +34 -2
  17. package/dist/bin/exe-link.js +20 -5
  18. package/dist/bin/exe-pending-messages.js +18 -2
  19. package/dist/bin/exe-pending-notifications.js +18 -2
  20. package/dist/bin/exe-pending-reviews.js +18 -2
  21. package/dist/bin/exe-rename.js +18 -2
  22. package/dist/bin/exe-review.js +18 -2
  23. package/dist/bin/exe-search.js +18 -2
  24. package/dist/bin/exe-session-cleanup.js +21 -4
  25. package/dist/bin/exe-settings.js +1 -1
  26. package/dist/bin/exe-start-codex.js +42 -7
  27. package/dist/bin/exe-start-opencode.js +34 -2
  28. package/dist/bin/exe-status.js +18 -2
  29. package/dist/bin/exe-team.js +18 -2
  30. package/dist/bin/git-sweep.js +21 -4
  31. package/dist/bin/graph-backfill.js +18 -2
  32. package/dist/bin/graph-export.js +18 -2
  33. package/dist/bin/intercom-check.js +21 -4
  34. package/dist/bin/scan-tasks.js +21 -4
  35. package/dist/bin/setup.js +24 -9
  36. package/dist/bin/shard-migrate.js +18 -2
  37. package/dist/gateway/index.js +21 -4
  38. package/dist/hooks/bug-report-worker.js +21 -4
  39. package/dist/hooks/codex-stop-task-finalizer.js +21 -4
  40. package/dist/hooks/commit-complete.js +21 -4
  41. package/dist/hooks/error-recall.js +27 -2
  42. package/dist/hooks/exe-heartbeat-hook.js +9 -0
  43. package/dist/hooks/ingest.js +27 -2
  44. package/dist/hooks/instructions-loaded.js +27 -2
  45. package/dist/hooks/notification.js +27 -2
  46. package/dist/hooks/post-compact.js +30 -3
  47. package/dist/hooks/post-tool-combined.js +34 -2
  48. package/dist/hooks/pre-compact.js +33 -5
  49. package/dist/hooks/pre-tool-use.js +30 -3
  50. package/dist/hooks/prompt-submit.js +33 -5
  51. package/dist/hooks/session-end.js +33 -5
  52. package/dist/hooks/session-start.js +34 -2
  53. package/dist/hooks/stop.js +30 -3
  54. package/dist/hooks/subagent-stop.js +30 -3
  55. package/dist/hooks/summary-worker.js +22 -7
  56. package/dist/index.js +21 -4
  57. package/dist/lib/cloud-sync.js +20 -5
  58. package/dist/lib/database.js +17 -1
  59. package/dist/lib/db.js +17 -1
  60. package/dist/lib/device-registry.js +18 -2
  61. package/dist/lib/exe-daemon.js +20243 -6717
  62. package/dist/lib/hybrid-search.js +18 -2
  63. package/dist/lib/schedules.js +18 -2
  64. package/dist/lib/store.js +18 -2
  65. package/dist/lib/tasks.js +3 -2
  66. package/dist/lib/tmux-routing.js +3 -2
  67. package/dist/mcp/server.js +213 -167
  68. package/dist/mcp/tools/create-task.js +15 -3
  69. package/dist/mcp/tools/deactivate-behavior.js +9 -0
  70. package/dist/mcp/tools/list-tasks.js +12 -1
  71. package/dist/mcp/tools/send-message.js +12 -1
  72. package/dist/mcp/tools/update-task.js +19 -2
  73. package/dist/runtime/index.js +21 -4
  74. package/dist/tui/App.js +21 -4
  75. package/package.json +1 -1
@@ -1671,6 +1671,7 @@ var init_db_daemon_client = __esm({
1671
1671
  // src/lib/database.ts
1672
1672
  var database_exports = {};
1673
1673
  __export(database_exports, {
1674
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1674
1675
  disposeDatabase: () => disposeDatabase,
1675
1676
  disposeTurso: () => disposeTurso,
1676
1677
  ensureSchema: () => ensureSchema,
@@ -1827,10 +1828,17 @@ async function ensureSchema() {
1827
1828
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1828
1829
  END;
1829
1830
 
1830
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1831
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1832
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1831
1833
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1832
1834
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1833
1835
  END;
1836
+
1837
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1838
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1839
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1840
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1841
+ END;
1834
1842
  `);
1835
1843
  await client.executeMultiple(`
1836
1844
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2233,6 +2241,13 @@ async function ensureSchema() {
2233
2241
  });
2234
2242
  } catch {
2235
2243
  }
2244
+ try {
2245
+ await client.execute({
2246
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2247
+ args: []
2248
+ });
2249
+ } catch {
2250
+ }
2236
2251
  try {
2237
2252
  await client.execute({
2238
2253
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2769,7 +2784,7 @@ async function disposeDatabase() {
2769
2784
  _resilientClient = null;
2770
2785
  }
2771
2786
  }
2772
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2787
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2773
2788
  var init_database = __esm({
2774
2789
  "src/lib/database.ts"() {
2775
2790
  "use strict";
@@ -2783,6 +2798,7 @@ var init_database = __esm({
2783
2798
  _daemonClient = null;
2784
2799
  _adapterClient = null;
2785
2800
  initTurso = initDatabase;
2801
+ SOFT_DELETE_RETENTION_DAYS = 7;
2786
2802
  disposeTurso = disposeDatabase;
2787
2803
  }
2788
2804
  });
@@ -1672,6 +1672,7 @@ var init_db_daemon_client = __esm({
1672
1672
  // src/lib/database.ts
1673
1673
  var database_exports = {};
1674
1674
  __export(database_exports, {
1675
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1675
1676
  disposeDatabase: () => disposeDatabase,
1676
1677
  disposeTurso: () => disposeTurso,
1677
1678
  ensureSchema: () => ensureSchema,
@@ -1828,10 +1829,17 @@ async function ensureSchema() {
1828
1829
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1829
1830
  END;
1830
1831
 
1831
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1832
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1833
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1832
1834
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1833
1835
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1834
1836
  END;
1837
+
1838
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1839
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1840
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1841
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1842
+ END;
1835
1843
  `);
1836
1844
  await client.executeMultiple(`
1837
1845
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2234,6 +2242,13 @@ async function ensureSchema() {
2234
2242
  });
2235
2243
  } catch {
2236
2244
  }
2245
+ try {
2246
+ await client.execute({
2247
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2248
+ args: []
2249
+ });
2250
+ } catch {
2251
+ }
2237
2252
  try {
2238
2253
  await client.execute({
2239
2254
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2770,7 +2785,7 @@ async function disposeDatabase() {
2770
2785
  _resilientClient = null;
2771
2786
  }
2772
2787
  }
2773
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2788
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2774
2789
  var init_database = __esm({
2775
2790
  "src/lib/database.ts"() {
2776
2791
  "use strict";
@@ -2784,6 +2799,7 @@ var init_database = __esm({
2784
2799
  _daemonClient = null;
2785
2800
  _adapterClient = null;
2786
2801
  initTurso = initDatabase;
2802
+ SOFT_DELETE_RETENTION_DAYS = 7;
2787
2803
  disposeTurso = disposeDatabase;
2788
2804
  }
2789
2805
  });
@@ -1672,6 +1672,7 @@ var init_db_daemon_client = __esm({
1672
1672
  // src/lib/database.ts
1673
1673
  var database_exports = {};
1674
1674
  __export(database_exports, {
1675
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1675
1676
  disposeDatabase: () => disposeDatabase,
1676
1677
  disposeTurso: () => disposeTurso,
1677
1678
  ensureSchema: () => ensureSchema,
@@ -1828,10 +1829,17 @@ async function ensureSchema() {
1828
1829
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1829
1830
  END;
1830
1831
 
1831
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1832
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1833
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1832
1834
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1833
1835
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1834
1836
  END;
1837
+
1838
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1839
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1840
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1841
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1842
+ END;
1835
1843
  `);
1836
1844
  await client.executeMultiple(`
1837
1845
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2234,6 +2242,13 @@ async function ensureSchema() {
2234
2242
  });
2235
2243
  } catch {
2236
2244
  }
2245
+ try {
2246
+ await client.execute({
2247
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2248
+ args: []
2249
+ });
2250
+ } catch {
2251
+ }
2237
2252
  try {
2238
2253
  await client.execute({
2239
2254
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2770,7 +2785,7 @@ async function disposeDatabase() {
2770
2785
  _resilientClient = null;
2771
2786
  }
2772
2787
  }
2773
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2788
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2774
2789
  var init_database = __esm({
2775
2790
  "src/lib/database.ts"() {
2776
2791
  "use strict";
@@ -2784,6 +2799,7 @@ var init_database = __esm({
2784
2799
  _daemonClient = null;
2785
2800
  _adapterClient = null;
2786
2801
  initTurso = initDatabase;
2802
+ SOFT_DELETE_RETENTION_DAYS = 7;
2787
2803
  disposeTurso = disposeDatabase;
2788
2804
  }
2789
2805
  });
@@ -1410,6 +1410,7 @@ var init_db_daemon_client = __esm({
1410
1410
  // src/lib/database.ts
1411
1411
  var database_exports = {};
1412
1412
  __export(database_exports, {
1413
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1413
1414
  disposeDatabase: () => disposeDatabase,
1414
1415
  disposeTurso: () => disposeTurso,
1415
1416
  ensureSchema: () => ensureSchema,
@@ -1566,10 +1567,17 @@ async function ensureSchema() {
1566
1567
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1567
1568
  END;
1568
1569
 
1569
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1570
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1571
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1570
1572
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1571
1573
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1572
1574
  END;
1575
+
1576
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1577
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1578
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1579
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1580
+ END;
1573
1581
  `);
1574
1582
  await client.executeMultiple(`
1575
1583
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -1972,6 +1980,13 @@ async function ensureSchema() {
1972
1980
  });
1973
1981
  } catch {
1974
1982
  }
1983
+ try {
1984
+ await client.execute({
1985
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
1986
+ args: []
1987
+ });
1988
+ } catch {
1989
+ }
1975
1990
  try {
1976
1991
  await client.execute({
1977
1992
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2508,7 +2523,7 @@ async function disposeDatabase() {
2508
2523
  _resilientClient = null;
2509
2524
  }
2510
2525
  }
2511
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2526
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2512
2527
  var init_database = __esm({
2513
2528
  "src/lib/database.ts"() {
2514
2529
  "use strict";
@@ -2522,6 +2537,7 @@ var init_database = __esm({
2522
2537
  _daemonClient = null;
2523
2538
  _adapterClient = null;
2524
2539
  initTurso = initDatabase;
2540
+ SOFT_DELETE_RETENTION_DAYS = 7;
2525
2541
  disposeTurso = disposeDatabase;
2526
2542
  }
2527
2543
  });
@@ -1675,6 +1675,7 @@ var init_db_daemon_client = __esm({
1675
1675
  // src/lib/database.ts
1676
1676
  var database_exports = {};
1677
1677
  __export(database_exports, {
1678
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1678
1679
  disposeDatabase: () => disposeDatabase,
1679
1680
  disposeTurso: () => disposeTurso,
1680
1681
  ensureSchema: () => ensureSchema,
@@ -1831,10 +1832,17 @@ async function ensureSchema() {
1831
1832
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1832
1833
  END;
1833
1834
 
1834
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1835
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1836
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1835
1837
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1836
1838
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1837
1839
  END;
1840
+
1841
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1842
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1843
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1844
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1845
+ END;
1838
1846
  `);
1839
1847
  await client.executeMultiple(`
1840
1848
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2237,6 +2245,13 @@ async function ensureSchema() {
2237
2245
  });
2238
2246
  } catch {
2239
2247
  }
2248
+ try {
2249
+ await client.execute({
2250
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2251
+ args: []
2252
+ });
2253
+ } catch {
2254
+ }
2240
2255
  try {
2241
2256
  await client.execute({
2242
2257
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2773,7 +2788,7 @@ async function disposeDatabase() {
2773
2788
  _resilientClient = null;
2774
2789
  }
2775
2790
  }
2776
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2791
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2777
2792
  var init_database = __esm({
2778
2793
  "src/lib/database.ts"() {
2779
2794
  "use strict";
@@ -2787,6 +2802,7 @@ var init_database = __esm({
2787
2802
  _daemonClient = null;
2788
2803
  _adapterClient = null;
2789
2804
  initTurso = initDatabase;
2805
+ SOFT_DELETE_RETENTION_DAYS = 7;
2790
2806
  disposeTurso = disposeDatabase;
2791
2807
  }
2792
2808
  });
@@ -1650,6 +1650,7 @@ var init_db_daemon_client = __esm({
1650
1650
  // src/lib/database.ts
1651
1651
  var database_exports = {};
1652
1652
  __export(database_exports, {
1653
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1653
1654
  disposeDatabase: () => disposeDatabase,
1654
1655
  disposeTurso: () => disposeTurso,
1655
1656
  ensureSchema: () => ensureSchema,
@@ -1806,10 +1807,17 @@ async function ensureSchema() {
1806
1807
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1807
1808
  END;
1808
1809
 
1809
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1810
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1811
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1810
1812
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1811
1813
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1812
1814
  END;
1815
+
1816
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1817
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1818
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1819
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1820
+ END;
1813
1821
  `);
1814
1822
  await client.executeMultiple(`
1815
1823
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2212,6 +2220,13 @@ async function ensureSchema() {
2212
2220
  });
2213
2221
  } catch {
2214
2222
  }
2223
+ try {
2224
+ await client.execute({
2225
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2226
+ args: []
2227
+ });
2228
+ } catch {
2229
+ }
2215
2230
  try {
2216
2231
  await client.execute({
2217
2232
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2748,7 +2763,7 @@ async function disposeDatabase() {
2748
2763
  _resilientClient = null;
2749
2764
  }
2750
2765
  }
2751
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2766
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2752
2767
  var init_database = __esm({
2753
2768
  "src/lib/database.ts"() {
2754
2769
  "use strict";
@@ -2762,6 +2777,7 @@ var init_database = __esm({
2762
2777
  _daemonClient = null;
2763
2778
  _adapterClient = null;
2764
2779
  initTurso = initDatabase;
2780
+ SOFT_DELETE_RETENTION_DAYS = 7;
2765
2781
  disposeTurso = disposeDatabase;
2766
2782
  }
2767
2783
  });
@@ -1694,6 +1694,7 @@ var init_db_daemon_client = __esm({
1694
1694
  // src/lib/database.ts
1695
1695
  var database_exports = {};
1696
1696
  __export(database_exports, {
1697
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1697
1698
  disposeDatabase: () => disposeDatabase,
1698
1699
  disposeTurso: () => disposeTurso,
1699
1700
  ensureSchema: () => ensureSchema,
@@ -1850,10 +1851,17 @@ async function ensureSchema() {
1850
1851
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1851
1852
  END;
1852
1853
 
1853
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1854
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1855
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1854
1856
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1855
1857
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1856
1858
  END;
1859
+
1860
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1861
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1862
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1863
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1864
+ END;
1857
1865
  `);
1858
1866
  await client.executeMultiple(`
1859
1867
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2256,6 +2264,13 @@ async function ensureSchema() {
2256
2264
  });
2257
2265
  } catch {
2258
2266
  }
2267
+ try {
2268
+ await client.execute({
2269
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2270
+ args: []
2271
+ });
2272
+ } catch {
2273
+ }
2259
2274
  try {
2260
2275
  await client.execute({
2261
2276
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2792,7 +2807,7 @@ async function disposeDatabase() {
2792
2807
  _resilientClient = null;
2793
2808
  }
2794
2809
  }
2795
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2810
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2796
2811
  var init_database = __esm({
2797
2812
  "src/lib/database.ts"() {
2798
2813
  "use strict";
@@ -2806,6 +2821,7 @@ var init_database = __esm({
2806
2821
  _daemonClient = null;
2807
2822
  _adapterClient = null;
2808
2823
  initTurso = initDatabase;
2824
+ SOFT_DELETE_RETENTION_DAYS = 7;
2809
2825
  disposeTurso = disposeDatabase;
2810
2826
  }
2811
2827
  });
@@ -6567,9 +6583,10 @@ async function updateTask(input) {
6567
6583
  args: [assignedAgent]
6568
6584
  });
6569
6585
  } else if (input.status === "cancelled") {
6586
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
6570
6587
  await draftClient.execute({
6571
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
6572
- args: [assignedAgent]
6588
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
6589
+ args: [now2, assignedAgent]
6573
6590
  });
6574
6591
  }
6575
6592
  } catch {
@@ -434,7 +434,7 @@ function isMainModule(importMetaUrl) {
434
434
 
435
435
  // src/lib/cloud-sync.ts
436
436
  init_database();
437
- import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6, readdirSync, mkdirSync as mkdirSync4, appendFileSync, unlinkSync as unlinkSync3, openSync, closeSync } from "fs";
437
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6, readdirSync, mkdirSync as mkdirSync4, appendFileSync, unlinkSync as unlinkSync3, openSync, closeSync, statSync } from "fs";
438
438
  import crypto2 from "crypto";
439
439
  import path6 from "path";
440
440
  import { homedir as homedir2 } from "os";
@@ -1468,6 +1468,7 @@ var init_db_daemon_client = __esm({
1468
1468
  // src/lib/database.ts
1469
1469
  var database_exports = {};
1470
1470
  __export(database_exports, {
1471
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1471
1472
  disposeDatabase: () => disposeDatabase,
1472
1473
  disposeTurso: () => disposeTurso,
1473
1474
  ensureSchema: () => ensureSchema,
@@ -1624,10 +1625,17 @@ async function ensureSchema() {
1624
1625
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1625
1626
  END;
1626
1627
 
1627
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1628
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1629
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1628
1630
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1629
1631
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1630
1632
  END;
1633
+
1634
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1635
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1636
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1637
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1638
+ END;
1631
1639
  `);
1632
1640
  await client.executeMultiple(`
1633
1641
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2030,6 +2038,13 @@ async function ensureSchema() {
2030
2038
  });
2031
2039
  } catch {
2032
2040
  }
2041
+ try {
2042
+ await client.execute({
2043
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2044
+ args: []
2045
+ });
2046
+ } catch {
2047
+ }
2033
2048
  try {
2034
2049
  await client.execute({
2035
2050
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2566,7 +2581,7 @@ async function disposeDatabase() {
2566
2581
  _resilientClient = null;
2567
2582
  }
2568
2583
  }
2569
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2584
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2570
2585
  var init_database = __esm({
2571
2586
  "src/lib/database.ts"() {
2572
2587
  "use strict";
@@ -2580,6 +2595,7 @@ var init_database = __esm({
2580
2595
  _daemonClient = null;
2581
2596
  _adapterClient = null;
2582
2597
  initTurso = initDatabase;
2598
+ SOFT_DELETE_RETENTION_DAYS = 7;
2583
2599
  disposeTurso = disposeDatabase;
2584
2600
  }
2585
2601
  });
@@ -3250,6 +3266,19 @@ var init_session_key = __esm({
3250
3266
  }
3251
3267
  });
3252
3268
 
3269
+ // src/mcp/agent-context.ts
3270
+ import { AsyncLocalStorage } from "async_hooks";
3271
+ function getAgentContext() {
3272
+ return agentStore.getStore();
3273
+ }
3274
+ var agentStore;
3275
+ var init_agent_context = __esm({
3276
+ "src/mcp/agent-context.ts"() {
3277
+ "use strict";
3278
+ agentStore = new AsyncLocalStorage();
3279
+ }
3280
+ });
3281
+
3253
3282
  // src/lib/active-agent.ts
3254
3283
  var active_agent_exports = {};
3255
3284
  __export(active_agent_exports, {
@@ -3325,6 +3354,8 @@ function clearActiveAgent() {
3325
3354
  }
3326
3355
  }
3327
3356
  function getActiveAgent() {
3357
+ const httpCtx = getAgentContext();
3358
+ if (httpCtx) return httpCtx;
3328
3359
  try {
3329
3360
  const markerPath = getMarkerPath();
3330
3361
  const raw = readFileSync5(markerPath, "utf8");
@@ -3419,6 +3450,7 @@ var init_active_agent = __esm({
3419
3450
  "use strict";
3420
3451
  init_config();
3421
3452
  init_session_key();
3453
+ init_agent_context();
3422
3454
  init_employees();
3423
3455
  CACHE_DIR = path9.join(EXE_AI_DIR, "session-cache");
3424
3456
  STALE_MS = 24 * 60 * 60 * 1e3;
@@ -4559,16 +4591,19 @@ MCP tools are available under the exe-os server. Call them directly by name:
4559
4591
  - get_task \u2014 read full task context
4560
4592
  - update_task \u2014 mark tasks in_progress or done
4561
4593
  - store_memory \u2014 persist findings for future sessions
4562
- - recall_my_memory \u2014 search your past work
4594
+ - recall_my_memory \u2014 search your past work (IMPORTANT: call this before starting any task)
4563
4595
  - ask_team_memory \u2014 query a colleague's knowledge
4564
4596
 
4597
+ CRITICAL \u2014 Memory retrieval is NOT automatic in this runtime.
4598
+ You MUST call recall_my_memory proactively:
4599
+ - Before starting any task: recall relevant past work, decisions, and patterns
4600
+ - When encountering an error: recall past solutions
4601
+ - When making architectural decisions: recall past ADRs and constraints
4602
+ Do NOT assume you remember \u2014 always check memory first.
4603
+
4565
4604
  On startup: call list_tasks to check for assigned work.
4566
4605
  When done with a task: call update_task with status "done" and a result summary.
4567
4606
  Always call store_memory to persist important decisions.
4568
-
4569
- \u26A0 FIRST RUN: If hooks haven't been approved yet, run /hooks in Codex and approve
4570
- all exe-os hooks before starting work. Without approved hooks, memory capture
4571
- and session tracking won't function.
4572
4607
  `;
4573
4608
  function resolveAgent(argv) {
4574
4609
  const invokedAs = path15.basename(argv[1] ?? "");
@@ -1457,6 +1457,7 @@ var init_db_daemon_client = __esm({
1457
1457
  // src/lib/database.ts
1458
1458
  var database_exports = {};
1459
1459
  __export(database_exports, {
1460
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1460
1461
  disposeDatabase: () => disposeDatabase,
1461
1462
  disposeTurso: () => disposeTurso,
1462
1463
  ensureSchema: () => ensureSchema,
@@ -1613,10 +1614,17 @@ async function ensureSchema() {
1613
1614
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1614
1615
  END;
1615
1616
 
1616
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1617
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1618
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1617
1619
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1618
1620
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1619
1621
  END;
1622
+
1623
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1624
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1625
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1626
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1627
+ END;
1620
1628
  `);
1621
1629
  await client.executeMultiple(`
1622
1630
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2019,6 +2027,13 @@ async function ensureSchema() {
2019
2027
  });
2020
2028
  } catch {
2021
2029
  }
2030
+ try {
2031
+ await client.execute({
2032
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2033
+ args: []
2034
+ });
2035
+ } catch {
2036
+ }
2022
2037
  try {
2023
2038
  await client.execute({
2024
2039
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2555,7 +2570,7 @@ async function disposeDatabase() {
2555
2570
  _resilientClient = null;
2556
2571
  }
2557
2572
  }
2558
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2573
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2559
2574
  var init_database = __esm({
2560
2575
  "src/lib/database.ts"() {
2561
2576
  "use strict";
@@ -2569,6 +2584,7 @@ var init_database = __esm({
2569
2584
  _daemonClient = null;
2570
2585
  _adapterClient = null;
2571
2586
  initTurso = initDatabase;
2587
+ SOFT_DELETE_RETENTION_DAYS = 7;
2572
2588
  disposeTurso = disposeDatabase;
2573
2589
  }
2574
2590
  });
@@ -3238,6 +3254,19 @@ var init_session_key = __esm({
3238
3254
  }
3239
3255
  });
3240
3256
 
3257
+ // src/mcp/agent-context.ts
3258
+ import { AsyncLocalStorage } from "async_hooks";
3259
+ function getAgentContext() {
3260
+ return agentStore.getStore();
3261
+ }
3262
+ var agentStore;
3263
+ var init_agent_context = __esm({
3264
+ "src/mcp/agent-context.ts"() {
3265
+ "use strict";
3266
+ agentStore = new AsyncLocalStorage();
3267
+ }
3268
+ });
3269
+
3241
3270
  // src/lib/active-agent.ts
3242
3271
  var active_agent_exports = {};
3243
3272
  __export(active_agent_exports, {
@@ -3313,6 +3342,8 @@ function clearActiveAgent() {
3313
3342
  }
3314
3343
  }
3315
3344
  function getActiveAgent() {
3345
+ const httpCtx = getAgentContext();
3346
+ if (httpCtx) return httpCtx;
3316
3347
  try {
3317
3348
  const markerPath = getMarkerPath();
3318
3349
  const raw = readFileSync5(markerPath, "utf8");
@@ -3407,6 +3438,7 @@ var init_active_agent = __esm({
3407
3438
  "use strict";
3408
3439
  init_config();
3409
3440
  init_session_key();
3441
+ init_agent_context();
3410
3442
  init_employees();
3411
3443
  CACHE_DIR = path9.join(EXE_AI_DIR, "session-cache");
3412
3444
  STALE_MS = 24 * 60 * 60 * 1e3;