@askexenow/exe-os 0.9.33 → 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 +21 -7
  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 +34 -2
  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 +189 -153
  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
@@ -1744,6 +1744,7 @@ var init_db_daemon_client = __esm({
1744
1744
  // src/lib/database.ts
1745
1745
  var database_exports = {};
1746
1746
  __export(database_exports, {
1747
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1747
1748
  disposeDatabase: () => disposeDatabase,
1748
1749
  disposeTurso: () => disposeTurso,
1749
1750
  ensureSchema: () => ensureSchema,
@@ -1900,10 +1901,17 @@ async function ensureSchema() {
1900
1901
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1901
1902
  END;
1902
1903
 
1903
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1904
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1905
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1904
1906
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1905
1907
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1906
1908
  END;
1909
+
1910
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1911
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1912
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1913
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1914
+ END;
1907
1915
  `);
1908
1916
  await client.executeMultiple(`
1909
1917
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2306,6 +2314,13 @@ async function ensureSchema() {
2306
2314
  });
2307
2315
  } catch {
2308
2316
  }
2317
+ try {
2318
+ await client.execute({
2319
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2320
+ args: []
2321
+ });
2322
+ } catch {
2323
+ }
2309
2324
  try {
2310
2325
  await client.execute({
2311
2326
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2842,7 +2857,7 @@ async function disposeDatabase() {
2842
2857
  _resilientClient = null;
2843
2858
  }
2844
2859
  }
2845
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2860
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2846
2861
  var init_database = __esm({
2847
2862
  "src/lib/database.ts"() {
2848
2863
  "use strict";
@@ -2856,6 +2871,7 @@ var init_database = __esm({
2856
2871
  _daemonClient = null;
2857
2872
  _adapterClient = null;
2858
2873
  initTurso = initDatabase;
2874
+ SOFT_DELETE_RETENTION_DAYS = 7;
2859
2875
  disposeTurso = disposeDatabase;
2860
2876
  }
2861
2877
  });
@@ -6047,9 +6063,10 @@ async function updateTask(input) {
6047
6063
  args: [assignedAgent]
6048
6064
  });
6049
6065
  } else if (input.status === "cancelled") {
6066
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
6050
6067
  await draftClient.execute({
6051
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
6052
- args: [assignedAgent]
6068
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
6069
+ args: [now2, assignedAgent]
6053
6070
  });
6054
6071
  }
6055
6072
  } catch {
@@ -2239,6 +2239,7 @@ var init_db_daemon_client = __esm({
2239
2239
  // src/lib/database.ts
2240
2240
  var database_exports = {};
2241
2241
  __export(database_exports, {
2242
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
2242
2243
  disposeDatabase: () => disposeDatabase,
2243
2244
  disposeTurso: () => disposeTurso,
2244
2245
  ensureSchema: () => ensureSchema,
@@ -2395,10 +2396,17 @@ async function ensureSchema() {
2395
2396
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2396
2397
  END;
2397
2398
 
2398
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2399
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2400
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2399
2401
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2400
2402
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2401
2403
  END;
2404
+
2405
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2406
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2407
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2408
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2409
+ END;
2402
2410
  `);
2403
2411
  await client.executeMultiple(`
2404
2412
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2801,6 +2809,13 @@ async function ensureSchema() {
2801
2809
  });
2802
2810
  } catch {
2803
2811
  }
2812
+ try {
2813
+ await client.execute({
2814
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2815
+ args: []
2816
+ });
2817
+ } catch {
2818
+ }
2804
2819
  try {
2805
2820
  await client.execute({
2806
2821
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3337,7 +3352,7 @@ async function disposeDatabase() {
3337
3352
  _resilientClient = null;
3338
3353
  }
3339
3354
  }
3340
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3355
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3341
3356
  var init_database = __esm({
3342
3357
  "src/lib/database.ts"() {
3343
3358
  "use strict";
@@ -3351,6 +3366,7 @@ var init_database = __esm({
3351
3366
  _daemonClient = null;
3352
3367
  _adapterClient = null;
3353
3368
  initTurso = initDatabase;
3369
+ SOFT_DELETE_RETENTION_DAYS = 7;
3354
3370
  disposeTurso = disposeDatabase;
3355
3371
  }
3356
3372
  });
@@ -5275,9 +5291,10 @@ async function updateTask(input) {
5275
5291
  args: [assignedAgent]
5276
5292
  });
5277
5293
  } else if (input.status === "cancelled") {
5294
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
5278
5295
  await draftClient.execute({
5279
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
5280
- args: [assignedAgent]
5296
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
5297
+ args: [now2, assignedAgent]
5281
5298
  });
5282
5299
  }
5283
5300
  } catch {
@@ -1652,6 +1652,7 @@ var init_db_daemon_client = __esm({
1652
1652
  // src/lib/database.ts
1653
1653
  var database_exports = {};
1654
1654
  __export(database_exports, {
1655
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1655
1656
  disposeDatabase: () => disposeDatabase,
1656
1657
  disposeTurso: () => disposeTurso,
1657
1658
  ensureSchema: () => ensureSchema,
@@ -1808,10 +1809,17 @@ async function ensureSchema() {
1808
1809
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1809
1810
  END;
1810
1811
 
1811
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1812
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1813
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1812
1814
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1813
1815
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1814
1816
  END;
1817
+
1818
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1819
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1820
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1821
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1822
+ END;
1815
1823
  `);
1816
1824
  await client.executeMultiple(`
1817
1825
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2214,6 +2222,13 @@ async function ensureSchema() {
2214
2222
  });
2215
2223
  } catch {
2216
2224
  }
2225
+ try {
2226
+ await client.execute({
2227
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2228
+ args: []
2229
+ });
2230
+ } catch {
2231
+ }
2217
2232
  try {
2218
2233
  await client.execute({
2219
2234
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2750,7 +2765,7 @@ async function disposeDatabase() {
2750
2765
  _resilientClient = null;
2751
2766
  }
2752
2767
  }
2753
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2768
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2754
2769
  var init_database = __esm({
2755
2770
  "src/lib/database.ts"() {
2756
2771
  "use strict";
@@ -2764,6 +2779,7 @@ var init_database = __esm({
2764
2779
  _daemonClient = null;
2765
2780
  _adapterClient = null;
2766
2781
  initTurso = initDatabase;
2782
+ SOFT_DELETE_RETENTION_DAYS = 7;
2767
2783
  disposeTurso = disposeDatabase;
2768
2784
  }
2769
2785
  });
@@ -6094,6 +6110,13 @@ function getSessionKey() {
6094
6110
  return _cached2;
6095
6111
  }
6096
6112
 
6113
+ // src/mcp/agent-context.ts
6114
+ import { AsyncLocalStorage } from "async_hooks";
6115
+ var agentStore = new AsyncLocalStorage();
6116
+ function getAgentContext() {
6117
+ return agentStore.getStore();
6118
+ }
6119
+
6097
6120
  // src/lib/active-agent.ts
6098
6121
  init_employees();
6099
6122
  var CACHE_DIR = path11.join(EXE_AI_DIR, "session-cache");
@@ -6144,6 +6167,8 @@ function getMarkerPath() {
6144
6167
  return path11.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
6145
6168
  }
6146
6169
  function getActiveAgent() {
6170
+ const httpCtx = getAgentContext();
6171
+ if (httpCtx) return httpCtx;
6147
6172
  try {
6148
6173
  const markerPath = getMarkerPath();
6149
6174
  const raw = readFileSync6(markerPath, "utf8");
@@ -177,6 +177,13 @@ function getSessionKey() {
177
177
  return _cached;
178
178
  }
179
179
 
180
+ // src/mcp/agent-context.ts
181
+ import { AsyncLocalStorage } from "async_hooks";
182
+ var agentStore = new AsyncLocalStorage();
183
+ function getAgentContext() {
184
+ return agentStore.getStore();
185
+ }
186
+
180
187
  // src/lib/employees.ts
181
188
  init_config();
182
189
  import { readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
@@ -268,6 +275,8 @@ function getMarkerPath() {
268
275
  return path3.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
269
276
  }
270
277
  function getActiveAgent() {
278
+ const httpCtx = getAgentContext();
279
+ if (httpCtx) return httpCtx;
271
280
  try {
272
281
  const markerPath = getMarkerPath();
273
282
  const raw = readFileSync3(markerPath, "utf8");
@@ -1828,6 +1828,7 @@ var init_db_daemon_client = __esm({
1828
1828
  // src/lib/database.ts
1829
1829
  var database_exports = {};
1830
1830
  __export(database_exports, {
1831
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1831
1832
  disposeDatabase: () => disposeDatabase,
1832
1833
  disposeTurso: () => disposeTurso,
1833
1834
  ensureSchema: () => ensureSchema,
@@ -1984,10 +1985,17 @@ async function ensureSchema() {
1984
1985
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1985
1986
  END;
1986
1987
 
1987
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1988
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1989
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1988
1990
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1989
1991
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1990
1992
  END;
1993
+
1994
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1995
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1996
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1997
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1998
+ END;
1991
1999
  `);
1992
2000
  await client.executeMultiple(`
1993
2001
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2390,6 +2398,13 @@ async function ensureSchema() {
2390
2398
  });
2391
2399
  } catch {
2392
2400
  }
2401
+ try {
2402
+ await client.execute({
2403
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2404
+ args: []
2405
+ });
2406
+ } catch {
2407
+ }
2393
2408
  try {
2394
2409
  await client.execute({
2395
2410
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2926,7 +2941,7 @@ async function disposeDatabase() {
2926
2941
  _resilientClient = null;
2927
2942
  }
2928
2943
  }
2929
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2944
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2930
2945
  var init_database = __esm({
2931
2946
  "src/lib/database.ts"() {
2932
2947
  "use strict";
@@ -2940,6 +2955,7 @@ var init_database = __esm({
2940
2955
  _daemonClient = null;
2941
2956
  _adapterClient = null;
2942
2957
  initTurso = initDatabase;
2958
+ SOFT_DELETE_RETENTION_DAYS = 7;
2943
2959
  disposeTurso = disposeDatabase;
2944
2960
  }
2945
2961
  });
@@ -4788,6 +4804,13 @@ function getSessionKey() {
4788
4804
  return _cached;
4789
4805
  }
4790
4806
 
4807
+ // src/mcp/agent-context.ts
4808
+ import { AsyncLocalStorage } from "async_hooks";
4809
+ var agentStore = new AsyncLocalStorage();
4810
+ function getAgentContext() {
4811
+ return agentStore.getStore();
4812
+ }
4813
+
4791
4814
  // src/lib/active-agent.ts
4792
4815
  init_employees();
4793
4816
  var CACHE_DIR = path4.join(EXE_AI_DIR, "session-cache");
@@ -4838,6 +4861,8 @@ function getMarkerPath() {
4838
4861
  return path4.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
4839
4862
  }
4840
4863
  function getActiveAgent() {
4864
+ const httpCtx = getAgentContext();
4865
+ if (httpCtx) return httpCtx;
4841
4866
  try {
4842
4867
  const markerPath = getMarkerPath();
4843
4868
  const raw = readFileSync4(markerPath, "utf8");
@@ -1663,6 +1663,7 @@ var init_db_daemon_client = __esm({
1663
1663
  // src/lib/database.ts
1664
1664
  var database_exports = {};
1665
1665
  __export(database_exports, {
1666
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1666
1667
  disposeDatabase: () => disposeDatabase,
1667
1668
  disposeTurso: () => disposeTurso,
1668
1669
  ensureSchema: () => ensureSchema,
@@ -1819,10 +1820,17 @@ async function ensureSchema() {
1819
1820
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1820
1821
  END;
1821
1822
 
1822
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1823
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1824
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1823
1825
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1824
1826
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1825
1827
  END;
1828
+
1829
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1830
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1831
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1832
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1833
+ END;
1826
1834
  `);
1827
1835
  await client.executeMultiple(`
1828
1836
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2225,6 +2233,13 @@ async function ensureSchema() {
2225
2233
  });
2226
2234
  } catch {
2227
2235
  }
2236
+ try {
2237
+ await client.execute({
2238
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2239
+ args: []
2240
+ });
2241
+ } catch {
2242
+ }
2228
2243
  try {
2229
2244
  await client.execute({
2230
2245
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2761,7 +2776,7 @@ async function disposeDatabase() {
2761
2776
  _resilientClient = null;
2762
2777
  }
2763
2778
  }
2764
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2779
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2765
2780
  var init_database = __esm({
2766
2781
  "src/lib/database.ts"() {
2767
2782
  "use strict";
@@ -2775,6 +2790,7 @@ var init_database = __esm({
2775
2790
  _daemonClient = null;
2776
2791
  _adapterClient = null;
2777
2792
  initTurso = initDatabase;
2793
+ SOFT_DELETE_RETENTION_DAYS = 7;
2778
2794
  disposeTurso = disposeDatabase;
2779
2795
  }
2780
2796
  });
@@ -4331,6 +4347,13 @@ function getSessionKey() {
4331
4347
  return _cached;
4332
4348
  }
4333
4349
 
4350
+ // src/mcp/agent-context.ts
4351
+ import { AsyncLocalStorage } from "async_hooks";
4352
+ var agentStore = new AsyncLocalStorage();
4353
+ function getAgentContext() {
4354
+ return agentStore.getStore();
4355
+ }
4356
+
4334
4357
  // src/lib/active-agent.ts
4335
4358
  init_employees();
4336
4359
  var CACHE_DIR = path3.join(EXE_AI_DIR, "session-cache");
@@ -4381,6 +4404,8 @@ function getMarkerPath() {
4381
4404
  return path3.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
4382
4405
  }
4383
4406
  function getActiveAgent() {
4407
+ const httpCtx = getAgentContext();
4408
+ if (httpCtx) return httpCtx;
4384
4409
  try {
4385
4410
  const markerPath = getMarkerPath();
4386
4411
  const raw = readFileSync3(markerPath, "utf8");
@@ -1663,6 +1663,7 @@ var init_db_daemon_client = __esm({
1663
1663
  // src/lib/database.ts
1664
1664
  var database_exports = {};
1665
1665
  __export(database_exports, {
1666
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1666
1667
  disposeDatabase: () => disposeDatabase,
1667
1668
  disposeTurso: () => disposeTurso,
1668
1669
  ensureSchema: () => ensureSchema,
@@ -1819,10 +1820,17 @@ async function ensureSchema() {
1819
1820
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1820
1821
  END;
1821
1822
 
1822
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1823
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1824
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1823
1825
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1824
1826
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1825
1827
  END;
1828
+
1829
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1830
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1831
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1832
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1833
+ END;
1826
1834
  `);
1827
1835
  await client.executeMultiple(`
1828
1836
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2225,6 +2233,13 @@ async function ensureSchema() {
2225
2233
  });
2226
2234
  } catch {
2227
2235
  }
2236
+ try {
2237
+ await client.execute({
2238
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2239
+ args: []
2240
+ });
2241
+ } catch {
2242
+ }
2228
2243
  try {
2229
2244
  await client.execute({
2230
2245
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2761,7 +2776,7 @@ async function disposeDatabase() {
2761
2776
  _resilientClient = null;
2762
2777
  }
2763
2778
  }
2764
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2779
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2765
2780
  var init_database = __esm({
2766
2781
  "src/lib/database.ts"() {
2767
2782
  "use strict";
@@ -2775,6 +2790,7 @@ var init_database = __esm({
2775
2790
  _daemonClient = null;
2776
2791
  _adapterClient = null;
2777
2792
  initTurso = initDatabase;
2793
+ SOFT_DELETE_RETENTION_DAYS = 7;
2778
2794
  disposeTurso = disposeDatabase;
2779
2795
  }
2780
2796
  });
@@ -4331,6 +4347,13 @@ function getSessionKey() {
4331
4347
  return _cached;
4332
4348
  }
4333
4349
 
4350
+ // src/mcp/agent-context.ts
4351
+ import { AsyncLocalStorage } from "async_hooks";
4352
+ var agentStore = new AsyncLocalStorage();
4353
+ function getAgentContext() {
4354
+ return agentStore.getStore();
4355
+ }
4356
+
4334
4357
  // src/lib/active-agent.ts
4335
4358
  init_employees();
4336
4359
  var CACHE_DIR = path3.join(EXE_AI_DIR, "session-cache");
@@ -4381,6 +4404,8 @@ function getMarkerPath() {
4381
4404
  return path3.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
4382
4405
  }
4383
4406
  function getActiveAgent() {
4407
+ const httpCtx = getAgentContext();
4408
+ if (httpCtx) return httpCtx;
4384
4409
  try {
4385
4410
  const markerPath = getMarkerPath();
4386
4411
  const raw = readFileSync3(markerPath, "utf8");
@@ -1958,6 +1958,7 @@ var init_db_daemon_client = __esm({
1958
1958
  // src/lib/database.ts
1959
1959
  var database_exports = {};
1960
1960
  __export(database_exports, {
1961
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1961
1962
  disposeDatabase: () => disposeDatabase,
1962
1963
  disposeTurso: () => disposeTurso,
1963
1964
  ensureSchema: () => ensureSchema,
@@ -2114,10 +2115,17 @@ async function ensureSchema() {
2114
2115
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2115
2116
  END;
2116
2117
 
2117
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2118
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2119
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2118
2120
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2119
2121
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2120
2122
  END;
2123
+
2124
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2125
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2126
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2127
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2128
+ END;
2121
2129
  `);
2122
2130
  await client.executeMultiple(`
2123
2131
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2520,6 +2528,13 @@ async function ensureSchema() {
2520
2528
  });
2521
2529
  } catch {
2522
2530
  }
2531
+ try {
2532
+ await client.execute({
2533
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2534
+ args: []
2535
+ });
2536
+ } catch {
2537
+ }
2523
2538
  try {
2524
2539
  await client.execute({
2525
2540
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3056,7 +3071,7 @@ async function disposeDatabase() {
3056
3071
  _resilientClient = null;
3057
3072
  }
3058
3073
  }
3059
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3074
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3060
3075
  var init_database = __esm({
3061
3076
  "src/lib/database.ts"() {
3062
3077
  "use strict";
@@ -3070,6 +3085,7 @@ var init_database = __esm({
3070
3085
  _daemonClient = null;
3071
3086
  _adapterClient = null;
3072
3087
  initTurso = initDatabase;
3088
+ SOFT_DELETE_RETENTION_DAYS = 7;
3073
3089
  disposeTurso = disposeDatabase;
3074
3090
  }
3075
3091
  });
@@ -4686,10 +4702,19 @@ var init_fast_db_init = __esm({
4686
4702
  // src/lib/active-agent.ts
4687
4703
  init_config();
4688
4704
  init_session_key();
4689
- init_employees();
4690
4705
  import { readFileSync as readFileSync3, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2, unlinkSync as unlinkSync2, readdirSync } from "fs";
4691
4706
  import { execSync as execSync3 } from "child_process";
4692
4707
  import path3 from "path";
4708
+
4709
+ // src/mcp/agent-context.ts
4710
+ import { AsyncLocalStorage } from "async_hooks";
4711
+ var agentStore = new AsyncLocalStorage();
4712
+ function getAgentContext() {
4713
+ return agentStore.getStore();
4714
+ }
4715
+
4716
+ // src/lib/active-agent.ts
4717
+ init_employees();
4693
4718
  var CACHE_DIR = path3.join(EXE_AI_DIR, "session-cache");
4694
4719
  var STALE_MS = 24 * 60 * 60 * 1e3;
4695
4720
  function isNameWithOptionalInstance(candidate, baseName) {
@@ -4738,6 +4763,8 @@ function getMarkerPath() {
4738
4763
  return path3.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
4739
4764
  }
4740
4765
  function getActiveAgent() {
4766
+ const httpCtx = getAgentContext();
4767
+ if (httpCtx) return httpCtx;
4741
4768
  try {
4742
4769
  const markerPath = getMarkerPath();
4743
4770
  const raw = readFileSync3(markerPath, "utf8");
@@ -1827,6 +1827,7 @@ var init_db_daemon_client = __esm({
1827
1827
  // src/lib/database.ts
1828
1828
  var database_exports = {};
1829
1829
  __export(database_exports, {
1830
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1830
1831
  disposeDatabase: () => disposeDatabase,
1831
1832
  disposeTurso: () => disposeTurso,
1832
1833
  ensureSchema: () => ensureSchema,
@@ -1983,10 +1984,17 @@ async function ensureSchema() {
1983
1984
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1984
1985
  END;
1985
1986
 
1986
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1987
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1988
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1987
1989
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1988
1990
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1989
1991
  END;
1992
+
1993
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1994
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1995
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1996
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1997
+ END;
1990
1998
  `);
1991
1999
  await client.executeMultiple(`
1992
2000
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2389,6 +2397,13 @@ async function ensureSchema() {
2389
2397
  });
2390
2398
  } catch {
2391
2399
  }
2400
+ try {
2401
+ await client.execute({
2402
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2403
+ args: []
2404
+ });
2405
+ } catch {
2406
+ }
2392
2407
  try {
2393
2408
  await client.execute({
2394
2409
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2925,7 +2940,7 @@ async function disposeDatabase() {
2925
2940
  _resilientClient = null;
2926
2941
  }
2927
2942
  }
2928
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2943
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2929
2944
  var init_database = __esm({
2930
2945
  "src/lib/database.ts"() {
2931
2946
  "use strict";
@@ -2939,6 +2954,7 @@ var init_database = __esm({
2939
2954
  _daemonClient = null;
2940
2955
  _adapterClient = null;
2941
2956
  initTurso = initDatabase;
2957
+ SOFT_DELETE_RETENTION_DAYS = 7;
2942
2958
  disposeTurso = disposeDatabase;
2943
2959
  }
2944
2960
  });
@@ -6442,6 +6458,19 @@ var init_session_key = __esm({
6442
6458
  }
6443
6459
  });
6444
6460
 
6461
+ // src/mcp/agent-context.ts
6462
+ import { AsyncLocalStorage } from "async_hooks";
6463
+ function getAgentContext() {
6464
+ return agentStore.getStore();
6465
+ }
6466
+ var agentStore;
6467
+ var init_agent_context = __esm({
6468
+ "src/mcp/agent-context.ts"() {
6469
+ "use strict";
6470
+ agentStore = new AsyncLocalStorage();
6471
+ }
6472
+ });
6473
+
6445
6474
  // src/lib/active-agent.ts
6446
6475
  import { readFileSync as readFileSync7, writeFileSync as writeFileSync3, mkdirSync as mkdirSync3, unlinkSync as unlinkSync4, readdirSync as readdirSync3 } from "fs";
6447
6476
  import { execSync as execSync6 } from "child_process";
@@ -6508,6 +6537,8 @@ function clearActiveAgent() {
6508
6537
  }
6509
6538
  }
6510
6539
  function getActiveAgent() {
6540
+ const httpCtx = getAgentContext();
6541
+ if (httpCtx) return httpCtx;
6511
6542
  try {
6512
6543
  const markerPath = getMarkerPath();
6513
6544
  const raw = readFileSync7(markerPath, "utf8");
@@ -6602,6 +6633,7 @@ var init_active_agent = __esm({
6602
6633
  "use strict";
6603
6634
  init_config();
6604
6635
  init_session_key();
6636
+ init_agent_context();
6605
6637
  init_employees();
6606
6638
  CACHE_DIR = path12.join(EXE_AI_DIR, "session-cache");
6607
6639
  STALE_MS = 24 * 60 * 60 * 1e3;