@askexenow/exe-os 0.8.56 → 0.8.58

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 (70) hide show
  1. package/dist/bin/backfill-conversations.js +13 -0
  2. package/dist/bin/backfill-responses.js +13 -0
  3. package/dist/bin/backfill-vectors.js +65 -6
  4. package/dist/bin/cleanup-stale-review-tasks.js +407 -57
  5. package/dist/bin/cli.js +6327 -6252
  6. package/dist/bin/customer-readiness.js +127 -0
  7. package/dist/bin/exe-agent.js +13 -0
  8. package/dist/bin/exe-assign.js +13 -0
  9. package/dist/bin/exe-boot.js +552 -437
  10. package/dist/bin/exe-call.js +13 -0
  11. package/dist/bin/exe-doctor.js +76 -5
  12. package/dist/bin/exe-export-behaviors.js +13 -0
  13. package/dist/bin/exe-forget.js +13 -0
  14. package/dist/bin/exe-gateway.js +84 -33
  15. package/dist/bin/exe-heartbeat.js +248 -41
  16. package/dist/bin/exe-kill.js +14 -1
  17. package/dist/bin/exe-launch-agent.js +13 -0
  18. package/dist/bin/exe-new-employee.js +13 -0
  19. package/dist/bin/exe-pending-messages.js +13 -0
  20. package/dist/bin/exe-pending-notifications.js +13 -0
  21. package/dist/bin/exe-pending-reviews.js +67 -38
  22. package/dist/bin/exe-rename.js +13 -0
  23. package/dist/bin/exe-review.js +13 -0
  24. package/dist/bin/exe-search.js +13 -0
  25. package/dist/bin/exe-session-cleanup.js +2981 -2926
  26. package/dist/bin/exe-status.js +410 -66
  27. package/dist/bin/exe-team.js +13 -0
  28. package/dist/bin/git-sweep.js +3452 -3395
  29. package/dist/bin/graph-backfill.js +13 -0
  30. package/dist/bin/graph-export.js +13 -0
  31. package/dist/bin/scan-tasks.js +3594 -3541
  32. package/dist/bin/setup.js +13 -0
  33. package/dist/bin/shard-migrate.js +13 -0
  34. package/dist/bin/wiki-sync.js +13 -0
  35. package/dist/gateway/index.js +84 -33
  36. package/dist/hooks/bug-report-worker.js +84 -33
  37. package/dist/hooks/commit-complete.js +3446 -3394
  38. package/dist/hooks/error-recall.js +13 -0
  39. package/dist/hooks/ingest-worker.js +141 -38
  40. package/dist/hooks/ingest.js +25 -6
  41. package/dist/hooks/instructions-loaded.js +13 -0
  42. package/dist/hooks/notification.js +13 -0
  43. package/dist/hooks/post-compact.js +371 -53
  44. package/dist/hooks/pre-compact.js +3382 -3329
  45. package/dist/hooks/pre-tool-use.js +400 -93
  46. package/dist/hooks/prompt-ingest-worker.js +13 -0
  47. package/dist/hooks/prompt-submit.js +84 -33
  48. package/dist/hooks/response-ingest-worker.js +13 -0
  49. package/dist/hooks/session-end.js +382 -64
  50. package/dist/hooks/session-start.js +355 -37
  51. package/dist/hooks/stop.js +381 -62
  52. package/dist/hooks/subagent-stop.js +371 -53
  53. package/dist/hooks/summary-worker.js +108 -39
  54. package/dist/index.js +104 -41
  55. package/dist/lib/employee-templates.js +13 -0
  56. package/dist/lib/exe-daemon.js +105 -45
  57. package/dist/lib/hybrid-search.js +13 -0
  58. package/dist/lib/schedules.js +13 -0
  59. package/dist/lib/store.js +13 -0
  60. package/dist/lib/tasks.js +71 -33
  61. package/dist/lib/tmux-routing.js +71 -33
  62. package/dist/mcp/server.js +147 -42
  63. package/dist/mcp/tools/create-task.js +71 -33
  64. package/dist/mcp/tools/list-tasks.js +116 -2511
  65. package/dist/mcp/tools/update-task.js +273 -243
  66. package/dist/runtime/index.js +104 -41
  67. package/dist/tui/App.js +5616 -5541
  68. package/package.json +2 -2
  69. package/src/commands/exe/build-adv.md +2 -2
  70. package/src/commands/exe/heartbeat.md +2 -1
