open-agents-ai 0.185.48 → 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 +131 -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 },
@@ -46608,6 +46704,7 @@ var init_voice = __esm({
46608
46704
  "packages/cli/dist/tui/voice.js"() {
46609
46705
  "use strict";
46610
46706
  init_render();
46707
+ init_daemon_registry();
46611
46708
  VOICE_MODELS = {
46612
46709
  glados: {
46613
46710
  id: "glados",
@@ -48212,6 +48309,14 @@ if __name__ == '__main__':
48212
48309
  try {
48213
48310
  const msg = JSON.parse(line);
48214
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
+ }
48215
48320
  resolve36(true);
48216
48321
  } else if (msg.type === "result" || msg.type === "error") {
48217
48322
  const pending = this._luxttsPending.get(msg.id);
@@ -48229,6 +48334,7 @@ if __name__ == '__main__':
48229
48334
  });
48230
48335
  daemon.on("exit", () => {
48231
48336
  this._luxttsDaemon = null;
48337
+ registry.unregister("LuxTTS");
48232
48338
  for (const [, p] of this._luxttsPending) {
48233
48339
  p.reject(new Error("LuxTTS daemon exited"));
48234
48340
  }
@@ -53382,6 +53488,7 @@ async function handleUpdate(subcommand, ctx) {
53382
53488
  installOverlay.dismiss();
53383
53489
  return;
53384
53490
  }
53491
+ registry.killAll();
53385
53492
  ctx.contextSave?.();
53386
53493
  const hadActiveTask = ctx.savePendingTaskState?.() ?? false;
53387
53494
  const resumeFlag = hadActiveTask ? "1" : "update-only";
@@ -53846,6 +53953,7 @@ var init_commands = __esm({
53846
53953
  init_overlay_lock();
53847
53954
  init_drop_panel();
53848
53955
  init_neovim_mode();
53956
+ init_daemon_registry();
53849
53957
  DASH_INTERNAL = /* @__PURE__ */ new Set(["system_metrics", "__list_capabilities"]);
53850
53958
  }
53851
53959
  });
@@ -62034,6 +62142,7 @@ var init_status_bar = __esm({
62034
62142
  init_braille_spinner();
62035
62143
  init_system_metrics();
62036
62144
  init_text_selection();
62145
+ init_daemon_registry();
62037
62146
  EXPERT_TOOL_BASELINES = {
62038
62147
  file_read: 12,
62039
62148
  structured_read: 15,
@@ -64229,9 +64338,13 @@ ${CONTENT_BG_SEQ}`);
64229
64338
  }
64230
64339
  /**
64231
64340
  * Build the content for the buffer line.
64232
- * 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.
64233
64343
  */
64234
64344
  buildBufferContent(width) {
64345
+ if (registry.hasEntries) {
64346
+ return registry.renderBar(width);
64347
+ }
64235
64348
  if (this._processing && this._brailleSpinner.isRunning) {
64236
64349
  return this._brailleSpinner.render(width, PANEL_BG + 1);
64237
64350
  }
@@ -68037,6 +68150,7 @@ async function startInteractive(config, repoPath) {
68037
68150
  if (_shellToolRef)
68038
68151
  _shellToolRef.killAll();
68039
68152
  killAllFullSubAgents();
68153
+ registry.killAll();
68040
68154
  restoreScreen();
68041
68155
  process.exit(code);
68042
68156
  };
@@ -70029,6 +70143,21 @@ Respond concisely and safely. Remember: you are talking to the general public.`;
70029
70143
  });
70030
70144
  if (!result.success)
70031
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
+ }
70032
70161
  return result.output;
70033
70162
  },
70034
70163
  // ── P2P mesh controls ────────────────────────────────────────────────
@@ -71516,6 +71645,7 @@ var init_interactive = __esm({
71516
71645
  init_emotion_engine();
71517
71646
  init_telegram_bridge();
71518
71647
  init_status_bar();
71648
+ init_daemon_registry();
71519
71649
  init_dist6();
71520
71650
  init_overlay_lock();
71521
71651
  init_neovim_mode();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.185.48",
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",