@askexenow/exe-os 0.8.85 → 0.8.87

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 (57) hide show
  1. package/dist/bin/cleanup-stale-review-tasks.js +57 -19
  2. package/dist/bin/cli.js +510 -340
  3. package/dist/bin/exe-agent-config.js +242 -0
  4. package/dist/bin/exe-agent.js +3 -3
  5. package/dist/bin/exe-boot.js +344 -346
  6. package/dist/bin/exe-dispatch.js +375 -250
  7. package/dist/bin/exe-forget.js +5 -1
  8. package/dist/bin/exe-gateway.js +260 -135
  9. package/dist/bin/exe-healthcheck.js +133 -1
  10. package/dist/bin/exe-heartbeat.js +72 -31
  11. package/dist/bin/exe-link.js +25 -2
  12. package/dist/bin/exe-new-employee.js +22 -0
  13. package/dist/bin/exe-pending-messages.js +55 -17
  14. package/dist/bin/exe-pending-reviews.js +57 -19
  15. package/dist/bin/exe-search.js +6 -2
  16. package/dist/bin/exe-session-cleanup.js +260 -135
  17. package/dist/bin/exe-start-codex.js +2598 -0
  18. package/dist/bin/exe-start.sh +15 -3
  19. package/dist/bin/exe-status.js +57 -19
  20. package/dist/bin/git-sweep.js +391 -266
  21. package/dist/bin/install.js +22 -0
  22. package/dist/bin/scan-tasks.js +394 -269
  23. package/dist/bin/setup.js +50 -5
  24. package/dist/gateway/index.js +257 -132
  25. package/dist/hooks/bug-report-worker.js +242 -117
  26. package/dist/hooks/commit-complete.js +389 -264
  27. package/dist/hooks/error-recall.js +6 -2
  28. package/dist/hooks/ingest-worker.js +314 -193
  29. package/dist/hooks/post-compact.js +84 -46
  30. package/dist/hooks/pre-compact.js +272 -147
  31. package/dist/hooks/pre-tool-use.js +104 -66
  32. package/dist/hooks/prompt-submit.js +126 -66
  33. package/dist/hooks/session-end.js +277 -152
  34. package/dist/hooks/session-start.js +70 -28
  35. package/dist/hooks/stop.js +90 -52
  36. package/dist/hooks/subagent-stop.js +84 -46
  37. package/dist/hooks/summary-worker.js +175 -114
  38. package/dist/index.js +296 -171
  39. package/dist/lib/agent-config.js +167 -0
  40. package/dist/lib/cloud-sync.js +25 -2
  41. package/dist/lib/exe-daemon.js +338 -213
  42. package/dist/lib/hybrid-search.js +7 -2
  43. package/dist/lib/messaging.js +95 -39
  44. package/dist/lib/runtime-table.js +16 -0
  45. package/dist/lib/session-wrappers.js +22 -0
  46. package/dist/lib/tasks.js +242 -117
  47. package/dist/lib/tmux-routing.js +314 -189
  48. package/dist/mcp/server.js +573 -274
  49. package/dist/mcp/tools/create-task.js +260 -135
  50. package/dist/mcp/tools/list-tasks.js +68 -30
  51. package/dist/mcp/tools/send-message.js +100 -44
  52. package/dist/mcp/tools/update-task.js +123 -67
  53. package/dist/runtime/index.js +276 -151
  54. package/dist/tui/App.js +479 -354
  55. package/package.json +1 -1
  56. package/src/commands/exe/agent-config.md +27 -0
  57. package/src/commands/exe/cc-doctor.md +10 -0
package/dist/bin/setup.js CHANGED
@@ -3454,10 +3454,18 @@ function buildRosterBlob(paths) {
3454
3454
  } catch {
3455
3455
  }
3456
3456
  }
3457
+ let agentConfig;
3458
+ const agentConfigPath = path8.join(EXE_AI_DIR, "agent-config.json");
3459
+ if (existsSync8(agentConfigPath)) {
3460
+ try {
3461
+ agentConfig = JSON.parse(readFileSync6(agentConfigPath, "utf-8"));
3462
+ } catch {
3463
+ }
3464
+ }
3457
3465
  const deletedNames = consumeRosterDeletions();
3458
- const content = JSON.stringify({ roster, identities, config, deletedNames });
3466
+ const content = JSON.stringify({ roster, identities, config, agentConfig, deletedNames });
3459
3467
  const hash = crypto2.createHash("sha256").update(content).digest("hex").slice(0, 16);