@@ -1435,6 +1435,19 @@ var init_platform_procedures = __esm({
1435
1435
  domain: "architecture",
1436
1436
  priority: "p0",
1437
1437
  content: "Desktop and TUI are the SAME product in different renderers. Same data contracts, same interactions, same acceptance criteria. Desktop tab specs in ARCHITECTURE.md ARE the TUI specs. When building TUI, cross-reference Desktop spec. Different tab names, identical behavior. Never treat them as separate products."
1438
+ },
1439
+ // --- Orchestration golden path ---
1440
+ {
1441
+ title: "Task lifecycle \u2014 the golden path every agent follows",
1442
+ domain: "workflow",
1443
+ priority: "p0",
1444
+ content: "create_task is dispatch + delivery. Task lifecycle: open \u2192 in_progress (you start) \u2192 done (update_task when finished) \u2192 needs_review (reviewer nudged) \u2192 closed (COO only via close_task). DB is the reliable delivery \u2014 intercom is just a speedup nudge. If you finish a task, self-chain: check for next task immediately (step 7). Never wait for a nudge. Never say 'standing by.'"
1445
+ },
1446
+ {
1447
+ title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
1448
+ domain: "architecture",
1449
+ priority: "p0",
1450
+ content: "Tasks live in the DB. Intercom (tmux send-keys) is fire-and-forget \u2014 it may fail, get garbled, or arrive mid-work. Never rely on intercom for task delivery. The UserPromptSubmit hook checks the DB for new tasks on every prompt. Your operating procedures step 7 says check for next work. The daemon nudges idle agents as a speedup. If you have no tasks, you found them all."
1438
1451
  }
1439
1452
  ];
1440
1453
  PLATFORM_PROCEDURE_TITLES = new Set(
@@ -1435,6 +1435,19 @@ var init_platform_procedures = __esm({
1435
1435
  domain: "architecture",
1436
1436
  priority: "p0",
1437
1437
  content: "Desktop and TUI are the SAME product in different renderers. Same data contracts, same interactions, same acceptance criteria. Desktop tab specs in ARCHITECTURE.md ARE the TUI specs. When building TUI, cross-reference Desktop spec. Different tab names, identical behavior. Never treat them as separate products."
1438
+ },
1439
+ // --- Orchestration golden path ---
1440
+ {
1441
+ title: "Task lifecycle \u2014 the golden path every agent follows",
1442
+ domain: "workflow",
1443
+ priority: "p0",
1444
+ content: "create_task is dispatch + delivery. Task lifecycle: open \u2192 in_progress (you start) \u2192 done (update_task when finished) \u2192 needs_review (reviewer nudged) \u2192 closed (COO only via close_task). DB is the reliable delivery \u2014 intercom is just a speedup nudge. If you finish a task, self-chain: check for next task immediately (step 7). Never wait for a nudge. Never say 'standing by.'"
1445
+ },
1446
+ {
1447
+ title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
1448
+ domain: "architecture",
1449
+ priority: "p0",
1450
+ content: "Tasks live in the DB. Intercom (tmux send-keys) is fire-and-forget \u2014 it may fail, get garbled, or arrive mid-work. Never rely on intercom for task delivery. The UserPromptSubmit hook checks the DB for new tasks on every prompt. Your operating procedures step 7 says check for next work. The daemon nudges idle agents as a speedup. If you have no tasks, you found them all."
1438
1451
  }
1439
1452
  ];
1440
1453
  PLATFORM_PROCEDURE_TITLES = new Set(
@@ -1,6 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
5
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
6
+ }) : x)(function(x) {
7
+ if (typeof require !== "undefined") return require.apply(this, arguments);
8
+ throw Error('Dynamic require of "' + x + '" is not supported');
9
+ });
4
10
  var __esm = (fn, res) => function __init() {
5
11
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
12
  };
@@ -1435,6 +1441,19 @@ var init_platform_procedures = __esm({
1435
1441
  domain: "architecture",
1436
1442
  priority: "p0",
1437
1443
  content: "Desktop and TUI are the SAME product in different renderers. Same data contracts, same interactions, same acceptance criteria. Desktop tab specs in ARCHITECTURE.md ARE the TUI specs. When building TUI, cross-reference Desktop spec. Different tab names, identical behavior. Never treat them as separate products."
1444
+ },
1445
+ // --- Orchestration golden path ---
1446
+ {
1447
+ title: "Task lifecycle \u2014 the golden path every agent follows",
1448
+ domain: "workflow",
1449
+ priority: "p0",
1450
+ content: "create_task is dispatch + delivery. Task lifecycle: open \u2192 in_progress (you start) \u2192 done (update_task when finished) \u2192 needs_review (reviewer nudged) \u2192 closed (COO only via close_task). DB is the reliable delivery \u2014 intercom is just a speedup nudge. If you finish a task, self-chain: check for next task immediately (step 7). Never wait for a nudge. Never say 'standing by.'"
1451
+ },
1452
+ {
1453
+ title: "Intercom is a speedup, not delivery \u2014 DB is the source of truth",
1454
+ domain: "architecture",
1455
+ priority: "p0",
1456
+ content: "Tasks live in the DB. Intercom (tmux send-keys) is fire-and-forget \u2014 it may fail, get garbled, or arrive mid-work. Never rely on intercom for task delivery. The UserPromptSubmit hook checks the DB for new tasks on every prompt. Your operating procedures step 7 says check for next work. The daemon nudges idle agents as a speedup. If you have no tasks, you found them all."
1438
1457
  }
1439
1458
  ];
