@askexenow/exe-os 0.9.21 → 0.9.22

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 (60) hide show
  1. package/dist/bin/backfill-conversations.js +17 -4
  2. package/dist/bin/backfill-responses.js +17 -4
  3. package/dist/bin/backfill-vectors.js +2 -2
  4. package/dist/bin/cleanup-stale-review-tasks.js +17 -4
  5. package/dist/bin/cli.js +378 -171
  6. package/dist/bin/exe-assign.js +17 -4
  7. package/dist/bin/exe-boot.js +2 -2
  8. package/dist/bin/exe-dispatch.js +17 -4
  9. package/dist/bin/exe-doctor.js +2 -2
  10. package/dist/bin/exe-export-behaviors.js +17 -4
  11. package/dist/bin/exe-forget.js +17 -4
  12. package/dist/bin/exe-gateway.js +17 -4
  13. package/dist/bin/exe-heartbeat.js +17 -4
  14. package/dist/bin/exe-kill.js +17 -4
  15. package/dist/bin/exe-launch-agent.js +17 -4
  16. package/dist/bin/exe-pending-messages.js +17 -4
  17. package/dist/bin/exe-pending-notifications.js +17 -4
  18. package/dist/bin/exe-pending-reviews.js +17 -4
  19. package/dist/bin/exe-review.js +17 -4
  20. package/dist/bin/exe-search.js +23 -8
  21. package/dist/bin/exe-session-cleanup.js +17 -4
  22. package/dist/bin/exe-start-codex.js +209 -32
  23. package/dist/bin/exe-start-opencode.js +17 -4
  24. package/dist/bin/exe-status.js +17 -4
  25. package/dist/bin/exe-team.js +17 -4
  26. package/dist/bin/git-sweep.js +17 -4
  27. package/dist/bin/graph-backfill.js +17 -4
  28. package/dist/bin/graph-export.js +17 -4
  29. package/dist/bin/install.js +42 -0
  30. package/dist/bin/intercom-check.js +17 -4
  31. package/dist/bin/scan-tasks.js +17 -4
  32. package/dist/bin/shard-migrate.js +17 -4
  33. package/dist/bin/update.js +187 -42
  34. package/dist/gateway/index.js +17 -4
  35. package/dist/hooks/bug-report-worker.js +793 -150
  36. package/dist/hooks/codex-stop-task-finalizer.js +3020 -2375
  37. package/dist/hooks/commit-complete.js +156 -6
  38. package/dist/hooks/error-recall.js +23 -8
  39. package/dist/hooks/ingest.js +17 -4
  40. package/dist/hooks/instructions-loaded.js +17 -4
  41. package/dist/hooks/notification.js +17 -4
  42. package/dist/hooks/post-compact.js +17 -4
  43. package/dist/hooks/post-tool-combined.js +23 -8
  44. package/dist/hooks/pre-compact.js +156 -8
  45. package/dist/hooks/pre-tool-use.js +21 -12
  46. package/dist/hooks/prompt-submit.js +23 -8
  47. package/dist/hooks/session-end.js +156 -8
  48. package/dist/hooks/session-start.js +23 -8
  49. package/dist/hooks/stop.js +306 -9
  50. package/dist/hooks/subagent-stop.js +306 -9
  51. package/dist/hooks/summary-worker.js +2 -2
  52. package/dist/index.js +17 -4
  53. package/dist/lib/exe-daemon.js +17 -4
  54. package/dist/lib/hybrid-search.js +23 -8
  55. package/dist/lib/schedules.js +2 -2
  56. package/dist/lib/store.js +17 -4
  57. package/dist/mcp/server.js +36 -10
  58. package/dist/runtime/index.js +17 -4
  59. package/dist/tui/App.js +17 -4
  60. package/package.json +1 -1
@@ -3421,8 +3421,8 @@ function getShardClient(projectName) {
3421
3421
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
3422
3422
  }
