@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
@@ -1649,6 +1649,7 @@ var init_db_daemon_client = __esm({
1649
1649
  // src/lib/database.ts
1650
1650
  var database_exports = {};
1651
1651
  __export(database_exports, {
1652
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1652
1653
  disposeDatabase: () => disposeDatabase,
1653
1654
  disposeTurso: () => disposeTurso,
1654
1655
  ensureSchema: () => ensureSchema,
@@ -1805,10 +1806,17 @@ async function ensureSchema() {
1805
1806
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1806
1807
  END;
1807
1808
 
1808
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1809
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1810
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1809
1811
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1810
1812
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1811
1813
  END;
1814
+
1815
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1816
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1817
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1818
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1819
+ END;
1812
1820
  `);
1813
1821
  await client.executeMultiple(`
1814
1822
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2211,6 +2219,13 @@ async function ensureSchema() {
2211
2219
  });
2212
2220
  } catch {
2213
2221
  }
2222
+ try {
2223
+ await client.execute({
2224
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2225
+ args: []
2226
+ });
2227
+ } catch {
2228
+ }
2214
2229
  try {
2215
2230
  await client.execute({
2216
2231
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2747,7 +2762,7 @@ async function disposeDatabase() {
2747
2762
  _resilientClient = null;
2748
2763
  }
2749
2764
  }
2750
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2765
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2751
2766
  var init_database = __esm({
2752
2767
  "src/lib/database.ts"() {
2753
2768
  "use strict";
@@ -2761,6 +2776,7 @@ var init_database = __esm({
2761
2776
  _daemonClient = null;
2762
2777
  _adapterClient = null;
2763
2778
  initTurso = initDatabase;
2779
+ SOFT_DELETE_RETENTION_DAYS = 7;
2764
2780
  disposeTurso = disposeDatabase;
2765
2781
  }
2766
2782
  });
@@ -1445,6 +1445,7 @@ var init_db_daemon_client = __esm({
1445
1445
  // src/lib/database.ts
1446
1446
  var database_exports = {};
1447
1447
  __export(database_exports, {
1448
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1448
1449
  disposeDatabase: () => disposeDatabase,
1449
1450
  disposeTurso: () => disposeTurso,
1450
1451
  ensureSchema: () => ensureSchema,
@@ -1601,10 +1602,17 @@ async function ensureSchema() {
1601
1602
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1602
1603
  END;
1603
1604
 
1604
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1605
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1606
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1605
1607
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1606
1608
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1607
1609
  END;
1610
+
1611
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1612
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1613
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1614
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1615
+ END;
1608
1616
  `);
1609
1617
  await client.executeMultiple(`
1610
1618
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2007,6 +2015,13 @@ async function ensureSchema() {
2007
2015
  });
2008
2016
  } catch {
2009
2017
  }
2018
+ try {
2019
+ await client.execute({
2020
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2021
+ args: []
2022
+ });
2023
+ } catch {
2024
+ }
2010
2025
  try {
2011
2026
  await client.execute({
2012
2027
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2543,7 +2558,7 @@ async function disposeDatabase() {
2543
2558
  _resilientClient = null;
2544
2559
  }
2545
2560
  }
2546
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2561
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2547
2562
  var init_database = __esm({
2548
2563
  "src/lib/database.ts"() {
2549
2564
  "use strict";
@@ -2557,6 +2572,7 @@ var init_database = __esm({
2557
2572
  _daemonClient = null;
2558
2573
  _adapterClient = null;
2559
2574
  initTurso = initDatabase;
2575
+ SOFT_DELETE_RETENTION_DAYS = 7;
2560
2576
  disposeTurso = disposeDatabase;
2561
2577
  }
2562
2578
  });
package/dist/lib/store.js CHANGED
@@ -1445,6 +1445,7 @@ var init_db_daemon_client = __esm({
1445
1445
  // src/lib/database.ts
1446
1446
  var database_exports = {};
1447
1447
  __export(database_exports, {
1448
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
1448
1449
  disposeDatabase: () => disposeDatabase,
1449
1450
  disposeTurso: () => disposeTurso,
1450
1451
  ensureSchema: () => ensureSchema,
@@ -1601,10 +1602,17 @@ async function ensureSchema() {
1601
1602
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1602
1603
  END;
1603
1604
 
1604
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
1605
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
1606
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
1605
1607
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1606
1608
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
1607
1609
  END;
1610
+
1611
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
1612
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
1613
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
1614
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
1615
+ END;
1608
1616
  `);
1609
1617
  await client.executeMultiple(`
1610
1618
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2007,6 +2015,13 @@ async function ensureSchema() {
2007
2015
  });
2008
2016
  } catch {
2009
2017
  }
2018
+ try {
2019
+ await client.execute({
2020
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2021
+ args: []
2022
+ });
2023
+ } catch {
2024
+ }
2010
2025
  try {
2011
2026
  await client.execute({
2012
2027
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -2543,7 +2558,7 @@ async function disposeDatabase() {
2543
2558
  _resilientClient = null;
2544
2559
  }
2545
2560
  }
2546
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
2561
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
2547
2562
  var init_database = __esm({
2548
2563
  "src/lib/database.ts"() {
2549
2564
  "use strict";
@@ -2557,6 +2572,7 @@ var init_database = __esm({
2557
2572
  _daemonClient = null;
2558
2573
  _adapterClient = null;
2559
2574
  initTurso = initDatabase;
2575
+ SOFT_DELETE_RETENTION_DAYS = 7;
2560
2576
  disposeTurso = disposeDatabase;
2561
2577
  }
2562
2578
  });
package/dist/lib/tasks.js CHANGED
@@ -4420,9 +4420,10 @@ async function updateTask(input) {
4420
4420
  args: [assignedAgent]
4421
4421
  });
4422
4422
  } else if (input.status === "cancelled") {
4423
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
4423
4424
  await draftClient.execute({
4424
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
4425
- args: [assignedAgent]
4425
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
4426
+ args: [now2, assignedAgent]
4426
4427
  });
4427
4428
  }
4428
4429
  } catch {
@@ -3325,9 +3325,10 @@ async function updateTask(input) {
3325
3325
  args: [assignedAgent]
3326
3326
  });
3327
3327
  } else if (input.status === "cancelled") {
3328
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
3328
3329
  await draftClient.execute({
3329
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
3330
- args: [assignedAgent]
3330
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
3331
+ args: [now2, assignedAgent]
3331
3332
  });
3332
3333
  }
3333
3334
  } catch {
@@ -2093,6 +2093,7 @@ var init_db_daemon_client = __esm({
2093
2093
  // src/lib/database.ts
2094
2094
  var database_exports = {};
2095
2095
  __export(database_exports, {
2096
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
2096
2097
  disposeDatabase: () => disposeDatabase,
2097
2098
  disposeTurso: () => disposeTurso,
2098
2099
  ensureSchema: () => ensureSchema,
@@ -2249,10 +2250,17 @@ async function ensureSchema() {
2249
2250
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2250
2251
  END;
2251
2252
 
2252
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2253
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2254
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2253
2255
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2254
2256
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2255
2257
  END;
2258
+
2259
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2260
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2261
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2262
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2263
+ END;
2256
2264
  `);
2257
2265
  await client.executeMultiple(`
2258
2266
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2655,6 +2663,13 @@ async function ensureSchema() {
2655
2663
  });
2656
2664
  } catch {
2657
2665
  }
2666
+ try {
2667
+ await client.execute({
2668
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2669
+ args: []
2670
+ });
2671
+ } catch {
2672
+ }
2658
2673
  try {
2659
2674
  await client.execute({
2660
2675
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3191,7 +3206,7 @@ async function disposeDatabase() {
3191
3206
  _resilientClient = null;
3192
3207
  }
3193
3208
  }
3194
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3209
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3195
3210
  var init_database = __esm({
3196
3211
  "src/lib/database.ts"() {
3197
3212
  "use strict";
@@ -3205,6 +3220,7 @@ var init_database = __esm({
3205
3220
  _daemonClient = null;
3206
3221
  _adapterClient = null;
3207
3222
  initTurso = initDatabase;
3223
+ SOFT_DELETE_RETENTION_DAYS = 7;
3208
3224
  disposeTurso = disposeDatabase;
3209
3225
  }
3210
3226
  });
@@ -6487,6 +6503,19 @@ var init_session_key = __esm({
6487
6503
  }
6488
6504
  });
6489
6505
 
6506
+ // src/mcp/agent-context.ts
6507
+ import { AsyncLocalStorage } from "async_hooks";
6508
+ function getAgentContext() {
6509
+ return agentStore.getStore();
6510
+ }
6511
+ var agentStore;
6512
+ var init_agent_context = __esm({
6513
+ "src/mcp/agent-context.ts"() {
6514
+ "use strict";
6515
+ agentStore = new AsyncLocalStorage();
6516
+ }
6517
+ });
6518
+
6490
6519
  // src/lib/active-agent.ts
6491
6520
  var active_agent_exports = {};
6492
6521
  __export(active_agent_exports, {
@@ -6562,6 +6591,8 @@ function clearActiveAgent() {
6562
6591
  }
6563
6592
  }
6564
6593
  function getActiveAgent() {
6594
+ const httpCtx = getAgentContext();
6595
+ if (httpCtx) return httpCtx;
6565
6596
  try {
6566
6597
  const markerPath = getMarkerPath();
6567
6598
  const raw = readFileSync7(markerPath, "utf8");
@@ -6656,6 +6687,7 @@ var init_active_agent = __esm({
6656
6687
  "use strict";
6657
6688
  init_config();
6658
6689
  init_session_key();
6690
+ init_agent_context();
6659
6691
  init_employees();
6660
6692
  CACHE_DIR = path12.join(EXE_AI_DIR, "session-cache");
6661
6693
  STALE_MS = 24 * 60 * 60 * 1e3;
@@ -6923,8 +6955,8 @@ async function validateLicense(apiKey, deviceId) {
6923
6955
  }
6924
6956
  function getCacheAgeMs() {
6925
6957
  try {
6926
- const { statSync: statSync5 } = __require("fs");
6927
- const s = statSync5(CACHE_PATH);
6958
+ const { statSync: statSync6 } = __require("fs");
6959
+ const s = statSync6(CACHE_PATH);
6928
6960
  return Date.now() - s.mtimeMs;
6929
6961
  } catch {
6930
6962
  return Infinity;
@@ -10441,9 +10473,10 @@ async function updateTask(input) {
10441
10473
  args: [assignedAgent]
10442
10474
  });
10443
10475
  } else if (input.status === "cancelled") {
10476
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
10444
10477
  await draftClient.execute({
10445
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
10446
- args: [assignedAgent]
10478
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
10479
+ args: [now2, assignedAgent]
10447
10480
  });
10448
10481
  }
10449
10482
  } catch {
@@ -14429,13 +14462,14 @@ async function listDocumentsByWorkspace(workspace_id, limit = DEFAULT_LIST_LIMIT
14429
14462
  async function deleteDocumentAndChunks(id) {
14430
14463
  const client = getClient();
14431
14464
  const countResult = await client.execute({
14432
- sql: "SELECT COUNT(*) AS cnt FROM memories WHERE document_id = ?",
14465
+ sql: "SELECT COUNT(*) AS cnt FROM memories WHERE document_id = ? AND COALESCE(status, 'active') = 'active'",
14433
14466
  args: [id]
14434
14467
  });
14435
14468
  const deletedChunks = Number(countResult.rows[0]?.cnt) || 0;
14469
+ const now = (/* @__PURE__ */ new Date()).toISOString();
14436
14470
  await client.batch(
14437
14471
  [
14438
- { sql: "DELETE FROM memories WHERE document_id = ?", args: [id] },
14472
+ { sql: "UPDATE memories SET status = 'deleted', deleted_at = ? WHERE document_id = ? AND COALESCE(status, 'active') = 'active'", args: [now, id] },
14439
14473
  { sql: "DELETE FROM documents WHERE id = ?", args: [id] }
14440
14474
  ],
14441
14475
  "write"
@@ -20404,15 +20438,13 @@ async function fixDuplicates(client, duplicates, dryRun) {
20404
20438
  continue;
20405
20439
  }
20406
20440
  const placeholders = dup.delete_ids.map(() => "?").join(",");
20441
+ const now = (/* @__PURE__ */ new Date()).toISOString();
20407
20442
  await client.execute({
20408
- sql: `DELETE FROM memories WHERE id IN (${placeholders})`,
20409
- args: dup.delete_ids
20443
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE id IN (${placeholders})`,
20444
+ args: [now, ...dup.delete_ids]
20410
20445
  });
20411
20446
  deleted += dup.delete_ids.length;
20412
20447
  }
20413
- if (!dryRun && deleted > 0) {
20414
- await client.execute("INSERT INTO memories_fts(memories_fts) VALUES('rebuild')");
20415
- }
20416
20448
  return deleted;
20417
20449
  }
20418
20450
  async function fixBloated(client, bloated, dryRun) {
@@ -20594,7 +20626,7 @@ import { z as z63 } from "zod";
20594
20626
 
20595
20627
  // src/lib/cloud-sync.ts
20596
20628
  init_database();
20597
- import { readFileSync as readFileSync26, writeFileSync as writeFileSync20, existsSync as existsSync32, readdirSync as readdirSync13, mkdirSync as mkdirSync17, appendFileSync as appendFileSync2, unlinkSync as unlinkSync11, openSync as openSync2, closeSync as closeSync2 } from "fs";
20629
+ import { readFileSync as readFileSync26, writeFileSync as writeFileSync20, existsSync as existsSync32, readdirSync as readdirSync13, mkdirSync as mkdirSync17, appendFileSync as appendFileSync2, unlinkSync as unlinkSync11, openSync as openSync2, closeSync as closeSync2, statSync as statSync5 } from "fs";
20598
20630
  import crypto17 from "crypto";
20599
20631
  import path40 from "path";
20600
20632
  import { homedir as homedir6 } from "os";
@@ -21159,10 +21191,9 @@ async function cloudSync(config2) {
21159
21191
  const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
21160
21192
  try {
21161
21193
  const { getLatestBackup: getLatestBackup2 } = await Promise.resolve().then(() => (init_db_backup(), db_backup_exports));
21162
- const { statSync: statFile } = await import("fs");
21163
21194
  const latestBackup = getLatestBackup2();
21164
21195
  if (latestBackup) {
21165
- const backupSize = statFile(latestBackup).size;
21196
+ const backupSize = statSync5(latestBackup).size;
21166
21197
  const MAX_CLOUD_BACKUP_BYTES = 50 * 1024 * 1024;
21167
21198
  if (backupSize <= MAX_CLOUD_BACKUP_BYTES) {
21168
21199
  const backupData = readFileSync26(latestBackup);
@@ -23291,62 +23322,6 @@ function registerQueryCompanyBrain(server2) {
23291
23322
  );
23292
23323
  }
23293
23324
 
23294
- // src/lib/telemetry.ts
23295
- var ENABLED = process.env.EXE_TELEMETRY === "1";
23296
- var initialized = false;
23297
- async function ensureInit() {
23298
- if (initialized || !ENABLED) return;
23299
- initialized = true;
23300
- try {
23301
- const { NodeSDK } = await import("@opentelemetry/sdk-node");
23302
- const { ConsoleSpanExporter } = await import("@opentelemetry/sdk-trace-base");
23303
- const sdk = new NodeSDK({
23304
- serviceName: "exe-os",
23305
- traceExporter: new ConsoleSpanExporter()
23306
- });
23307
- sdk.start();
23308
- process.stderr.write("[exe-os] OpenTelemetry tracing enabled\n");
23309
- } catch (err) {
23310
- process.stderr.write(
23311
- `[exe-os] OpenTelemetry init failed: ${err instanceof Error ? err.message : String(err)}
23312
- `
23313
- );
23314
- }
23315
- }
23316
- async function withTrace(toolName, fn) {
23317
- if (!ENABLED) return fn();
23318
- await ensureInit();
23319
- const { trace, SpanStatusCode } = await import("@opentelemetry/api");
23320
- const tracer = trace.getTracer("exe-os", "1.0.0");
23321
- return tracer.startActiveSpan(`mcp.tool.${toolName}`, async (span) => {
23322
- span.setAttribute("mcp.tool.name", toolName);
23323
- try {
23324
- const result = await fn();
23325
- span.setStatus({ code: SpanStatusCode.OK });
23326
- return result;
23327
- } catch (err) {
23328
- span.setStatus({
23329
- code: SpanStatusCode.ERROR,
23330
- message: err instanceof Error ? err.message : String(err)
23331
- });
23332
- span.recordException(
23333
- err instanceof Error ? err : new Error(String(err))
23334
- );
23335
- throw err;
23336
- } finally {
23337
- span.end();
23338
- }
23339
- });
23340
- }
23341
- function instrumentServer(server2) {
23342
- if (!ENABLED) return;
23343
- const original = server2.registerTool.bind(server2);
23344
- server2.registerTool = (name, config2, handler) => {
23345
- const traced = async (...args) => withTrace(name, () => handler(...args));
23346
- return original(name, config2, traced);
23347
- };
23348
- }
23349
-
23350
23325
  // src/mcp/tool-gates.ts
23351
23326
  var TOOL_GATES = {
23352
23327
  core: [],
@@ -23479,6 +23454,147 @@ function isToolAllowed(registerFnName) {
23479
23454
  return allowedRoles.includes(role);
23480
23455
  }
23481
23456
 
23457
+ // src/mcp/register-tools.ts
23458
+ function registerAllTools(server2) {
23459
+ const gate = (name, fn) => {
23460
+ if (isToolAllowed(name)) fn(server2);
23461
+ };
23462
+ gate("registerRecallMyMemory", registerRecallMyMemory);
23463
+ gate("registerAskTeamMemory", registerAskTeamMemory);
23464
+ gate("registerGetSessionContext", registerGetSessionContext);
23465
+ gate("registerStoreMemory", registerStoreMemory);
23466
+ gate("registerCommitMemory", registerCommitMemory);
23467
+ gate("registerQueryRelationships", registerQueryRelationships);
23468
+ gate("registerCreateTask", registerCreateTask);
23469
+ gate("registerListTasks", registerListTasks);
23470
+ gate("registerUpdateTask", registerUpdateTask);
23471
+ gate("registerCloseTask", registerCloseTask);
23472
+ gate("registerGetTask", registerGetTask);
23473
+ gate("registerCheckpointTask", registerCheckpointTask);
23474
+ gate("registerResumeEmployee", registerResumeEmployee);
23475
+ gate("registerBehavior", registerBehavior);
23476
+ gate("registerSendMessage", registerSendMessage);
23477
+ gate("registerReminder", registerReminder);
23478
+ gate("registerGetIdentity", registerGetIdentity);
23479
+ gate("registerUpdateIdentity", registerUpdateIdentity);
23480
+ gate("registerIngestDocument", registerIngestDocument);
23481
+ gate("registerListDocuments", registerListDocuments);
23482
+ gate("registerPurgeDocument", registerPurgeDocument);
23483
+ gate("registerSetDocumentImportance", registerSetDocumentImportance);
23484
+ gate("registerRerankDocuments", registerRerankDocuments);
23485
+ gate("registerAcknowledgeMessages", registerAcknowledgeMessages);
23486
+ gate("registerSendWhatsapp", registerSendWhatsapp);
23487
+ gate("registerCreateTrigger", registerCreateTrigger);
23488
+ gate("registerListTriggers", registerListTriggers);
23489
+ gate("registerApplyStarterPack", registerApplyStarterPack);
23490
+ gate("registerMergeEntities", registerMergeEntities);
23491
+ gate("registerCreateWikiPage", registerCreateWikiPage);
23492
+ gate("registerListWikiPages", registerListWikiPages);
23493
+ gate("registerGetWikiPage", registerGetWikiPage);
23494
+ gate("registerUpdateWikiPage", registerUpdateWikiPage);
23495
+ gate("registerDeployClient", registerDeployClient);
23496
+ gate("registerExportOrchestration", registerExportOrchestration);
23497
+ gate("registerImportOrchestration", registerImportOrchestration);
23498
+ gate("registerQueryConversations", registerQueryConversations);
23499
+ gate("registerLoadSkill", registerLoadSkill);
23500
+ gate("registerConsolidateMemories", registerConsolidateMemories);
23501
+ gate("registerGlobalProcedure", registerGlobalProcedure);
23502
+ gate("registerStoreGlobalProcedure", registerStoreGlobalProcedure);
23503
+ gate("registerListGlobalProcedures", registerListGlobalProcedures);
23504
+ gate("registerDeactivateGlobalProcedure", registerDeactivateGlobalProcedure);
23505
+ gate("registerStoreBehavior", registerStoreBehavior);
23506
+ gate("registerListBehaviors", registerListBehaviors);
23507
+ gate("registerDeactivateBehavior", registerDeactivateBehavior);
23508
+ gate("registerCreateReminder", registerCreateReminder);
23509
+ gate("registerListReminders", registerListReminders);
23510
+ gate("registerCompleteReminder", registerCompleteReminder);
23511
+ gate("registerSearchEverything", registerSearchEverything);
23512
+ gate("registerStoreDecision", registerStoreDecision);
23513
+ gate("registerGetDecision", registerGetDecision);
23514
+ gate("registerGetAgentSpend", registerGetAgentSpend);
23515
+ gate("registerGetGraphStats", registerGetGraphStats);
23516
+ gate("registerGetEntityNeighbors", registerGetEntityNeighbors);
23517
+ gate("registerGetHotEntities", registerGetHotEntities);
23518
+ gate("registerExportGraph", registerExportGraph);
23519
+ gate("registerFindSimilarTrajectories", registerFindSimilarTrajectories);
23520
+ gate("registerGetSessionKills", registerGetSessionKills);
23521
+ gate("registerListAgentSessions", registerListAgentSessions);
23522
+ gate("registerGetDaemonHealth", registerGetDaemonHealth);
23523
+ gate("registerGetAutoWakeStatus", registerGetAutoWakeStatus);
23524
+ gate("registerGetWorkerGate", registerGetWorkerGate);
23525
+ gate("registerRunMemoryAudit", registerRunMemoryAudit);
23526
+ gate("registerCloudSync", registerCloudSync);
23527
+ gate("registerBackupVps", registerBackupVps);
23528
+ gate("registerGetMemoryCardinality", registerGetMemoryCardinality);
23529
+ gate("registerRunConsolidation", registerRunConsolidation);
23530
+ gate("registerGetLicenseStatus", registerGetLicenseStatus);
23531
+ gate("registerAddPerson", registerAddPerson);
23532
+ gate("registerListPeople", registerListPeople);
23533
+ gate("registerGetPerson", registerGetPerson);
23534
+ gate("registerSetAgentConfig", registerSetAgentConfig);
23535
+ gate("registerListEmployees", registerListEmployees);
23536
+ gate("registerCreateLicense", registerCreateLicense);
23537
+ gate("registerListLicenses", registerListLicenses);
23538
+ gate("registerActivateLicense", registerActivateLicense);
23539
+ gate("registerQueryCompanyBrain", registerQueryCompanyBrain);
23540
+ }
23541
+
23542
+ // src/lib/telemetry.ts
23543
+ var ENABLED = process.env.EXE_TELEMETRY === "1";
23544
+ var initialized = false;
23545
+ async function ensureInit() {
23546
+ if (initialized || !ENABLED) return;
23547
+ initialized = true;
23548
+ try {
23549
+ const { NodeSDK } = await import("@opentelemetry/sdk-node");
23550
+ const { ConsoleSpanExporter } = await import("@opentelemetry/sdk-trace-base");
23551
+ const sdk = new NodeSDK({
23552
+ serviceName: "exe-os",
23553
+ traceExporter: new ConsoleSpanExporter()
23554
+ });
23555
+ sdk.start();
23556
+ process.stderr.write("[exe-os] OpenTelemetry tracing enabled\n");
23557
+ } catch (err) {
23558
+ process.stderr.write(
23559
+ `[exe-os] OpenTelemetry init failed: ${err instanceof Error ? err.message : String(err)}
23560
+ `
23561
+ );
23562
+ }
23563
+ }
23564
+ async function withTrace(toolName, fn) {
23565
+ if (!ENABLED) return fn();
23566
+ await ensureInit();
23567
+ const { trace, SpanStatusCode } = await import("@opentelemetry/api");
23568
+ const tracer = trace.getTracer("exe-os", "1.0.0");
23569
+ return tracer.startActiveSpan(`mcp.tool.${toolName}`, async (span) => {
23570
+ span.setAttribute("mcp.tool.name", toolName);
23571
+ try {
23572
+ const result = await fn();
23573
+ span.setStatus({ code: SpanStatusCode.OK });
23574
+ return result;
23575
+ } catch (err) {
23576
+ span.setStatus({
23577
+ code: SpanStatusCode.ERROR,
23578
+ message: err instanceof Error ? err.message : String(err)
23579
+ });
23580
+ span.recordException(
23581
+ err instanceof Error ? err : new Error(String(err))
23582
+ );
23583
+ throw err;
23584
+ } finally {
23585
+ span.end();
23586
+ }
23587
+ });
23588
+ }
23589
+ function instrumentServer(server2) {
23590
+ if (!ENABLED) return;
23591
+ const original = server2.registerTool.bind(server2);
23592
+ server2.registerTool = (name, config2, handler) => {
23593
+ const traced = async (...args) => withTrace(name, () => handler(...args));
23594
+ return original(name, config2, traced);
23595
+ };
23596
+ }
23597
+
23482
23598
  // src/mcp/server.ts
23483
23599
  var server = new McpServer({
23484
23600
  name: "exe-os",
@@ -23488,87 +23604,7 @@ var _backfillTimer = null;
23488
23604
  var _ppidWatchdog = null;
23489
23605
  var _shuttingDown = false;
23490
23606
  instrumentServer(server);
23491
- var gate = (name, fn) => {
23492
- if (isToolAllowed(name)) fn(server);
23493
- };
23494
- gate("registerRecallMyMemory", registerRecallMyMemory);
23495
- gate("registerAskTeamMemory", registerAskTeamMemory);
23496
- gate("registerGetSessionContext", registerGetSessionContext);
23497
- gate("registerStoreMemory", registerStoreMemory);
23498
- gate("registerCommitMemory", registerCommitMemory);
23499
- gate("registerQueryRelationships", registerQueryRelationships);
23500
- gate("registerCreateTask", registerCreateTask);
23501
- gate("registerListTasks", registerListTasks);
23502
- gate("registerUpdateTask", registerUpdateTask);
23503
- gate("registerCloseTask", registerCloseTask);
23504
- gate("registerGetTask", registerGetTask);
23505
- gate("registerCheckpointTask", registerCheckpointTask);
23506
- gate("registerResumeEmployee", registerResumeEmployee);
23507
- gate("registerBehavior", registerBehavior);
23508
- gate("registerSendMessage", registerSendMessage);
23509
- gate("registerReminder", registerReminder);
23510
- gate("registerGetIdentity", registerGetIdentity);
23511
- gate("registerUpdateIdentity", registerUpdateIdentity);
23512
- gate("registerIngestDocument", registerIngestDocument);
23513
- gate("registerListDocuments", registerListDocuments);
23514
- gate("registerPurgeDocument", registerPurgeDocument);
23515
- gate("registerSetDocumentImportance", registerSetDocumentImportance);
23516
- gate("registerRerankDocuments", registerRerankDocuments);
23517
- gate("registerAcknowledgeMessages", registerAcknowledgeMessages);
23518
- gate("registerSendWhatsapp", registerSendWhatsapp);
23519
- gate("registerCreateTrigger", registerCreateTrigger);
23520
- gate("registerListTriggers", registerListTriggers);
23521
- gate("registerApplyStarterPack", registerApplyStarterPack);
23522
- gate("registerMergeEntities", registerMergeEntities);
23523
- gate("registerCreateWikiPage", registerCreateWikiPage);
23524
- gate("registerListWikiPages", registerListWikiPages);
23525
- gate("registerGetWikiPage", registerGetWikiPage);
23526
- gate("registerUpdateWikiPage", registerUpdateWikiPage);
23527
- gate("registerDeployClient", registerDeployClient);
23528
- gate("registerExportOrchestration", registerExportOrchestration);
23529
- gate("registerImportOrchestration", registerImportOrchestration);
23530
- gate("registerQueryConversations", registerQueryConversations);
23531
- gate("registerLoadSkill", registerLoadSkill);
23532
- gate("registerConsolidateMemories", registerConsolidateMemories);
23533
- gate("registerGlobalProcedure", registerGlobalProcedure);
23534
- gate("registerStoreGlobalProcedure", registerStoreGlobalProcedure);
23535
- gate("registerListGlobalProcedures", registerListGlobalProcedures);
23536
- gate("registerDeactivateGlobalProcedure", registerDeactivateGlobalProcedure);
23537
- gate("registerStoreBehavior", registerStoreBehavior);
23538
- gate("registerListBehaviors", registerListBehaviors);
23539
- gate("registerDeactivateBehavior", registerDeactivateBehavior);
23540
- gate("registerCreateReminder", registerCreateReminder);
23541
- gate("registerListReminders", registerListReminders);
23542
- gate("registerCompleteReminder", registerCompleteReminder);
23543
- gate("registerSearchEverything", registerSearchEverything);
23544
- gate("registerStoreDecision", registerStoreDecision);
23545
- gate("registerGetDecision", registerGetDecision);
23546
- gate("registerGetAgentSpend", registerGetAgentSpend);
23547
- gate("registerGetGraphStats", registerGetGraphStats);
23548
- gate("registerGetEntityNeighbors", registerGetEntityNeighbors);
23549
- gate("registerGetHotEntities", registerGetHotEntities);
23550
- gate("registerExportGraph", registerExportGraph);
23551
- gate("registerFindSimilarTrajectories", registerFindSimilarTrajectories);
23552
- gate("registerGetSessionKills", registerGetSessionKills);
23553
- gate("registerListAgentSessions", registerListAgentSessions);
23554
- gate("registerGetDaemonHealth", registerGetDaemonHealth);
23555
- gate("registerGetAutoWakeStatus", registerGetAutoWakeStatus);
23556
- gate("registerGetWorkerGate", registerGetWorkerGate);
23557
- gate("registerRunMemoryAudit", registerRunMemoryAudit);
23558
- gate("registerCloudSync", registerCloudSync);
23559
- gate("registerBackupVps", registerBackupVps);
23560
- gate("registerGetMemoryCardinality", registerGetMemoryCardinality);
23561
- gate("registerRunConsolidation", registerRunConsolidation);
23562
- gate("registerGetLicenseStatus", registerGetLicenseStatus);
23563
- gate("registerAddPerson", registerAddPerson);
23564
- gate("registerListPeople", registerListPeople);
23565
- gate("registerGetPerson", registerGetPerson);
23566
- gate("registerSetAgentConfig", registerSetAgentConfig);
23567
- gate("registerListEmployees", registerListEmployees);
23568
- gate("registerCreateLicense", registerCreateLicense);
23569
- gate("registerListLicenses", registerListLicenses);
23570
- gate("registerActivateLicense", registerActivateLicense);
23571
- gate("registerQueryCompanyBrain", registerQueryCompanyBrain);
23607
+ registerAllTools(server);
23572
23608
  var _gatedRole = process.env.AGENT_ROLE ?? "standalone";
23573
23609
  process.stderr.write(`[exe-os] Tool gating: role=${_gatedRole}
23574
23610
  `);