@askexenow/exe-os 0.9.113 → 0.9.115

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 (86) hide show
  1. package/dist/bin/agentic-ontology-backfill.js +36 -12
  2. package/dist/bin/agentic-reflection-backfill.js +36 -12
  3. package/dist/bin/agentic-semantic-label.js +36 -12
  4. package/dist/bin/backfill-conversations.js +36 -12
  5. package/dist/bin/backfill-responses.js +36 -12
  6. package/dist/bin/backfill-vectors.js +36 -12
  7. package/dist/bin/bulk-sync-postgres.js +36 -12
  8. package/dist/bin/cleanup-stale-review-tasks.js +470 -113
  9. package/dist/bin/cli.js +413 -62
  10. package/dist/bin/exe-agent.js +27 -0
  11. package/dist/bin/exe-assign.js +36 -12
  12. package/dist/bin/exe-boot.js +246 -54
  13. package/dist/bin/exe-call.js +8 -0
  14. package/dist/bin/exe-cloud.js +47 -12
  15. package/dist/bin/exe-dispatch.js +348 -53
  16. package/dist/bin/exe-doctor.js +51 -13
  17. package/dist/bin/exe-export-behaviors.js +37 -12
  18. package/dist/bin/exe-forget.js +36 -12
  19. package/dist/bin/exe-gateway.js +348 -53
  20. package/dist/bin/exe-heartbeat.js +471 -113
  21. package/dist/bin/exe-kill.js +36 -12
  22. package/dist/bin/exe-launch-agent.js +117 -18
  23. package/dist/bin/exe-new-employee.js +9 -1
  24. package/dist/bin/exe-pending-messages.js +452 -95
  25. package/dist/bin/exe-pending-notifications.js +452 -95
  26. package/dist/bin/exe-pending-reviews.js +452 -95
  27. package/dist/bin/exe-rename.js +36 -12
  28. package/dist/bin/exe-review.js +36 -12
  29. package/dist/bin/exe-search.js +37 -12
  30. package/dist/bin/exe-session-cleanup.js +348 -53
  31. package/dist/bin/exe-settings.js +12 -0
  32. package/dist/bin/exe-start-codex.js +46 -13
  33. package/dist/bin/exe-start-opencode.js +46 -13
  34. package/dist/bin/exe-status.js +460 -114
  35. package/dist/bin/exe-support.js +12 -0
  36. package/dist/bin/exe-team.js +36 -12
  37. package/dist/bin/git-sweep.js +348 -53
  38. package/dist/bin/graph-backfill.js +36 -12
  39. package/dist/bin/graph-export.js +36 -12
  40. package/dist/bin/install.js +9 -1
  41. package/dist/bin/intercom-check.js +255 -53
  42. package/dist/bin/scan-tasks.js +348 -53
  43. package/dist/bin/setup.js +74 -12
  44. package/dist/bin/shard-migrate.js +36 -12
  45. package/dist/gateway/index.js +348 -53
  46. package/dist/hooks/bug-report-worker.js +348 -53
  47. package/dist/hooks/codex-stop-task-finalizer.js +308 -37
  48. package/dist/hooks/commit-complete.js +348 -53
  49. package/dist/hooks/error-recall.js +37 -12
  50. package/dist/hooks/ingest.js +363 -54
  51. package/dist/hooks/instructions-loaded.js +36 -12
  52. package/dist/hooks/notification.js +36 -12
  53. package/dist/hooks/post-compact.js +426 -72
  54. package/dist/hooks/post-tool-combined.js +501 -146
  55. package/dist/hooks/pre-compact.js +348 -53
  56. package/dist/hooks/pre-tool-use.js +92 -13
  57. package/dist/hooks/prompt-submit.js +348 -53
  58. package/dist/hooks/session-end.js +158 -53
  59. package/dist/hooks/session-start.js +66 -13
  60. package/dist/hooks/stop.js +420 -72
  61. package/dist/hooks/subagent-stop.js +419 -72
  62. package/dist/hooks/summary-worker.js +442 -121
  63. package/dist/index.js +375 -53
  64. package/dist/lib/agent-config.js +8 -0
  65. package/dist/lib/cloud-sync.js +35 -12
  66. package/dist/lib/config.js +13 -0
  67. package/dist/lib/consolidation.js +9 -1
  68. package/dist/lib/embedder.js +13 -0
  69. package/dist/lib/employees.js +8 -0
  70. package/dist/lib/exe-daemon.js +524 -60
  71. package/dist/lib/hybrid-search.js +37 -12
  72. package/dist/lib/keychain.js +25 -13
  73. package/dist/lib/messaging.js +395 -74
  74. package/dist/lib/schedules.js +36 -12
  75. package/dist/lib/skill-learning.js +21 -0
  76. package/dist/lib/store.js +36 -12
  77. package/dist/lib/tasks.js +324 -41
  78. package/dist/lib/tmux-routing.js +324 -41
  79. package/dist/mcp/server.js +374 -54
  80. package/dist/mcp/tools/create-task.js +324 -41
  81. package/dist/mcp/tools/list-tasks.js +406 -57
  82. package/dist/mcp/tools/send-message.js +395 -74
  83. package/dist/mcp/tools/update-task.js +324 -41
  84. package/dist/runtime/index.js +375 -53
  85. package/dist/tui/App.js +377 -55
  86. package/package.json +1 -1
