@askexenow/exe-os 0.9.38 → 0.9.39

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 (69) hide show
  1. package/dist/bin/backfill-conversations.js +34 -7
  2. package/dist/bin/backfill-responses.js +34 -7
  3. package/dist/bin/backfill-vectors.js +34 -7
  4. package/dist/bin/cleanup-stale-review-tasks.js +35 -8
  5. package/dist/bin/cli.js +72 -42
  6. package/dist/bin/exe-agent.js +11 -3
  7. package/dist/bin/exe-assign.js +34 -7
  8. package/dist/bin/exe-boot.js +48 -18
  9. package/dist/bin/exe-call.js +132 -340
  10. package/dist/bin/exe-dispatch.js +34 -7
  11. package/dist/bin/exe-doctor.js +37 -10
  12. package/dist/bin/exe-export-behaviors.js +36 -9
  13. package/dist/bin/exe-forget.js +34 -7
  14. package/dist/bin/exe-gateway.js +40 -12
  15. package/dist/bin/exe-heartbeat.js +35 -8
  16. package/dist/bin/exe-kill.js +34 -7
  17. package/dist/bin/exe-launch-agent.js +285 -1079
  18. package/dist/bin/exe-new-employee.js +29 -10
  19. package/dist/bin/exe-pending-messages.js +34 -7
  20. package/dist/bin/exe-pending-notifications.js +34 -7
  21. package/dist/bin/exe-pending-reviews.js +34 -7
  22. package/dist/bin/exe-rename.js +41 -13
  23. package/dist/bin/exe-review.js +34 -7
  24. package/dist/bin/exe-search.js +36 -9
  25. package/dist/bin/exe-session-cleanup.js +36 -9
  26. package/dist/bin/exe-start-codex.js +36 -9
  27. package/dist/bin/exe-start-opencode.js +36 -9
  28. package/dist/bin/exe-status.js +35 -8
  29. package/dist/bin/exe-team.js +34 -7
  30. package/dist/bin/git-sweep.js +34 -7
  31. package/dist/bin/graph-backfill.js +34 -7
  32. package/dist/bin/graph-export.js +34 -7
  33. package/dist/bin/install.js +2 -1
  34. package/dist/bin/intercom-check.js +36 -9
  35. package/dist/bin/scan-tasks.js +34 -7
  36. package/dist/bin/setup.js +18 -17
  37. package/dist/bin/shard-migrate.js +34 -7
  38. package/dist/gateway/index.js +38 -10
  39. package/dist/hooks/bug-report-worker.js +38 -10
  40. package/dist/hooks/codex-stop-task-finalizer.js +36 -9
  41. package/dist/hooks/commit-complete.js +34 -7
  42. package/dist/hooks/error-recall.js +36 -9
  43. package/dist/hooks/ingest.js +36 -8
  44. package/dist/hooks/instructions-loaded.js +42 -10
  45. package/dist/hooks/notification.js +34 -7
  46. package/dist/hooks/post-compact.js +34 -7
  47. package/dist/hooks/post-tool-combined.js +37 -10
  48. package/dist/hooks/pre-compact.js +35 -8
  49. package/dist/hooks/pre-tool-use.js +36 -8
  50. package/dist/hooks/prompt-submit.js +41 -13
  51. package/dist/hooks/session-end.js +35 -8
  52. package/dist/hooks/session-start.js +47 -14
  53. package/dist/hooks/stop.js +35 -8
  54. package/dist/hooks/subagent-stop.js +34 -7
  55. package/dist/hooks/summary-worker.js +43 -16
  56. package/dist/index.js +36 -8
  57. package/dist/lib/consolidation.js +2 -1
  58. package/dist/lib/employee-templates.js +2 -1
  59. package/dist/lib/employees.js +2 -1
  60. package/dist/lib/exe-daemon.js +136 -36
  61. package/dist/lib/hybrid-search.js +36 -9
  62. package/dist/lib/identity.js +8 -3
  63. package/dist/lib/schedules.js +34 -7
  64. package/dist/lib/store.js +34 -7
  65. package/dist/mcp/server.js +133 -33
  66. package/dist/mcp/tools/create-task.js +10 -4
  67. package/dist/runtime/index.js +34 -7
  68. package/dist/tui/App.js +40 -11
  69. package/package.json +1 -1
package/dist/tui/App.js CHANGED
@@ -1071,7 +1071,8 @@ function isMultiInstance(agentName, employees) {
1071
1071
  return MULTI_INSTANCE_ROLES.has(emp.role.toLowerCase());
1072
1072
  }
1073
1073
  function addEmployee(employees, employee) {
1074
- const normalized = { ...employee, name: employee.name.toLowerCase() };
1074
+ const { systemPrompt: _legacyPrompt, ...rest } = employee;
1075
+ const normalized = { ...rest, name: employee.name.toLowerCase() };
1075
1076
  if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
1076
1077
  throw new Error(`Employee '${normalized.name}' already exists`);
1077
1078
  }
