open-agents-ai 0.186.28 → 0.186.30

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 (2) hide show
  1. package/dist/index.js +101 -33
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -49790,47 +49790,90 @@ async function handleSlashCommand(input, ctx) {
49790
49790
  const rest2 = arg?.slice(sub.length).trim() ?? "";
49791
49791
  if (!sub || sub === "status") {
49792
49792
  const nexusDir = ctx.repoRoot ? __require("node:path").join(ctx.repoRoot, ".oa", "nexus") : null;
49793
- const connFile = nexusDir ? __require("node:path").join(nexusDir, "connection.json") : null;
49793
+ const statusFile = nexusDir ? __require("node:path").join(nexusDir, "status.json") : null;
49794
49794
  const { existsSync: ex, readFileSync: rf } = __require("node:fs");
49795
- if (connFile && ex(connFile)) {
49795
+ if (statusFile && ex(statusFile)) {
49796
49796
  try {
49797
- const conn = JSON.parse(rf(connFile, "utf8"));
49798
- process.stdout.write(`
49797
+ const status = JSON.parse(rf(statusFile, "utf8"));
49798
+ if (status.connected && status.peerId) {
49799
+ process.stdout.write(`
49799
49800
  ${c2.bold("Nexus Network Status")}
49800
49801
 
49801
49802
  `);
49802
- process.stdout.write(` ${c2.green("\u25CF")} Connected
49803
+ process.stdout.write(` ${c2.green("\u25CF")} Connected
49804
+ `);
49805
+ process.stdout.write(` Peer ID: ${c2.cyan(status.peerId)}
49803
49806
  `);
49804
- process.stdout.write(` Peer ID: ${c2.cyan(conn.peerId)}
49807
+ process.stdout.write(` Agent: ${status.agentName} (${status.agentType})
49805
49808
  `);
49806
- process.stdout.write(` Agent: ${conn.agentName} (${conn.agentType})
49809
+ process.stdout.write(` Daemon PID: ${status.pid}
49807
49810
  `);
49808
- process.stdout.write(` Since: ${conn.connectedAt}
49811
+ if (status.rooms?.length)
49812
+ process.stdout.write(` Rooms: ${status.rooms.join(", ")}
49809
49813
  `);
49810
- const walletFile = __require("node:path").join(nexusDir, "wallet.enc");
49811
- if (ex(walletFile)) {
49812
- const w = JSON.parse(rf(walletFile, "utf8"));
49813
- process.stdout.write(` Wallet: ${c2.yellow(w.address)}
49814
+ const walletFile = __require("node:path").join(nexusDir, "wallet.enc");
49815
+ if (ex(walletFile)) {
49816
+ try {
49817
+ const w = JSON.parse(rf(walletFile, "utf8"));
49818
+ process.stdout.write(` Wallet: ${c2.yellow(w.address)}
49814
49819
  `);
49820
+ } catch {
49821
+ }
49822
+ }
49823
+ process.stdout.write("\n");
49815
49824
  } else {
49816
- process.stdout.write(` Wallet: ${c2.dim("not configured")}
49825
+ process.stdout.write(`
49826
+ ${c2.yellow("\u25CF")} Daemon running but not yet connected
49827
+ `);
49828
+ process.stdout.write(` PID: ${status.pid || "?"}
49829
+
49817
49830
  `);
49818
49831
  }
49819
- process.stdout.write("\n");
49820
49832
  } catch {
49821
- renderInfo("Nexus connection file exists but could not be read.");
49833
+ process.stdout.write(`
49834
+ ${c2.dim("\u25CF")} Status file unreadable
49835
+
49836
+ `);
49822
49837
  }
49823
49838
  } else {
49824
49839
  process.stdout.write(`
49825
49840
  ${c2.dim("\u25CF")} Not connected to nexus P2P network
49826
49841
  `);
49827
- process.stdout.write(` ${c2.dim("Use")} ${c2.cyan("/nexus connect")} ${c2.dim("or ask the agent to connect via the nexus tool.")}
49842
+ process.stdout.write(` ${c2.dim("Run")} ${c2.cyan("/nexus connect")} ${c2.dim("to start the daemon.")}
49828
49843
 
49829
49844
  `);
49830
49845
  }
49831
- } else if (sub === "connect") {
49832
- renderInfo('To connect, ask the agent: "Connect to the nexus network"');
49833
- renderInfo("The agent will use the nexus tool with proper configuration.");
49846
+ } else if (sub === "connect" || sub === "restart") {
49847
+ renderInfo("Connecting to nexus P2P network...");
49848
+ try {
49849
+ const nexus = new NexusTool(ctx.repoRoot ?? process.cwd());
49850
+ if (sub === "restart") {
49851
+ try {
49852
+ await nexus.execute({ action: "disconnect" });
49853
+ } catch {
49854
+ }
49855
+ await new Promise((r) => setTimeout(r, 1e3));
49856
+ }
49857
+ const result = await nexus.execute({ action: "connect" });
49858
+ const out = typeof result === "object" ? result.output : String(result);
49859
+ if (out.includes("Connected") || out.includes("Already connected")) {
49860
+ renderInfo(out.split("\n").slice(0, 4).join("\n"));
49861
+ try {
49862
+ const pidFile = join60(ctx.repoRoot ?? process.cwd(), ".oa", "nexus", "daemon.pid");
49863
+ if (existsSync44(pidFile)) {
49864
+ const pid = parseInt(readFileSync33(pidFile, "utf8").trim(), 10);
49865
+ if (pid > 0 && !registry.daemons.has("Nexus")) {
49866
+ registry.register({ name: "Nexus", pid, startedAt: Date.now(), status: "running" });
49867
+ }
49868
+ }
49869
+ } catch {
49870
+ }
49871
+ } else {
49872
+ renderWarning(out.slice(0, 200));
49873
+ }
49874
+ } catch (err) {
49875
+ renderError(`Nexus connect failed: ${err instanceof Error ? err.message : String(err)}`);
49876
+ }
49834
49877
  } else if (sub === "wallet") {
49835
49878
  const nexusDir = ctx.repoRoot ? __require("node:path").join(ctx.repoRoot, ".oa", "nexus") : null;
49836
49879
  const walletFile = nexusDir ? __require("node:path").join(nexusDir, "wallet.enc") : null;
@@ -51200,7 +51243,7 @@ Clone a new voice: /voice clone <wav-file> [name]`);
51200
51243
  return "handled";
51201
51244
  }
51202
51245
  const { loadSponsorConfig: loadSponsorConfig2, saveSponsorConfig: saveSponsorConfig2, runSponsorWizard: runSponsorWizard2, showSponsorDashboard: showSponsorDashboard2 } = await Promise.resolve().then(() => (init_sponsor_wizard(), sponsor_wizard_exports));
51203
- const projectDir = process.cwd();
51246
+ const projectDir = ctx.repoRoot ?? process.cwd();
51204
51247
  const existingConfig = loadSponsorConfig2(projectDir);
51205
51248
  const sponsorRl = ctx.rl;
51206
51249
  if (arg === "pause" && existingConfig?.status === "active") {
@@ -71994,23 +72037,48 @@ Rationale: ${proposal.rationale}${provenanceNote}`;
71994
72037
  }
71995
72038
  try {
71996
72039
  const autoNexus = new NexusTool(repoRoot);
71997
- autoNexus.execute({ action: "connect" }).then((r) => {
71998
- if (r.success && r.output.includes("Connected")) {
71999
- writeContent(() => renderInfo("Nexus P2P network connected."));
72000
- try {
72001
- const nexusPidFile = join75(repoRoot, ".oa", "nexus", "daemon.pid");
72002
- if (existsSync58(nexusPidFile)) {
72003
- const nPid = parseInt(readFileSync47(nexusPidFile, "utf8").trim(), 10);
72004
- if (nPid > 0 && !registry.daemons.has("Nexus")) {
72005
- registry.register({ name: "Nexus", pid: nPid, startedAt: Date.now(), status: "running" });
72006
- statusBar.ensureMonitorTimer();
72040
+ const _registerNexusDaemon = () => {
72041
+ try {
72042
+ const nexusPidFile = join75(repoRoot, ".oa", "nexus", "daemon.pid");
72043
+ if (existsSync58(nexusPidFile)) {
72044
+ const nPid = parseInt(readFileSync47(nexusPidFile, "utf8").trim(), 10);
72045
+ if (nPid > 0 && !registry.daemons.has("Nexus")) {
72046
+ registry.register({ name: "Nexus", pid: nPid, startedAt: Date.now(), status: "running" });
72047
+ statusBar.ensureMonitorTimer();
72048
+ }
72049
+ }
72050
+ } catch {
72051
+ }
72052
+ };
72053
+ const _tryNexusConnect = async (attempt) => {
72054
+ try {
72055
+ const r = await autoNexus.execute({ action: "connect" });
72056
+ const out = r.output || String(r);
72057
+ if (out.includes("Connected") || out.includes("Already connected")) {
72058
+ writeContent(() => renderInfo("Nexus P2P network connected."));
72059
+ _registerNexusDaemon();
72060
+ } else if (out.includes("failed") || out.includes("Error")) {
72061
+ if (attempt < 2) {
72062
+ await new Promise((r2) => setTimeout(r2, 5e3));
72063
+ return _tryNexusConnect(attempt + 1);
72064
+ }
72065
+ writeContent(() => renderWarning(`Nexus auto-connect failed: ${out.slice(0, 100)}`));
72066
+ } else if (out.includes("still connecting") || out.includes("spawned")) {
72067
+ for (let i = 0; i < 30; i++) {
72068
+ await new Promise((r2) => setTimeout(r2, 1e3));
72069
+ const sr = await autoNexus.execute({ action: "status" });
72070
+ const so = sr.output || String(sr);
72071
+ if (/Connected:\s*true/i.test(so)) {
72072
+ writeContent(() => renderInfo("Nexus P2P network connected."));
72073
+ _registerNexusDaemon();
72074
+ return;
72007
72075
  }
72008
72076
  }
72009
- } catch {
72010
72077
  }
72078
+ } catch {
72011
72079
  }
72012
- }).catch(() => {
72013
- });
72080
+ };
72081
+ _tryNexusConnect(1);
72014
72082
  } catch {
72015
72083
  }
72016
72084
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.186.28",
3
+ "version": "0.186.30",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",