@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
@@ -1586,6 +1586,7 @@ var init_db_daemon_client = __esm({
1586
1586
  // src/lib/database.ts
1587
1587
  var database_exports = {};
1588
1588
  __export(database_exports, {
1589
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1589
1590
  disposeDatabase: () => disposeDatabase,
1590
1591
  disposeTurso: () => disposeTurso,
1591
1592
  ensureSchema: () => ensureSchema,
@@ -1742,10 +1743,17 @@ async function ensureSchema() {
1742
1743
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1743
1744
  END;
1744
1745
 
1745
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1746
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1747
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1746
1748
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1747
1749
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1748
1750
  END;
1751
+
1752
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1753
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1754
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1755
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1756
+ END;
1749
1757
  `);
1750
1758
  await client.executeMultiple(`
1751
1759
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2148,6 +2156,13 @@ async function ensureSchema() {
2148
2156
  });
2149
2157
  } catch {
2150
2158
  }
2159
+ try {
2160
+ await client.execute({
2161
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2162
+ args: []
2163
+ });
2164
+ } catch {
2165
+ }
2151
2166
  try {
2152
2167
  await client.execute({
2153
2168
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2684,7 +2699,7 @@ async function disposeDatabase() {
2684
2699
  _resilientClient = null;
2685
2700
  }
2686
2701
  }
2687
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2702
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2688
2703
  var init_database = __esm({
2689
2704
  "src/lib/database.ts"() {
2690
2705
  "use strict";
@@ -2698,6 +2713,7 @@ var init_database = __esm({
2698
2713
  _daemonClient = null;
2699
2714
  _adapterClient = null;
2700
2715
  initTurso = initDatabase;
2716
+ SOFT_DELETE_RETENTION_DAYS = 7;
2701
2717
  disposeTurso = disposeDatabase;
2702
2718
  }
2703
2719
  });
@@ -1586,6 +1586,7 @@ var init_db_daemon_client = __esm({
1586
1586
  // src/lib/database.ts
1587
1587
  var database_exports = {};
1588
1588
  __export(database_exports, {
1589
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1589
1590
  disposeDatabase: () => disposeDatabase,
1590
1591
  disposeTurso: () => disposeTurso,
1591
1592
  ensureSchema: () => ensureSchema,
@@ -1742,10 +1743,17 @@ async function ensureSchema() {
1742
1743
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1743
1744
  END;
1744
1745
 
1745
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1746
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1747
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1746
1748
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1747
1749
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1748
1750
  END;
1751
+
1752
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1753
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1754
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1755
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1756
+ END;
1749
1757
  `);
1750
1758
  await client.executeMultiple(`
1751
1759
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2148,6 +2156,13 @@ async function ensureSchema() {
2148
2156
  });
2149
2157
  } catch {
2150
2158
  }
2159
+ try {
2160
+ await client.execute({
2161
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2162
+ args: []
2163
+ });
2164
+ } catch {
2165
+ }
2151
2166
  try {
2152
2167
  await client.execute({
2153
2168
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2684,7 +2699,7 @@ async function disposeDatabase() {
2684
2699
  _resilientClient = null;
2685
2700
  }
2686
2701
  }
2687
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2702
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2688
2703
  var init_database = __esm({
2689
2704
  "src/lib/database.ts"() {
2690
2705
  "use strict";
@@ -2698,6 +2713,7 @@ var init_database = __esm({
2698
2713
  _daemonClient = null;
2699
2714
  _adapterClient = null;
2700
2715
  initTurso = initDatabase;
2716
+ SOFT_DELETE_RETENTION_DAYS = 7;
2701
2717
  disposeTurso = disposeDatabase;
2702
2718
  }
2703
2719
  });
@@ -1582,6 +1582,7 @@ var init_db_daemon_client = __esm({
1582
1582
  // src/lib/database.ts
1583
1583
  var database_exports = {};
1584
1584
  __export(database_exports, {
1585
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1585
1586
  disposeDatabase: () => disposeDatabase,
1586
1587
  disposeTurso: () => disposeTurso,
1587
1588
  ensureSchema: () => ensureSchema,
@@ -1738,10 +1739,17 @@ async function ensureSchema() {
1738
1739
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1739
1740
  END;
1740
1741
 
1741
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1742
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1743
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1742
1744
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1743
1745
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1744
1746
  END;
1747
+
1748
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1749
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1750
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1751
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1752
+ END;
1745
1753
  `);
1746
1754
  await client.executeMultiple(`
1747
1755
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2144,6 +2152,13 @@ async function ensureSchema() {
2144
2152
  });
2145
2153
  } catch {
2146
2154
  }
2155
+ try {
2156
+ await client.execute({
2157
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2158
+ args: []
2159
+ });
2160
+ } catch {
2161
+ }
2147
2162
  try {
2148
2163
  await client.execute({
2149
2164
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2680,7 +2695,7 @@ async function disposeDatabase() {
2680
2695
  _resilientClient = null;
2681
2696
  }
2682
2697
  }
2683
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2698
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2684
2699
  var init_database = __esm({
2685
2700
  "src/lib/database.ts"() {
2686
2701
  "use strict";
@@ -2694,6 +2709,7 @@ var init_database = __esm({
2694
2709
  _daemonClient = null;
2695
2710
  _adapterClient = null;
2696
2711
  initTurso = initDatabase;
2712
+ SOFT_DELETE_RETENTION_DAYS = 7;
2697
2713
  disposeTurso = disposeDatabase;
2698
2714
  }
2699
2715
  });
@@ -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
  });
package/dist/bin/cli.js CHANGED
@@ -3293,6 +3293,7 @@ var init_db_daemon_client = __esm({
3293
3293
  // src/lib/database.ts
3294
3294
  var database_exports = {};
3295
3295
  __export(database_exports, {
3296
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
3296
3297
  disposeDatabase: () => disposeDatabase,
3297
3298
  disposeTurso: () => disposeTurso,
3298
3299
  ensureSchema: () => ensureSchema,
@@ -3449,10 +3450,17 @@ async function ensureSchema() {
3449
3450
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
3450
3451
  END;
3451
3452
 
3452
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
3453
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
3454
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
3453
3455
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
3454
3456
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
3455
3457
  END;
3458
+
3459
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
3460
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
3461
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
3462
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
3463
+ END;
3456
3464
  `);
3457
3465
  await client.executeMultiple(`
3458
3466
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -3855,6 +3863,13 @@ async function ensureSchema() {
3855
3863
  });
3856
3864
  } catch {
3857
3865
  }
3866
+ try {
3867
+ await client.execute({
3868
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
3869
+ args: []
3870
+ });
3871
+ } catch {
3872
+ }
3858
3873
  try {
3859
3874
  await client.execute({
3860
3875
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -4391,7 +4406,7 @@ async function disposeDatabase() {
4391
4406
  _resilientClient = null;
4392
4407
  }
4393
4408
  }
4394
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
4409
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
4395
4410
  var init_database = __esm({
4396
4411
  "src/lib/database.ts"() {
4397
4412
  "use strict";
@@ -4405,6 +4420,7 @@ var init_database = __esm({
4405
4420
  _daemonClient = null;
4406
4421
  _adapterClient = null;
4407
4422
  initTurso = initDatabase;
4423
+ SOFT_DELETE_RETENTION_DAYS = 7;
4408
4424
  disposeTurso = disposeDatabase;
4409
4425
  }
4410
4426
  });
@@ -4749,8 +4765,8 @@ async function validateLicense(apiKey, deviceId) {
4749
4765
  }
4750
4766
  function getCacheAgeMs() {
4751
4767
  try {
4752
- const { statSync: statSync3 } = __require("fs");
4753
- const s = statSync3(CACHE_PATH);
4768
+ const { statSync: statSync4 } = __require("fs");
4769
+ const s = statSync4(CACHE_PATH);
4754
4770
  return Date.now() - s.mtimeMs;
4755
4771
  } catch {
4756
4772
  return Infinity;
@@ -5312,7 +5328,7 @@ __export(cloud_sync_exports, {
5312
5328
  pushToPostgres: () => pushToPostgres,
5313
5329
  recordRosterDeletion: () => recordRosterDeletion
5314
5330
  });
5315
- import { readFileSync as readFileSync10, writeFileSync as writeFileSync8, existsSync as existsSync14, readdirSync as readdirSync2, mkdirSync as mkdirSync7, appendFileSync, unlinkSync as unlinkSync5, openSync as openSync2, closeSync as closeSync2 } from "fs";
5331
+ import { readFileSync as readFileSync10, writeFileSync as writeFileSync8, existsSync as existsSync14, readdirSync as readdirSync2, mkdirSync as mkdirSync7, appendFileSync, unlinkSync as unlinkSync5, openSync as openSync2, closeSync as closeSync2, statSync as statSync3 } from "fs";
5316
5332
  import crypto4 from "crypto";
5317
5333
  import path14 from "path";
5318
5334
  import { homedir as homedir2 } from "os";
@@ -5802,10 +5818,9 @@ async function cloudSync(config) {
5802
5818
  const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
5803
5819
  try {
5804
5820
  const { getLatestBackup: getLatestBackup2 } = await Promise.resolve().then(() => (init_db_backup(), db_backup_exports));
5805
- const { statSync: statFile } = await import("fs");
5806
5821
  const latestBackup = getLatestBackup2();
5807
5822
  if (latestBackup) {
5808
- const backupSize = statFile(latestBackup).size;
5823
+ const backupSize = statSync3(latestBackup).size;
5809
5824
  const MAX_CLOUD_BACKUP_BYTES = 50 * 1024 * 1024;
5810
5825
  if (backupSize <= MAX_CLOUD_BACKUP_BYTES) {
5811
5826
  const backupData = readFileSync10(latestBackup);
@@ -11850,9 +11865,10 @@ async function updateTask(input) {
11850
11865
  args: [assignedAgent]
11851
11866
  });
11852
11867
  } else if (input.status === "cancelled") {
11868
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
11853
11869
  await draftClient.execute({
11854
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
11855
- args: [assignedAgent]
11870
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
11871
+ args: [now2, assignedAgent]
11856
11872
  });
11857
11873
  }
11858
11874
  } catch {
@@ -13341,6 +13357,19 @@ var init_messaging = __esm({
13341
13357
  }
13342
13358
  });
13343
13359
 
13360
+ // src/mcp/agent-context.ts
13361
+ import { AsyncLocalStorage } from "async_hooks";
13362
+ function getAgentContext() {
13363
+ return agentStore.getStore();
13364
+ }
13365
+ var agentStore;
13366
+ var init_agent_context = __esm({
13367
+ "src/mcp/agent-context.ts"() {
13368
+ "use strict";
13369
+ agentStore = new AsyncLocalStorage();
13370
+ }
13371
+ });
13372
+
13344
13373
  // src/lib/active-agent.ts
13345
13374
  var active_agent_exports = {};
13346
13375
  __export(active_agent_exports, {
@@ -13416,6 +13445,8 @@ function clearActiveAgent() {
13416
13445
  }
13417
13446
  }
13418
13447
  function getActiveAgent() {
13448
+ const httpCtx = getAgentContext();
13449
+ if (httpCtx) return httpCtx;
13419
13450
  try {
13420
13451
  const markerPath = getMarkerPath();
13421
13452
  const raw = readFileSync20(markerPath, "utf8");
@@ -13510,6 +13541,7 @@ var init_active_agent = __esm({
13510
13541
  "use strict";
13511
13542
  init_config();
13512
13543
  init_session_key();
13544
+ init_agent_context();
13513
13545
  init_employees();
13514
13546
  CACHE_DIR = path30.join(EXE_AI_DIR, "session-cache");
13515
13547
  STALE_MS = 24 * 60 * 60 * 1e3;
@@ -15196,8 +15228,8 @@ async function validateModel(log) {
15196
15228
  log("Skipping in-memory model validation (low memory \u2014 will validate on first use).");
15197
15229
  const modelPath = path34.join(MODELS_DIR, LOCAL_FILENAME);
15198
15230
  if (existsSync28(modelPath)) {
15199
- const { statSync: statSync3 } = await import("fs");
15200
- const size = statSync3(modelPath).size;
15231
+ const { statSync: statSync4 } = await import("fs");
15232
+ const size = statSync4(modelPath).size;
15201
15233
  if (size > 300 * 1e6) {
15202
15234
  log(`Model file verified (${(size / 1e6).toFixed(0)} MB).`);
15203
15235
  return;
@@ -1596,6 +1596,7 @@ var init_db_daemon_client = __esm({
1596
1596
  // src/lib/database.ts
1597
1597
  var database_exports = {};
1598
1598
  __export(database_exports, {
1599
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1599
1600
  disposeDatabase: () => disposeDatabase,
1600
1601
  disposeTurso: () => disposeTurso,
1601
1602
  ensureSchema: () => ensureSchema,
@@ -1752,10 +1753,17 @@ async function ensureSchema() {
1752
1753
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1753
1754
  END;
1754
1755
 
1755
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1756
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1757
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1756
1758
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1757
1759
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1758
1760
  END;
1761
+
1762
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1763
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1764
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1765
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1766
+ END;
1759
1767
  `);
1760
1768
  await client.executeMultiple(`
1761
1769
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2158,6 +2166,13 @@ async function ensureSchema() {
2158
2166
  });
2159
2167
  } catch {
2160
2168
  }
2169
+ try {
2170
+ await client.execute({
2171
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2172
+ args: []
2173
+ });
2174
+ } catch {
2175
+ }
2161
2176
  try {
2162
2177
  await client.execute({
2163
2178
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2694,7 +2709,7 @@ async function disposeDatabase() {
2694
2709
  _resilientClient = null;
2695
2710
  }
2696
2711
  }
2697
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2712
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2698
2713
  var init_database = __esm({
2699
2714
  "src/lib/database.ts"() {
2700
2715
  "use strict";
@@ -2708,6 +2723,7 @@ var init_database = __esm({
2708
2723
  _daemonClient = null;
2709
2724
  _adapterClient = null;
2710
2725
  initTurso = initDatabase;
2726
+ SOFT_DELETE_RETENTION_DAYS = 7;
2711
2727
  disposeTurso = disposeDatabase;
2712
2728
  }
2713
2729
  });
@@ -1738,6 +1738,7 @@ var init_db_daemon_client = __esm({
1738
1738
  // src/lib/database.ts
1739
1739
  var database_exports = {};
1740
1740
  __export(database_exports, {
1741
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1741
1742
  disposeDatabase: () => disposeDatabase,
1742
1743
  disposeTurso: () => disposeTurso,
1743
1744
  ensureSchema: () => ensureSchema,
@@ -1894,10 +1895,17 @@ async function ensureSchema() {
1894
1895
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1895
1896
  END;
1896
1897
 
1897
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1898
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1899
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1898
1900
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1899
1901
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1900
1902
  END;
1903
+
1904
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1905
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1906
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1907
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1908
+ END;
1901
1909
  `);
1902
1910
  await client.executeMultiple(`
1903
1911
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2300,6 +2308,13 @@ async function ensureSchema() {
2300
2308
  });
2301
2309
  } catch {
2302
2310
  }
2311
+ try {
2312
+ await client.execute({
2313
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2314
+ args: []
2315
+ });
2316
+ } catch {
2317
+ }
2303
2318
  try {
2304
2319
  await client.execute({
2305
2320
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2836,7 +2851,7 @@ async function disposeDatabase() {
2836
2851
  _resilientClient = null;
2837
2852
  }
2838
2853
  }
2839
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2854
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2840
2855
  var init_database = __esm({
2841
2856
  "src/lib/database.ts"() {
2842
2857
  "use strict";
@@ -2850,6 +2865,7 @@ var init_database = __esm({
2850
2865
  _daemonClient = null;
2851
2866
  _adapterClient = null;
2852
2867
  initTurso = initDatabase;
2868
+ SOFT_DELETE_RETENTION_DAYS = 7;
2853
2869
  disposeTurso = disposeDatabase;
2854
2870
  }
2855
2871
  });
@@ -4655,8 +4671,8 @@ async function validateLicense(apiKey, deviceId) {
4655
4671
  }
4656
4672
  function getCacheAgeMs() {
4657
4673
  try {
4658
- const { statSync: statSync3 } = __require("fs");
4659
- const s = statSync3(CACHE_PATH);
4674
+ const { statSync: statSync4 } = __require("fs");
4675
+ const s = statSync4(CACHE_PATH);
4660
4676
  return Date.now() - s.mtimeMs;
4661
4677
  } catch {
4662
4678
  return Infinity;
@@ -6890,9 +6906,10 @@ async function updateTask(input) {
6890
6906
  args: [assignedAgent]
6891
6907
  });
6892
6908
  } else if (input.status === "cancelled") {
6909
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
6893
6910
  await draftClient.execute({
6894
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
6895
- args: [assignedAgent]
6911
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
6912
+ args: [now2, assignedAgent]
6896
6913
  });
6897
6914
  }
6898
6915
  } catch {
@@ -8705,7 +8722,7 @@ __export(cloud_sync_exports, {
8705
8722
  pushToPostgres: () => pushToPostgres,
8706
8723
  recordRosterDeletion: () => recordRosterDeletion
8707
8724
  });
8708
- import { readFileSync as readFileSync15, writeFileSync as writeFileSync12, existsSync as existsSync20, readdirSync as readdirSync8, mkdirSync as mkdirSync12, appendFileSync as appendFileSync2, unlinkSync as unlinkSync11, openSync as openSync2, closeSync as closeSync2 } from "fs";
8725
+ import { readFileSync as readFileSync15, writeFileSync as writeFileSync12, existsSync as existsSync20, readdirSync as readdirSync8, mkdirSync as mkdirSync12, appendFileSync as appendFileSync2, unlinkSync as unlinkSync11, openSync as openSync2, closeSync as closeSync2, statSync as statSync3 } from "fs";
8709
8726
  import crypto8 from "crypto";
8710
8727
  import path24 from "path";
8711
8728
  import { homedir as homedir2 } from "os";
@@ -9195,10 +9212,9 @@ async function cloudSync(config) {
9195
9212
  const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
9196
9213
  try {
9197
9214
  const { getLatestBackup: getLatestBackup2 } = await Promise.resolve().then(() => (init_db_backup(), db_backup_exports));
9198
- const { statSync: statFile } = await import("fs");
9199
9215
  const latestBackup = getLatestBackup2();
9200
9216
  if (latestBackup) {
9201
- const backupSize = statFile(latestBackup).size;
9217
+ const backupSize = statSync3(latestBackup).size;
9202
9218
  const MAX_CLOUD_BACKUP_BYTES = 50 * 1024 * 1024;
9203
9219
  if (backupSize <= MAX_CLOUD_BACKUP_BYTES) {
9204
9220
  const backupData = readFileSync15(latestBackup);
@@ -10596,10 +10612,16 @@ init_notifications();
10596
10612
  // src/lib/active-agent.ts
10597
10613
  init_config();
10598
10614
  init_session_key();
10599
- init_employees();
10600
10615
  import { readFileSync as readFileSync13, writeFileSync as writeFileSync9, mkdirSync as mkdirSync8, unlinkSync as unlinkSync7, readdirSync as readdirSync5 } from "fs";
10601
10616
  import { execSync as execSync9 } from "child_process";
10602
10617
  import path20 from "path";
10618
+
10619
+ // src/mcp/agent-context.ts
10620
+ import { AsyncLocalStorage } from "async_hooks";
10621
+ var agentStore = new AsyncLocalStorage();
10622
+
10623
+ // src/lib/active-agent.ts
10624
+ init_employees();
10603
10625
  var CACHE_DIR = path20.join(EXE_AI_DIR, "session-cache");
10604
10626
  var STALE_MS = 24 * 60 * 60 * 1e3;
10605
10627
  function getMarkerPath() {
@@ -809,8 +809,8 @@ async function validateLicense(apiKey, deviceId) {
809
809
  }
810
810
  function getCacheAgeMs() {
811
811
  try {
812
- const { statSync } = __require("fs");
813
- const s = statSync(CACHE_PATH);
812
+ const { statSync: statSync2 } = __require("fs");
813
+ const s = statSync2(CACHE_PATH);
814
814
  return Date.now() - s.mtimeMs;
815
815
  } catch {
816
816
  return Infinity;
@@ -1064,7 +1064,7 @@ function isMainModule(importMetaUrl) {
1064
1064
 
1065
1065
  // src/lib/cloud-sync.ts
1066
1066
  init_database();
1067
- import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync7, readdirSync, mkdirSync as mkdirSync4, appendFileSync, unlinkSync as unlinkSync3, openSync, closeSync } from "fs";
1067
+ import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync7, readdirSync, mkdirSync as mkdirSync4, appendFileSync, unlinkSync as unlinkSync3, openSync, closeSync, statSync } from "fs";
1068
1068
  import crypto3 from "crypto";
1069
1069
  import path7 from "path";
1070
1070
  import { homedir as homedir2 } from "os";
@@ -2240,6 +2240,7 @@ var init_db_daemon_client = __esm({
2240
2240
  // src/lib/database.ts
2241
2241
  var database_exports = {};
2242
2242
  __export(database_exports, {
2243
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
2243
2244
  disposeDatabase: () => disposeDatabase,
2244
2245
  disposeTurso: () => disposeTurso,
2245
2246
  ensureSchema: () => ensureSchema,
@@ -2396,10 +2397,17 @@ async function ensureSchema() {
2396
2397
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2397
2398
  END;
2398
2399
 
2399
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2400
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2401
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2400
2402
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2401
2403
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2402
2404
  END;
2405
+
2406
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2407
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2408
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2409
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2410
+ END;
2403
2411
  `);
2404
2412
  await client.executeMultiple(`
2405
2413
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2802,6 +2810,13 @@ async function ensureSchema() {
2802
2810
  });
2803
2811
  } catch {
2804
2812
  }
2813
+ try {
2814
+ await client.execute({
2815
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2816
+ args: []
2817
+ });
2818
+ } catch {
2819
+ }
2805
2820
  try {
2806
2821
  await client.execute({
2807
2822
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3338,7 +3353,7 @@ async function disposeDatabase() {
3338
3353
  _resilientClient = null;
3339
3354
  }
3340
3355
  }
3341
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3356
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3342
3357
  var init_database = __esm({
3343
3358
  "src/lib/database.ts"() {
3344
3359
  "use strict";
@@ -3352,6 +3367,7 @@ var init_database = __esm({
3352
3367
  _daemonClient = null;
3353
3368
  _adapterClient = null;
3354
3369
  initTurso = initDatabase;
3370
+ SOFT_DELETE_RETENTION_DAYS = 7;
3355
3371
  disposeTurso = disposeDatabase;
3356
3372
  }
3357
3373
  });
@@ -5293,9 +5309,10 @@ async function updateTask(input) {
5293
5309
  args: [assignedAgent]
5294
5310
  });
5295
5311
  } else if (input.status === "cancelled") {
5312
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
5296
5313
  await draftClient.execute({
5297
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
5298
- args: [assignedAgent]
5314
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
5315
+ args: [now2, assignedAgent]
5299
5316
  });
5300
5317
  }
5301
5318
  } catch {