3423
3423
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3424
- if (!safeName) {
3425
- throw new Error(`Invalid project name for shard: "${projectName}"`);
3424
+ if (!safeName || safeName === "unknown") {
3425
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
3426
3426
  }
3427
3427
  const cached = _shards.get(safeName);
3428
3428
  if (cached) {
@@ -4291,19 +4291,32 @@ async function flushBatch() {
4291
4291
  const { isShardingEnabled: isShardingEnabled2, getReadyShardClient: getReadyShardClient2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
4292
4292
  if (isShardingEnabled2()) {
4293
4293
  const byProject = /* @__PURE__ */ new Map();
4294
+ let skippedUnknown = 0;
4294
4295
  for (const row of batch) {
4295
- const proj = row.project_name || "unknown";
4296
+ const proj = row.project_name?.trim();
4297
+ if (!proj) {
4298
+ skippedUnknown++;
4299
+ continue;
4300
+ }
4296
4301
  if (!byProject.has(proj)) byProject.set(proj, []);
4297
4302
  byProject.get(proj).push(row);
4298
4303
  }
4304
+ if (skippedUnknown > 0) {
4305
+ process.stderr.write(
4306
+ `[store] Shard skip: ${skippedUnknown} record(s) with empty project_name (kept in main DB only)
4307
+ `
4308
+ );
4309
+ }
4299
4310
  for (const [project, rows] of byProject) {
4300
4311
  try {
4301
4312
  const shardClient = await getReadyShardClient2(project);
4302
4313
  const shardStmts = rows.map(buildStmt);
4303
4314
  await shardClient.batch(shardStmts, "write");
4304
4315
  } catch (err) {
4316
+ const fullError = err instanceof Error ? `${err.name}: ${err.message}${err.stack ? `
4317
+ ${err.stack.split("\n").slice(1, 3).join("\n")}` : ""}` : String(err);
4305
4318
  process.stderr.write(
4306
- `[store] Shard write failed for ${project}: ${err instanceof Error ? err.message : String(err)}
4319
+ `[store] Shard write failed for ${project} (${rows.length} records): ${fullError}
4307
4320
  `
4308
4321
  );
4309
4322
  }
@@ -5657,10 +5670,12 @@ async function hybridSearch(queryText, agentId, options) {
5657
5670
  );
5658
5671
  }
5659
5672
  let rerankerAvailable = false;
5660
- try {
5661
- const { isRerankerAvailable: isRerankerAvailable2 } = await Promise.resolve().then(() => (init_reranker(), reranker_exports));
5662
- rerankerAvailable = isRerankerAvailable2();
5663
- } catch {
5673
+ if (process.env.EXE_IS_DAEMON === "1") {
5674
+ try {
5675
+ const { isRerankerAvailable: isRerankerAvailable2 } = await Promise.resolve().then(() => (init_reranker(), reranker_exports));
5676
+ rerankerAvailable = isRerankerAvailable2();
5677
+ } catch {
5678
+ }
5664
5679
  }
5665
5680
  const broadFetchTopK = config2.scalingRoadmap?.rerankerAutoTrigger?.fetchTopK ?? 150;
5666
5681
  const fetchLimit = effectiveIsBroad ? Math.max(limit * 5, broadFetchTopK) : rerankerAvailable ? Math.max(limit * 4, 60) : Math.max(limit * 3, 30);
@@ -22390,10 +22405,21 @@ function registerSetAgentConfig(server2) {
22390
22405
  const isCoordinator = isCoordinatorRole(agentRole) || (() => {
22391
22406
  try {
22392
22407
  const emp = getEmployee(loadEmployeesSync(), agentId);
22393
- return emp ? isCoordinatorRole(emp.role) : false;
22408
+ if (emp && isCoordinatorRole(emp.role)) return true;
22409
+ } catch {
22410
+ }
22411
+ try {
22412
+ const { getMySession: getMySession2 } = (init_tmux_routing(), __toCommonJS(tmux_routing_exports));
22413
+ const session = getMySession2();
22414
+ if (session && !session.includes("-")) return true;
22394
22415
  } catch {
22395
- return false;
22396
22416
  }
22417
+ try {
22418
+ const { isCoordinatorName: isCoordinatorName2 } = (init_employees(), __toCommonJS(employees_exports));
22419
+ if (isCoordinatorName2(agentId)) return true;
22420
+ } catch {
22421
+ }
22422
+ return false;
22397
22423
  })();
22398
22424
  if (!isCoordinator) {
22399
22425
  return {
@@ -6653,8 +6653,8 @@ function getShardClient(projectName) {
6653
6653
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
6654
6654
  }
6655
6655
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
6656
- if (!safeName) {
6657
- throw new Error(`Invalid project name for shard: "${projectName}"`);
6656
+ if (!safeName || safeName === "unknown") {
6657
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
6658
6658
  }
6659
6659
  const cached = _shards.get(safeName);
6660
6660
  if (cached) {
@@ -7523,19 +7523,32 @@ async function flushBatch() {
7523
7523
  const { isShardingEnabled: isShardingEnabled2, getReadyShardClient: getReadyShardClient2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
7524
7524
  if (isShardingEnabled2()) {
7525
7525
  const byProject = /* @__PURE__ */ new Map();
7526
+ let skippedUnknown = 0;
7526
7527
  for (const row of batch) {
7527
- const proj = row.project_name || "unknown";
7528
+ const proj = row.project_name?.trim();
7529
+ if (!proj) {
7530
+ skippedUnknown++;
7531
+ continue;
7532
+ }
7528
7533
  if (!byProject.has(proj)) byProject.set(proj, []);
7529
7534
  byProject.get(proj).push(row);
7530
7535
  }
7536
+ if (skippedUnknown > 0) {
7537
+ process.stderr.write(
7538
+ `[store] Shard skip: ${skippedUnknown} record(s) with empty project_name (kept in main DB only)
7539
+ `
7540
+ );
7541
+ }
7531
7542
  for (const [project, rows] of byProject) {
7532
7543
  try {
7533
7544
  const shardClient = await getReadyShardClient2(project);
7534
7545
  const shardStmts = rows.map(buildStmt);
7535
7546
  await shardClient.batch(shardStmts, "write");
7536
7547
  } catch (err) {
7548
+ const fullError = err instanceof Error ? `${err.name}: ${err.message}${err.stack ? `
7549
+ ${err.stack.split("\n").slice(1, 3).join("\n")}` : ""}` : String(err);
7537
7550
  process.stderr.write(
7538
- `[store] Shard write failed for ${project}: ${err instanceof Error ? err.message : String(err)}
7551
+ `[store] Shard write failed for ${project} (${rows.length} records): ${fullError}
7539
7552
  `
7540
7553
  );
7541
7554
  }
package/dist/tui/App.js CHANGED
@@ -10913,8 +10913,8 @@ function getShardClient(projectName) {
10913
10913
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
10914
10914
  }
10915
10915
  const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
10916
- if (!safeName) {
10917
- throw new Error(`Invalid project name for shard: "${projectName}"`);
10916
+ if (!safeName || safeName === "unknown") {
10917
+ throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
10918
10918
  }
10919
10919
  const cached = _shards.get(safeName);
10920
10920
  if (cached) {
@@ -11534,19 +11534,32 @@ async function flushBatch() {
11534
11534
  const { isShardingEnabled: isShardingEnabled2, getReadyShardClient: getReadyShardClient2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
11535
11535
  if (isShardingEnabled2()) {
11536
11536
  const byProject = /* @__PURE__ */ new Map();
11537
+ let skippedUnknown = 0;
11537
11538
  for (const row of batch) {
11538
- const proj = row.project_name || "unknown";
11539
+ const proj = row.project_name?.trim();
11540
+ if (!proj) {
11541
+ skippedUnknown++;
11542
+ continue;
11543
+ }
11539
11544
  if (!byProject.has(proj)) byProject.set(proj, []);
11540
11545
  byProject.get(proj).push(row);
11541
11546
  }
11547
+ if (skippedUnknown > 0) {
11548
+ process.stderr.write(
11549
+ `[store] Shard skip: ${skippedUnknown} record(s) with empty project_name (kept in main DB only)
11550
+ `
11551
+ );
11552
+ }
11542
11553
  for (const [project, rows] of byProject) {
11543
11554
  try {
11544
11555
  const shardClient = await getReadyShardClient2(project);
11545
11556
  const shardStmts = rows.map(buildStmt);
11546
11557
  await shardClient.batch(shardStmts, "write");
11547
11558
  } catch (err) {
11559
+ const fullError = err instanceof Error ? `${err.name}: ${err.message}${err.stack ? `
11560
+ ${err.stack.split("\n").slice(1, 3).join("\n")}` : ""}` : String(err);
11548
11561
  process.stderr.write(
11549
- `[store] Shard write failed for ${project}: ${err instanceof Error ? err.message : String(err)}
11562
+ `[store] Shard write failed for ${project} (${rows.length} records): ${fullError}
11550
11563
  `
11551
11564
  );
11552
11565
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.21",
3
+ "version": "0.9.22",
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",