@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
@@ -2060,6 +2060,7 @@ var init_db_daemon_client = __esm({
2060
2060
  // src/lib/database.ts
2061
2061
  var database_exports = {};
2062
2062
  __export(database_exports, {
2063
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
2063
2064
  disposeDatabase: () => disposeDatabase,
2064
2065
  disposeTurso: () => disposeTurso,
2065
2066
  ensureSchema: () => ensureSchema,
@@ -2216,10 +2217,17 @@ async function ensureSchema() {
2216
2217
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2217
2218
  END;
2218
2219
 
2219
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2220
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2221
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2220
2222
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2221
2223
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2222
2224
  END;
2225
+
2226
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2227
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2228
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2229
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2230
+ END;
2223
2231
  `);
2224
2232
  await client.executeMultiple(`
2225
2233
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2622,6 +2630,13 @@ async function ensureSchema() {
2622
2630
  });
2623
2631
  } catch {
2624
2632
  }
2633
+ try {
2634
+ await client.execute({
2635
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2636
+ args: []
2637
+ });
2638
+ } catch {
2639
+ }
2625
2640
  try {
2626
2641
  await client.execute({
2627
2642
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3158,7 +3173,7 @@ async function disposeDatabase() {
3158
3173
  _resilientClient = null;
3159
3174
  }
3160
3175
  }
3161
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3176
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3162
3177
  var init_database = __esm({
3163
3178
  "src/lib/database.ts"() {
3164
3179
  "use strict";
@@ -3172,6 +3187,7 @@ var init_database = __esm({
3172
3187
  _daemonClient = null;
3173
3188
  _adapterClient = null;
3174
3189
  initTurso = initDatabase;
3190
+ SOFT_DELETE_RETENTION_DAYS = 7;
3175
3191
  disposeTurso = disposeDatabase;
3176
3192
  }
3177
3193
  });
@@ -7983,9 +7999,10 @@ async function updateTask(input) {
7983
7999
  args: [assignedAgent]
7984
8000
  });
7985
8001
  } else if (input.status === "cancelled") {
8002
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
7986
8003
  await draftClient.execute({
7987
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
7988
- args: [assignedAgent]
8004
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
8005
+ args: [now2, assignedAgent]
7989
8006
  });
7990
8007
  }
7991
8008
  } catch {
@@ -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");