1440
1459
  PLATFORM_PROCEDURE_TITLES = new Set(
@@ -2038,12 +2057,12 @@ function isMainModule(importMetaUrl) {
2038
2057
  }
2039
2058
 
2040
2059
  // src/bin/backfill-vectors.ts
2041
- import { existsSync as existsSync5, unlinkSync as unlinkSync3 } from "fs";
2060
+ import { existsSync as existsSync6, unlinkSync as unlinkSync3 } from "fs";
2042
2061
  import path6 from "path";
2043
2062
 
2044
2063
  // src/lib/worker-gate.ts
2045
2064
  init_config();
2046
- import { readdirSync as readdirSync2, writeFileSync, unlinkSync as unlinkSync2, mkdirSync as mkdirSync2 } from "fs";
2065
+ import { readdirSync as readdirSync2, writeFileSync, unlinkSync as unlinkSync2, mkdirSync as mkdirSync2, existsSync as existsSync5 } from "fs";
2047
2066
  import path5 from "path";
2048
2067
  var WORKER_PID_DIR = path5.join(EXE_AI_DIR, "worker-pids");
2049
2068
  function registerWorkerPid(pid) {
@@ -2059,19 +2078,59 @@ function cleanupWorkerPid() {
2059
2078
  } catch {
2060
2079
  }
2061
2080
  }
2081
+ var BACKFILL_LOCK = path5.join(WORKER_PID_DIR, "backfill.lock");
2082
+ function tryAcquireBackfillLock() {
2083
+ try {
2084
+ mkdirSync2(WORKER_PID_DIR, { recursive: true });
2085
+ if (existsSync5(BACKFILL_LOCK)) {
2086
+ try {
2087
+ const pid = parseInt(
2088
+ __require("fs").readFileSync(BACKFILL_LOCK, "utf8").trim(),
2089
+ 10
2090
+ );
2091
+ if (!isNaN(pid) && pid > 0) {
2092
+ try {
2093
+ process.kill(pid, 0);
2094
+ return false;
2095
+ } catch {
2096
+ }
2097
+ }
2098
+ } catch {
2099
+ }
2100
+ }
2101
+ writeFileSync(BACKFILL_LOCK, String(process.pid));
2102
+ return true;
2103
+ } catch {
2104
+ return true;
2105
+ }
2106
+ }
2107
+ function releaseBackfillLock() {
2108
+ try {
2109
+ unlinkSync2(BACKFILL_LOCK);
2110
+ } catch {
2111
+ }
2112
+ }
2062
2113
 
2063
2114
  // src/bin/backfill-vectors.ts
2064
2115
  var BATCH_SIZE = 100;
2065
2116
  var BACKFILL_FLAG = path6.join(EXE_AI_DIR, "session-cache", "needs-backfill");
2066
2117
  async function backfillVectors() {
2118
+ if (!tryAcquireBackfillLock()) {
2119
+ process.stderr.write("[backfill] Another backfill is already running \u2014 exiting\n");
2120
+ return { processed: 0, failed: 0, remaining: -1 };
2121
+ }
2067
2122
  registerWorkerPid(process.pid);
2068
- process.on("exit", () => cleanupWorkerPid());
2069
- process.on("SIGTERM", () => {
2123
+ const cleanup = () => {
2070
2124
  cleanupWorkerPid();
2125
+ releaseBackfillLock();
2126
+ };
2127
+ process.on("exit", cleanup);
2128
+ process.on("SIGTERM", () => {
2129
+ cleanup();
2071
2130
  process.exit(0);
2072
2131
  });
2073
2132
  process.on("SIGINT", () => {
2074
- cleanupWorkerPid();
2133
+ cleanup();
2075
2134
  process.exit(0);
2076
2135
  });
2077
2136
  await initStore();
@@ -2132,7 +2191,7 @@ async function backfillVectors() {
2132
2191
  return { processed: totalProcessed, failed: totalFailed, remaining: remainingCount };
2133
2192
  }
2134
2193
  function isBackfillNeeded() {
2135
- return existsSync5(BACKFILL_FLAG);
2194
+ return existsSync6(BACKFILL_FLAG);
2136
2195
  }
2137
2196
  if (isMainModule(import.meta.url)) {
2138
2197
  backfillVectors().then((result) => {