@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
@@ -4423,9 +4423,10 @@ async function updateTask(input) {
4423
4423
  args: [assignedAgent]
4424
4424
  });
4425
4425
  } else if (input.status === "cancelled") {
4426
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
4426
4427
  await draftClient.execute({
4427
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
4428
- args: [assignedAgent]
4428
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
4429
+ args: [now2, assignedAgent]
4429
4430
  });
4430
4431
  }
4431
4432
  } catch {
@@ -4546,6 +4547,19 @@ var init_tasks = __esm({
4546
4547
  }
4547
4548
  });
4548
4549
 
4550
+ // src/mcp/agent-context.ts
4551
+ import { AsyncLocalStorage } from "async_hooks";
4552
+ function getAgentContext() {
4553
+ return agentStore.getStore();
4554
+ }
4555
+ var agentStore;
4556
+ var init_agent_context = __esm({
4557
+ "src/mcp/agent-context.ts"() {
4558
+ "use strict";
4559
+ agentStore = new AsyncLocalStorage();
4560
+ }
4561
+ });
4562
+
4549
4563
  // src/lib/active-agent.ts
4550
4564
  var active_agent_exports = {};
4551
4565
  __export(active_agent_exports, {
@@ -4621,6 +4635,8 @@ function clearActiveAgent() {
4621
4635
  }
4622
4636
  }
4623
4637
  function getActiveAgent() {
4638
+ const httpCtx = getAgentContext();
4639
+ if (httpCtx) return httpCtx;
4624
4640
  try {
4625
4641
  const markerPath = getMarkerPath();
4626
4642
  const raw = readFileSync13(markerPath, "utf8");
@@ -4715,6 +4731,7 @@ var init_active_agent = __esm({
4715
4731
  "use strict";
4716
4732
  init_config();
4717
4733
  init_session_key();
4734
+ init_agent_context();
4718
4735
  init_employees();
4719
4736
  CACHE_DIR = path18.join(EXE_AI_DIR, "session-cache");
4720
4737
  STALE_MS = 24 * 60 * 60 * 1e3;
@@ -2220,6 +2220,7 @@ var init_db_daemon_client = __esm({
2220
2220
  // src/lib/database.ts
2221
2221
  var database_exports = {};
2222
2222
  __export(database_exports, {
2223
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
2223
2224
  disposeDatabase: () => disposeDatabase,
2224
2225
  disposeTurso: () => disposeTurso,
2225
2226
  ensureSchema: () => ensureSchema,
@@ -2376,10 +2377,17 @@ async function ensureSchema() {
2376
2377
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2377
2378
  END;
2378
2379
 
2379
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2380
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2381
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2380
2382
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2381
2383
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2382
2384
  END;
2385
+
2386
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2387
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2388
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2389
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2390
+ END;
2383
2391
  `);
2384
2392
  await client.executeMultiple(`
2385
2393
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -2782,6 +2790,13 @@ async function ensureSchema() {
2782
2790
  });
2783
2791
  } catch {
2784
2792
  }
2793
+ try {
2794
+ await client.execute({
2795
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
2796
+ args: []
2797
+ });
2798
+ } catch {
2799
+ }
2785
2800
  try {
2786
2801
  await client.execute({
2787
2802
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3318,7 +3333,7 @@ async function disposeDatabase() {
3318
3333
  _resilientClient = null;
3319
3334
  }
3320
3335
  }
3321
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3336
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3322
3337
  var init_database = __esm({
3323
3338
  "src/lib/database.ts"() {
3324
3339
  "use strict";
@@ -3332,6 +3347,7 @@ var init_database = __esm({
3332
3347
  _daemonClient = null;
3333
3348
  _adapterClient = null;
3334
3349
  initTurso = initDatabase;
3350
+ SOFT_DELETE_RETENTION_DAYS = 7;
3335
3351
  disposeTurso = disposeDatabase;
3336
3352
  }
3337
3353
  });
@@ -5343,9 +5359,10 @@ async function updateTask(input) {
5343
5359
  args: [assignedAgent]
5344
5360
  });
5345
5361
  } else if (input.status === "cancelled") {
5362
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
5346
5363
  await draftClient.execute({
5347
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
5348
- args: [assignedAgent]
5364
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
5365
+ args: [now2, assignedAgent]
5349
5366
  });
5350
5367
  }
5351
5368
  } catch {
package/dist/tui/App.js CHANGED
@@ -2471,6 +2471,7 @@ var init_db_daemon_client = __esm({
2471
2471
  // src/lib/database.ts
2472
2472
  var database_exports = {};
2473
2473
  __export(database_exports, {
2474
+ SOFT_DELETE_RETENTION_DAYS: () => SOFT_DELETE_RETENTION_DAYS,
2474
2475
  disposeDatabase: () => disposeDatabase,
2475
2476
  disposeTurso: () => disposeTurso,
2476
2477
  ensureSchema: () => ensureSchema,
@@ -2627,10 +2628,17 @@ async function ensureSchema() {
2627
2628
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2628
2629
  END;
2629
2630
 
2630
- CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories BEGIN
2631
+ CREATE TRIGGER IF NOT EXISTS memories_fts_au AFTER UPDATE ON memories
2632
+ WHEN new.status IS NULL OR new.status != 'deleted' BEGIN
2631
2633
  INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2632
2634
  INSERT INTO memories_fts(rowid, raw_text) VALUES (new.rowid, new.raw_text);
2633
2635
  END;
2636
+
2637
+ -- Soft-delete trigger: remove from FTS when status changes to 'deleted'
2638
+ CREATE TRIGGER IF NOT EXISTS memories_fts_soft_delete AFTER UPDATE ON memories
2639
+ WHEN new.status = 'deleted' AND (old.status IS NULL OR old.status != 'deleted') BEGIN
2640
+ INSERT INTO memories_fts(memories_fts, rowid, raw_text) VALUES('delete', old.rowid, old.raw_text);
2641
+ END;
2634
2642
  `);
2635
2643
  await client.executeMultiple(`
2636
2644
  CREATE TABLE IF NOT EXISTS sync_meta (
@@ -3033,6 +3041,13 @@ async function ensureSchema() {
3033
3041
  });
3034
3042
  } catch {
3035
3043
  }
3044
+ try {
3045
+ await client.execute({
3046
+ sql: `ALTER TABLE memories ADD COLUMN deleted_at TEXT`,
3047
+ args: []
3048
+ });
3049
+ } catch {
3050
+ }
3036
3051
  try {
3037
3052
  await client.execute({
3038
3053
  sql: `ALTER TABLE memories ADD COLUMN confidence REAL DEFAULT 0.7`,
@@ -3569,7 +3584,7 @@ async function disposeDatabase() {
3569
3584
  _resilientClient = null;
3570
3585
  }
3571
3586
  }
3572
- var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, disposeTurso;
3587
+ var _client, _resilientClient, _walCheckpointTimer, _daemonClient, _adapterClient, initTurso, SOFT_DELETE_RETENTION_DAYS, disposeTurso;
3573
3588
  var init_database = __esm({
3574
3589
  "src/lib/database.ts"() {
3575
3590
  "use strict";
@@ -3583,6 +3598,7 @@ var init_database = __esm({
3583
3598
  _daemonClient = null;
3584
3599
  _adapterClient = null;
3585
3600
  initTurso = initDatabase;
3601
+ SOFT_DELETE_RETENTION_DAYS = 7;
3586
3602
  disposeTurso = disposeDatabase;
3587
3603
  }
3588
3604
  });
@@ -5947,9 +5963,10 @@ async function updateTask(input) {
5947
5963
  args: [assignedAgent]
5948
5964
  });
5949
5965
  } else if (input.status === "cancelled") {
5966
+ const now2 = (/* @__PURE__ */ new Date()).toISOString();
5950
5967
  await draftClient.execute({
5951
- sql: `DELETE FROM memories WHERE agent_id = ? AND draft = 1`,
5952
- args: [assignedAgent]
5968
+ sql: `UPDATE memories SET status = 'deleted', deleted_at = ? WHERE agent_id = ? AND draft = 1`,
5969
+ args: [now2, assignedAgent]
5953
5970
  });
5954
5971
  }
5955
5972
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.32",
3
+ "version": "0.9.34",
4
4
  "description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",