open-agents-ai 0.185.47 → 0.185.49

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 +137 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -41345,6 +41345,91 @@ var init_tui_select = __esm({
41345
41345
  }
41346
41346
  });
41347
41347
 
41348
+ // packages/cli/dist/tui/daemon-registry.js
41349
+ var DaemonRegistry, registry;
41350
+ var init_daemon_registry = __esm({
41351
+ "packages/cli/dist/tui/daemon-registry.js"() {
41352
+ "use strict";
41353
+ DaemonRegistry = class {
41354
+ daemons = /* @__PURE__ */ new Map();
41355
+ subAgents = /* @__PURE__ */ new Map();
41356
+ register(daemon) {
41357
+ this.daemons.set(daemon.name, daemon);
41358
+ }
41359
+ unregister(name) {
41360
+ this.daemons.delete(name);
41361
+ }
41362
+ registerAgent(agent) {
41363
+ this.subAgents.set(agent.id, agent);
41364
+ }
41365
+ unregisterAgent(id) {
41366
+ this.subAgents.delete(id);
41367
+ }
41368
+ /** Check if PIDs are still alive, update status accordingly */
41369
+ refresh() {
41370
+ for (const [, d] of this.daemons) {
41371
+ if (d.status === "stopped" || d.status === "error")
41372
+ continue;
41373
+ try {
41374
+ process.kill(d.pid, 0);
41375
+ if (d.status === "starting")
41376
+ d.status = "running";
41377
+ } catch {
41378
+ d.status = "stopped";
41379
+ }
41380
+ }
41381
+ }
41382
+ /** Kill all tracked daemons (called on exit/update) */
41383
+ killAll() {
41384
+ const pids = [];
41385
+ for (const [, d] of this.daemons) {
41386
+ try {
41387
+ process.kill(d.pid, "SIGTERM");
41388
+ pids.push(d.pid);
41389
+ } catch {
41390
+ }
41391
+ }
41392
+ if (pids.length > 0) {
41393
+ setTimeout(() => {
41394
+ for (const pid of pids) {
41395
+ try {
41396
+ process.kill(pid, "SIGKILL");
41397
+ } catch {
41398
+ }
41399
+ }
41400
+ }, 3e3);
41401
+ }
41402
+ }
41403
+ /** Render the monitoring bar as an ANSI string */
41404
+ renderBar(width) {
41405
+ this.refresh();
41406
+ let bar = "";
41407
+ for (const [, d] of this.daemons) {
41408
+ const dot = d.status === "running" ? "\x1B[32m\u25CF\x1B[0m" : d.status === "error" ? "\x1B[31m\u25CF\x1B[0m" : d.status === "starting" ? "\x1B[33m\u25CF\x1B[0m" : "\x1B[31m\u25CF\x1B[0m";
41409
+ bar += ` \x1B[35m[${d.name} ${dot}\x1B[35m]\x1B[0m`;
41410
+ }
41411
+ for (const [, a] of this.subAgents) {
41412
+ if (a.status === "completed")
41413
+ continue;
41414
+ const dot = a.status === "active" ? "\x1B[32m\u25CF\x1B[0m" : "\x1B[33m\u25CF\x1B[0m";
41415
+ const color = a.type === "call" ? "\x1B[33m" : "\x1B[36m";
41416
+ const label = `${a.type}:${a.id.length > 6 ? a.id.slice(-6) : a.id}`;
41417
+ bar += ` ${color}[${label} ${dot}${color}]\x1B[0m`;
41418
+ }
41419
+ if (!bar) {
41420
+ return " \x1B[38;5;240m\u2800 no active daemons\x1B[0m";
41421
+ }
41422
+ return bar;
41423
+ }
41424
+ /** True if any daemons or sub-agents are registered */
41425
+ get hasEntries() {
41426
+ return this.daemons.size > 0 || this.subAgents.size > 0;
41427
+ }
41428
+ };
41429
+ registry = new DaemonRegistry();
41430
+ }
41431
+ });
41432
+
41348
41433
  // packages/cli/dist/tui/personaplex.js
41349
41434
  var personaplex_exports = {};