3460
- return { roster, identities, config, deletedNames, version: hash };
3468
+ return { roster, identities, config, agentConfig, deletedNames, version: hash };
3461
3469
  }
3462
3470
  async function cloudPushRoster(config) {
3463
3471
  assertSecureEndpoint(config.endpoint);
@@ -3595,6 +3603,21 @@ async function mergeRosterFromRemote(remote, paths) {
3595
3603
  } catch {
3596
3604
  }
3597
3605
  }
3606
+ if (remote.agentConfig && Object.keys(remote.agentConfig).length > 0) {
3607
+ try {
3608
+ const agentConfigPath = path8.join(EXE_AI_DIR, "agent-config.json");
3609
+ let local = {};
3610
+ if (existsSync8(agentConfigPath)) {
3611
+ try {
3612
+ local = JSON.parse(readFileSync6(agentConfigPath, "utf-8"));
3613
+ } catch {
3614
+ }
3615
+ }
3616
+ const merged = { ...remote.agentConfig, ...local };
3617
+ writeFileSync4(agentConfigPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
3618
+ } catch {
3619
+ }
3620
+ }
3598
3621
  return { added, identitiesUpdated };
3599
3622
  });
3600
3623
  }
@@ -5520,6 +5543,28 @@ exec "${exeStartDst}" "$0" "$@"
5520
5543
  created++;
5521
5544
  }
5522
5545
  }
5546
+ const codexLauncherCandidates = [
5547
+ path10.join(packageRoot, "dist", "bin", "exe-start-codex.js"),
5548
+ path10.join(packageRoot, "src", "bin", "exe-start-codex.ts")
5549
+ ];
5550
+ let codexLauncher = null;
5551
+ for (const c of codexLauncherCandidates) {
5552
+ if (existsSync10(c)) {
5553
+ codexLauncher = c;
5554
+ break;
5555
+ }
5556
+ }
5557
+ if (codexLauncher) {
5558
+ for (const emp of employees) {
5559
+ const wrapperPath = path10.join(binDir, `${emp.name}-codex`);
5560
+ const content = `#!/bin/bash
5561
+ exec node "${codexLauncher}" --agent ${emp.name} "$@"
5562
+ `;
5563
+ writeFileSync6(wrapperPath, content);
5564
+ chmodSync(wrapperPath, 493);
5565
+ created++;
5566
+ }
5567
+ }
5523
5568
  const pathConfigured = ensurePath(home, binDir);
5524
5569
  return { created, pathConfigured };
5525
5570
  }
@@ -5824,7 +5869,7 @@ async function runSetupWizard(opts = {}) {
5824
5869
  log("backed up on Exe Cloud. Free for all plans. We can't read your data \u2014");
5825
5870
  log("only your encryption key can decrypt it.");
5826
5871
  log("");
5827
- const existingKey = await ask(rl, "Do you have an existing API key? (paste it, or press Enter to skip): ");
5872
+ const existingKey = await ask(rl, "Paste your Exe OS license key, or press Enter to start as a free user: ");
5828
5873
  if (existingKey && existingKey.startsWith("exe_sk_")) {
5829
5874
  const cloudEndpoint = "https://askexe.com/cloud";
5830
5875
  try {
@@ -6100,7 +6145,7 @@ async function runSetupWizard(opts = {}) {
6100
6145
  }
6101
6146
  let isLicensed = license.valid && license.plan !== "free";
6102
6147
  if (!isLicensed) {
6103
- let licenseInput = await ask(rl, "Do you have an Exe OS license key? (press Enter to skip for free plan): ");
6148
+ let licenseInput = await ask(rl, "Hire other employees with your Exe OS license key, or press Enter to continue as a free user (COO only): ");
6104
6149
  if (licenseInput && !licenseInput.startsWith("exe_sk_")) {
6105
6150
  log("That doesn't look like a license key (should start with exe_sk_).");
6106
6151
  licenseInput = await ask(rl, "Try again (or press Enter to skip): ");
@@ -6270,7 +6315,7 @@ async function runSetupWizard(opts = {}) {
6270
6315
  };
6271
6316
  log("");
6272
6317
  log(` ${"\u2554" + "\u2550".repeat(W) + "\u2557"}`);
6273
- log(` ${"\u2551" + center("e x e O S") + "\u2551"}`);
6318
+ log(` ${"\u2551" + center("E X E O S") + "\u2551"}`);
6274
6319
  if (version) log(` ${"\u2551" + center(`v${version}`) + "\u2551"}`);
6275
6320
  log(` ${"\u255A" + "\u2550".repeat(W) + "\u255D"}`);
6276
6321
  log("");