@@ -3872,8 +3873,8 @@ async function validateLicense(apiKey, deviceId) {
3872
3873
  }
3873
3874
  function getCacheAgeMs() {
3874
3875
  try {
3875
- const { statSync: statSync2 } = __require("fs");
3876
- const s = statSync2(CACHE_PATH);
3876
+ const { statSync: statSync3 } = __require("fs");
3877
+ const s = statSync3(CACHE_PATH);
3877
3878
  return Date.now() - s.mtimeMs;
3878
3879
  } catch {
3879
3880
  return Infinity;
@@ -11293,7 +11294,7 @@ __export(shard_manager_exports, {
11293
11294
  shardExists: () => shardExists
11294
11295
  });
11295
11296
  import path27 from "path";
11296
- import { existsSync as existsSync17, mkdirSync as mkdirSync7, readdirSync as readdirSync4 } from "fs";
11297
+ import { existsSync as existsSync17, mkdirSync as mkdirSync7, readdirSync as readdirSync4, renameSync as renameSync4, statSync as statSync2 } from "fs";
11297
11298
  import { createClient as createClient2 } from "@libsql/client";
11298
11299
  function initShardManager(encryptionKey) {
11299
11300
  _encryptionKey = encryptionKey;
@@ -11315,7 +11316,7 @@ function getShardClient(projectName) {
11315
11316
  if (!_encryptionKey) {
11316
11317
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
11317
11318
  }
11318
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
11319
+ const safeName = safeShardName(projectName);
11319
11320
  if (!safeName || safeName === "unknown") {
11320
11321
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
11321
11322
  }
@@ -11337,9 +11338,12 @@ function getShardClient(projectName) {
11337
11338
  return client;
11338
11339
  }
11339
11340
  function shardExists(projectName) {
11340
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
11341
+ const safeName = safeShardName(projectName);
11341
11342
  return existsSync17(path27.join(SHARDS_DIR, `${safeName}.db`));
11342
11343
  }
11344
+ function safeShardName(projectName) {
11345
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
11346
+ }
11343
11347
  function listShards() {
11344
11348
  if (!existsSync17(SHARDS_DIR)) return [];
11345
11349
  return readdirSync4(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -11433,7 +11437,8 @@ async function ensureShardSchema(client) {
11433
11437
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
11434
11438
  "ALTER TABLE memories ADD COLUMN audience TEXT",
11435
11439
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
11436
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
11440
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
11441
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
11437
11442
  ]) {
11438
11443
  try {
11439
11444
  await client.execute(col);
@@ -11529,9 +11534,32 @@ async function ensureShardSchema(client) {
11529
11534
  }
11530
11535
  }
11531
11536
  async function getReadyShardClient(projectName) {
11532
- const client = getShardClient(projectName);
11533
- await ensureShardSchema(client);
11534
- return client;
11537
+ const safeName = safeShardName(projectName);
11538
+ let client = getShardClient(projectName);
11539
+ try {
11540
+ await ensureShardSchema(client);
11541
+ return client;
11542
+ } catch (err) {
11543
+ const message = err instanceof Error ? err.message : String(err);
11544
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
11545
+ client.close();
11546
+ _shards.delete(safeName);
11547
+ _shardLastAccess.delete(safeName);
11548
+ const dbPath = path27.join(SHARDS_DIR, `${safeName}.db`);
11549
+ if (existsSync17(dbPath)) {
11550
+ const stat = statSync2(dbPath);
11551
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
11552
+ const archivedPath = path27.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
11553
+ renameSync4(dbPath, archivedPath);
11554
+ process.stderr.write(
11555
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
11556
+ `
11557
+ );
11558
+ }
11559
+ client = getShardClient(projectName);
11560
+ await ensureShardSchema(client);
11561
+ return client;
11562
+ }
11535
11563
  }
11536
11564
  function evictLRU() {
11537
11565
  let oldest = null;
@@ -18974,7 +19002,8 @@ When you need to assign work to another employee (e.g., CTO assigns to an engine
18974
19002
  var PROCEDURES_MARKER = "EXE OS \u2014 VISION AND NON-NEGOTIABLE PRINCIPLES";
18975
19003
  function getSessionPrompt(storedPrompt) {
18976
19004
  const markerIndex = storedPrompt.indexOf(PROCEDURES_MARKER);
18977
- const rolePrompt = markerIndex >= 0 ? storedPrompt.slice(0, markerIndex).trimEnd() : storedPrompt;
19005
+ const withoutProcedures = markerIndex >= 0 ? storedPrompt.slice(0, markerIndex).trimEnd() : storedPrompt;
19006
+ const rolePrompt = withoutProcedures.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "").replace(/<!--[\s\S]*?-->/g, "").trimStart();
18978
19007
  const globalBlock = getGlobalProceduresBlock();
18979
19008
  return `${globalBlock}${rolePrompt}
18980
19009
  ${BASE_OPERATING_PROCEDURES}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.38",
3
+ "version": "0.9.39",
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",