41350
41435
  __export(personaplex_exports, {
@@ -41987,6 +42072,16 @@ print('Converted')
41987
42072
  if (child.pid) {
41988
42073
  writeFileSync16(PID_FILE, String(child.pid));
41989
42074
  writeFileSync16(PORT_FILE, String(PORT));
42075
+ registry.register({
42076
+ name: "PersonaPlex",
42077
+ pid: child.pid,
42078
+ port: PORT,
42079
+ startedAt: Date.now(),
42080
+ status: "starting",
42081
+ logFile: LOG_FILE,
42082
+ tier,
42083
+ hybrid: hybridEnabled
42084
+ });
41990
42085
  }
41991
42086
  child.unref();
41992
42087
  const { createWriteStream } = await import("node:fs");
@@ -42295,6 +42390,7 @@ var init_personaplex = __esm({
42295
42390
  "packages/cli/dist/tui/personaplex.js"() {
42296
42391
  "use strict";
42297
42392
  init_render();
42393
+ init_daemon_registry();
42298
42394
  WEIGHT_REPOS = {
42299
42395
  original: { repo: "nvidia/personaplex-7b-v1", file: "model.safetensors", sizeGB: 15.6, needsToken: true },
42300
42396
  nf4: { repo: "cudabenchmarktest/personaplex-7b-nf4", file: "model-nf4.safetensors", sizeGB: 4.1, needsToken: false },
@@ -43441,6 +43537,12 @@ function detectPkgManager() {
43441
43537
  if (plat === "darwin") {
43442
43538
  if (hasCmd("brew"))
43443
43539
  return "brew";
43540
+ try {
43541
+ execSync28('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"', { stdio: "pipe", timeout: 3e5, env: { ...process.env, NONINTERACTIVE: "1" } });
43542
+ if (hasCmd("brew"))
43543
+ return "brew";
43544
+ } catch {
43545
+ }
43444
43546
  return null;
43445
43547
  }
43446
43548
  if (hasCmd("apt-get"))
@@ -46602,6 +46704,7 @@ var init_voice = __esm({
46602
46704
  "packages/cli/dist/tui/voice.js"() {
46603
46705
  "use strict";
46604
46706
  init_render();
46707
+ init_daemon_registry();
46605
46708
  VOICE_MODELS = {
46606
46709
  glados: {
46607
46710
  id: "glados",
@@ -48206,6 +48309,14 @@ if __name__ == '__main__':
48206
48309
  try {
48207
48310
  const msg = JSON.parse(line);
48208
48311
  if (msg.type === "ready") {
48312
+ if (daemon.pid) {
48313
+ registry.register({
48314
+ name: "LuxTTS",
48315
+ pid: daemon.pid,
48316
+ startedAt: Date.now(),
48317
+ status: "running"
48318
+ });
48319
+ }
48209
48320
  resolve36(true);
48210
48321
  } else if (msg.type === "result" || msg.type === "error") {
48211
48322
  const pending = this._luxttsPending.get(msg.id);
@@ -48223,6 +48334,7 @@ if __name__ == '__main__':
48223
48334
  });
48224
48335
  daemon.on("exit", () => {
48225
48336
  this._luxttsDaemon = null;
48337
+ registry.unregister("LuxTTS");
48226
48338
  for (const [, p] of this._luxttsPending) {
48227
48339
  p.reject(new Error("LuxTTS daemon exited"));
48228
48340
  }
@@ -53376,6 +53488,7 @@ async function handleUpdate(subcommand, ctx) {
53376
53488
  installOverlay.dismiss();
53377
53489
  return;
53378
53490
  }
53491
+ registry.killAll();
53379
53492
  ctx.contextSave?.();
53380
53493
  const hadActiveTask = ctx.savePendingTaskState?.() ?? false;
53381
53494
  const resumeFlag = hadActiveTask ? "1" : "update-only";
@@ -53840,6 +53953,7 @@ var init_commands = __esm({
53840
53953
  init_overlay_lock();
53841
53954
  init_drop_panel();
53842
53955
  init_neovim_mode();
53956
+ init_daemon_registry();
53843
53957
  DASH_INTERNAL = /* @__PURE__ */ new Set(["system_metrics", "__list_capabilities"]);
53844
53958
  }
53845
53959
  });
@@ -62028,6 +62142,7 @@ var init_status_bar = __esm({
62028
62142
  init_braille_spinner();
62029
62143
  init_system_metrics();
62030
62144
  init_text_selection();
62145
+ init_daemon_registry();
62031
62146
  EXPERT_TOOL_BASELINES = {
62032
62147
  file_read: 12,
62033
62148
  structured_read: 15,
@@ -64223,9 +64338,13 @@ ${CONTENT_BG_SEQ}`);
64223
64338
  }
64224
64339
  /**
64225
64340
  * Build the content for the buffer line.
64226
- * Returns braille animation when processing, empty string when idle.
64341
+ * When daemons/agents are tracked: shows monitoring bar with status dots.
64342
+ * Otherwise: braille animation when processing, empty when idle.
64227
64343
  */
64228
64344
  buildBufferContent(width) {
64345
+ if (registry.hasEntries) {
64346
+ return registry.renderBar(width);
64347
+ }
64229
64348
  if (this._processing && this._brailleSpinner.isRunning) {
64230
64349
  return this._brailleSpinner.render(width, PANEL_BG + 1);
64231
64350
  }
@@ -68031,6 +68150,7 @@ async function startInteractive(config, repoPath) {
68031
68150
  if (_shellToolRef)
68032
68151
  _shellToolRef.killAll();
68033
68152
  killAllFullSubAgents();
68153
+ registry.killAll();
68034
68154
  restoreScreen();
68035
68155
  process.exit(code);
68036
68156
  };
@@ -70023,6 +70143,21 @@ Respond concisely and safely. Remember: you are talking to the general public.`;
70023
70143
  });
70024
70144
  if (!result.success)
70025
70145
  throw new Error(result.error || "Connect failed");
70146
+ try {
70147
+ const nexusPidFile = join71(repoRoot, ".oa", "nexus", "daemon.pid");
70148
+ if (existsSync54(nexusPidFile)) {
70149
+ const pid = parseInt(readFileSync43(nexusPidFile, "utf8").trim(), 10);
70150
+ if (pid > 0) {
70151
+ registry.register({
70152
+ name: "Nexus",
70153
+ pid,
70154
+ startedAt: Date.now(),
70155
+ status: "running"
70156
+ });
70157
+ }
70158
+ }
70159
+ } catch {
70160
+ }
70026
70161
  return result.output;
70027
70162
  },
70028
70163
  // ── P2P mesh controls ────────────────────────────────────────────────
@@ -71510,6 +71645,7 @@ var init_interactive = __esm({
71510
71645
  init_emotion_engine();
71511
71646
  init_telegram_bridge();
71512
71647
  init_status_bar();
71648
+ init_daemon_registry();
71513
71649
  init_dist6();
71514
71650
  init_overlay_lock();
71515
71651
  init_neovim_mode();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.185.47",
3
+ "version": "0.185.49",
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",