@@ -25,7 +25,7 @@ __export(keychain_exports, {
25
25
  importMnemonic: () => importMnemonic,
26
26
  setMasterKey: () => setMasterKey
27
27
  });
28
- import { readFile, writeFile, unlink, mkdir, chmod } from "fs/promises";
28
+ import { readFile, writeFile, unlink, mkdir, chmod, rename, copyFile } from "fs/promises";
29
29
  import { existsSync, statSync } from "fs";
30
30
  import { execSync } from "child_process";
31
31
  import path from "path";
@@ -60,12 +60,14 @@ function linuxSecretAvailable() {
60
60
  function isRootOnlyTrustedServerKeyFile(keyPath) {
61
61
  if (process.platform !== "linux") return false;
62
62
  try {
63
- const uid = typeof os.userInfo().uid === "number" ? os.userInfo().uid : -1;
64
63
  const st = statSync(keyPath);
65
64
  if (!st.isFile() || (st.mode & 63) !== 0) return false;
65
+ const uid = typeof os.userInfo().uid === "number" ? os.userInfo().uid : -1;
66
66
  if (uid === 0) return true;
67
67
  const exeOsDir = process.env.EXE_OS_DIR;
68
- return Boolean(exeOsDir && path.resolve(keyPath).startsWith(path.resolve(exeOsDir) + path.sep));
68
+ if (exeOsDir && path.resolve(keyPath).startsWith(path.resolve(exeOsDir) + path.sep)) return true;
69
+ if (!linuxSecretAvailable()) return true;
70
+ return false;
69
71
  } catch {
70
72
  return false;
71
73
  }
@@ -215,15 +217,25 @@ async function writeMachineBoundFileFallback(b64) {
215
217
  await mkdir(dir, { recursive: true });
216
218
  const keyPath = getKeyPath();
217
219
  const machineKey = deriveMachineKey();
218
- if (machineKey) {
219
- const encrypted = encryptWithMachineKey(b64, machineKey);
220
- await writeFile(keyPath, encrypted + "\n", "utf-8");
221
- await chmod(keyPath, 384);
222
- return "encrypted";
220
+ const content = machineKey ? encryptWithMachineKey(b64, machineKey) + "\n" : b64 + "\n";
221
+ const result = machineKey ? "encrypted" : "plaintext";
222
+ const tmpPath = keyPath + ".tmp";
223
+ try {
224
+ if (existsSync(keyPath)) {
225
+ await copyFile(keyPath, keyPath + ".bak").catch(() => {
226
+ });
227
+ }
228
+ await writeFile(tmpPath, content, "utf-8");
229
+ await chmod(tmpPath, 384);
230
+ await rename(tmpPath, keyPath);
231
+ } catch (err) {
232
+ try {
233
+ await unlink(tmpPath);
234
+ } catch {
235
+ }
236
+ throw err;
223
237
  }
224
- await writeFile(keyPath, b64 + "\n", "utf-8");
225
- await chmod(keyPath, 384);
226
- return "plaintext";
238
+ return result;
227
239
  }
228
240
  async function getMasterKey() {
229
241
  let nativeValue = macKeychainGet() ?? linuxSecretGet();
@@ -290,7 +302,7 @@ async function getMasterKey() {
290
302
  b64Value = content;
291
303
  }
292
304
  const key = Buffer.from(b64Value, "base64");
293
- if (!content.startsWith(ENCRYPTED_PREFIX) && isRootOnlyTrustedServerKeyFile(keyPath)) {
305
+ if (isRootOnlyTrustedServerKeyFile(keyPath)) {
294
306
  return key;
295
307
  }
296
308
  const migrated = macKeychainSet(b64Value) || linuxSecretSet(b64Value);
@@ -625,6 +637,17 @@ function normalizeOrchestration(raw) {
625
637
  const userOrg = raw.orchestration ?? {};
626
638
  raw.orchestration = { ...defaultOrg, ...userOrg };
627
639
  }
640
+ function normalizeCloudEndpoint(raw) {
641
+ const cloud = raw.cloud;
642
+ if (!cloud?.endpoint) return;
643
+ const ep = String(cloud.endpoint);
644
+ if (ep === "https://askexe.com/cloud" || ep === "https://askexe.com/cloud/") {
645
+ cloud.endpoint = "https://cloud.askexe.com";
646
+ process.stderr.write(
647
+ "[config] Auto-migrated cloud endpoint: askexe.com/cloud \u2192 cloud.askexe.com\n"
648
+ );
649
+ }
650
+ }
628
651
  async function loadConfig() {
629
652
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
630
653
  await ensurePrivateDir(dir);
@@ -650,6 +673,7 @@ async function loadConfig() {
650
673
  normalizeSessionLifecycle(migratedCfg);
651
674
  normalizeAutoUpdate(migratedCfg);
652
675
  normalizeOrchestration(migratedCfg);
676
+ normalizeCloudEndpoint(migratedCfg);
653
677
  const config = { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
654
678
  if (config.dbPath.startsWith("~")) {
655
679
  config.dbPath = config.dbPath.replace(/^~/, os2.homedir());
@@ -4761,6 +4785,7 @@ __export(cloud_sync_exports, {
4761
4785
  markCloudReuploadRequired: () => markCloudReuploadRequired,
4762
4786
  mergeConfig: () => mergeConfig,
4763
4787
  mergeRosterFromRemote: () => mergeRosterFromRemote,
4788
+ migrateEndpoint: () => migrateEndpoint,
4764
4789
  pushToPostgres: () => pushToPostgres,
4765
4790
  recordRosterDeletion: () => recordRosterDeletion
4766
4791
  });
@@ -4931,6 +4956,15 @@ async function fetchWithRetry(url, init) {
4931
4956
  }
4932
4957
  throw lastError;
4933
4958
  }
4959
+ function migrateEndpoint(endpoint) {
4960
+ if (endpoint === "https://askexe.com/cloud" || endpoint === "https://askexe.com/cloud/") {
4961
+ process.stderr.write(
4962
+ "[cloud-sync] Auto-migrating endpoint from askexe.com/cloud to cloud.askexe.com (bypasses Cloudflare WAF for datacenter IPs)\n"
4963
+ );
4964
+ return "https://cloud.askexe.com";
4965
+ }
4966
+ return endpoint;
4967
+ }
4934
4968
  function assertSecureEndpoint(endpoint) {
4935
4969
  if (endpoint.startsWith("https://")) return;
4936
4970
  if (endpoint.startsWith("http://")) {
@@ -5068,6 +5102,7 @@ async function markCloudReuploadRequired(client = getClient()) {
5068
5102
  await client.execute("INSERT OR REPLACE INTO sync_meta (key, value) VALUES ('cloud_reupload_required', '1')");
5069
5103
  }
5070
5104
  async function cloudSync(config) {
5105
+ config = { ...config, endpoint: migrateEndpoint(config.endpoint) };
5071
5106
  if (!isSyncCryptoInitialized()) {
5072
5107
  try {
5073
5108
  const { getMasterKey: getMasterKey2 } = await Promise.resolve().then(() => (init_keychain(), keychain_exports));