@femtomc/mu-agent 26.2.93 → 26.2.95

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.
package/README.md CHANGED
@@ -46,7 +46,7 @@ Current stack:
46
46
  - `brandingExtension` — mu compact header/footer branding + default theme
47
47
  - `eventLogExtension` — event tail + watch widget
48
48
  - `planningUiExtension` — planning mode: compact HUD for next-step/approval flow in widget/status surfaces while keeping the branding footer unchanged (`/mu plan ...`)
49
- - `subagentsUiExtension` — subagents mode: compact HUD with activity sentences from issue/forum events plus footer-ready queue/health metadata (`/mu subagents ...`)
49
+ - `subagentsUiExtension` — subagents mode: compact HUD with activity sentences from issue/forum events, with state kept in widget/status surfaces while branding footer stays unchanged (`/mu subagents ...`)
50
50
 
51
51
  Default operator UI theme is `mu-gruvbox-dark`.
52
52
 
@@ -56,7 +56,7 @@ Default operator UI theme is `mu-gruvbox-dark`.
56
56
  - `/mu events watch on|off` — toggle event watch widget
57
57
  - `/mu brand on|off|toggle` — enable/disable UI branding
58
58
  - `/mu plan ...` — planning HUD (phases, checklist editing, communication state, snapshots); does not inject planning metadata into branding footer
59
- - `/mu subagents ...` — tmux + issue queue monitor/spawner (profiles, spawn pause, stale/refresh controls, snapshots)
59
+ - `/mu subagents ...` — tmux + issue queue monitor/spawner (profiles, spawn pause, stale/refresh controls, snapshots); does not inject subagents metadata into branding footer
60
60
  - `/mu help` — dispatcher catalog of registered `/mu` subcommands
61
61
 
62
62
  ## Tooling model (CLI-first)
@@ -1 +1 @@
1
- {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/extensions/branding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAyEpF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,QA6OjD;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/extensions/branding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAwEpF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,QAoOjD;AAED,eAAe,iBAAiB,CAAC"}
@@ -8,7 +8,6 @@
8
8
  */
9
9
  import { basename } from "node:path";
10
10
  import { MU_DEFAULT_THEME_NAME, MU_VERSION } from "../ui_defaults.js";
11
- import { getActiveHudMode } from "./hud-mode.js";
12
11
  import { registerMuSubcommand } from "./mu-command-dispatcher.js";
13
12
  import { fetchMuStatus, muServerUrl } from "./shared.js";
14
13
  const EMPTY_SNAPSHOT = {
@@ -128,15 +127,6 @@ export function brandingExtension(pi) {
128
127
  const barColor = pct >= 80 ? "warning" : pct >= 60 ? "muted" : "dim";
129
128
  parts.push(theme.fg("muted", "·"), theme.fg(barColor, `ctx ${pct}%`), theme.fg(barColor, contextBar(pct, 10)));
130
129
  }
131
- const activeHudMode = getActiveHudMode();
132
- if (activeHudMode === "subagents") {
133
- const extensionStatuses = footerData.getExtensionStatuses();
134
- const modeMeta = extensionStatuses.get("mu-subagents-meta") ?? "";
135
- parts.push(theme.fg("muted", "·"), theme.fg("accent", "hud:subagents"));
136
- if (modeMeta.length > 0) {
137
- parts.push(theme.fg("muted", "·"), theme.fg("dim", truncateToWidth(modeMeta, 42)));
138
- }
139
- }
140
130
  if (snapshot.openCount > 0 || snapshot.readyCount > 0) {
141
131
  parts.push(theme.fg("muted", "·"), theme.fg("dim", `open ${snapshot.openCount} ready ${snapshot.readyCount}`));
142
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subagents-ui.d.ts","sourceRoot":"","sources":["../../src/extensions/subagents-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAw4BpF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,QAkoBpD;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"subagents-ui.d.ts","sourceRoot":"","sources":["../../src/extensions/subagents-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAu5BpF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,QAkoBpD;AAED,eAAe,oBAAoB,CAAC"}
@@ -562,8 +562,9 @@ function renderSubagentsUi(ctx, state) {
562
562
  return;
563
563
  }
564
564
  const issueScope = state.issueRootId ? `root:${state.issueRootId}` : "all-roots";
565
- const tagScope = state.issueTagFilter ? state.issueTagFilter : "(all tags)";
566
- const scopeCompact = truncateOneLine(`${issueScope} · ${tagScope}`, WIDGET_SCOPE_MAX);
565
+ const tagScope = state.issueTagFilter ? `tag:${state.issueTagFilter}` : null;
566
+ const scopeLabel = [issueScope, tagScope].filter((value) => value != null).join(" · ");
567
+ const scopeCompact = truncateOneLine(scopeLabel, WIDGET_SCOPE_MAX);
567
568
  const prefixCompact = truncateOneLine(state.prefix || "(all sessions)", WIDGET_PREFIX_MAX);
568
569
  const refreshStale = isRefreshStale(state.lastUpdatedMs, state.staleAfterMs);
569
570
  const drift = computeQueueDrift(state.sessions, state.activeIssues);
@@ -579,50 +580,62 @@ function renderSubagentsUi(ctx, state) {
579
580
  const refreshSeconds = Math.round(state.refreshIntervalMs / 1_000);
580
581
  const staleAfterSeconds = Math.round(state.staleAfterMs / 1_000);
581
582
  const activityLines = state.activityLines.slice(0, ACTIVITY_LINE_LIMIT);
582
- ctx.ui.setStatus("mu-subagents", [
583
+ const statusParts = [
583
584
  ctx.ui.theme.fg("dim", "subagents"),
584
585
  ctx.ui.theme.fg(healthColor, healthLabel),
585
586
  ctx.ui.theme.fg("dim", `mode:${state.spawnMode}`),
586
- ctx.ui.theme.fg(pausedColor, `paused:${pausedLabel}`),
587
587
  ctx.ui.theme.fg("dim", `q:${state.readyIssues.length}/${state.activeIssues.length}`),
588
588
  ctx.ui.theme.fg("dim", `tmux:${state.sessions.length}`),
589
- ctx.ui.theme.fg(staleCount > 0 ? "warning" : "dim", `drift:${staleCount}`),
590
- ctx.ui.theme.fg("muted", truncateOneLine(issueScope, 18)),
591
- ].join(` ${ctx.ui.theme.fg("muted", "·")} `));
592
- ctx.ui.setStatus("mu-subagents-meta", `health:${healthLabel} q:${state.readyIssues.length}/${state.activeIssues.length} tmux:${state.sessions.length} drift:${staleCount} refresh:${refreshAge}`);
589
+ ];
590
+ if (state.spawnPaused) {
591
+ statusParts.push(ctx.ui.theme.fg(pausedColor, `paused:${pausedLabel}`));
592
+ }
593
+ if (staleCount > 0) {
594
+ statusParts.push(ctx.ui.theme.fg("warning", `drift:${staleCount}`));
595
+ }
596
+ if (state.issueRootId) {
597
+ statusParts.push(ctx.ui.theme.fg("muted", truncateOneLine(issueScope, 18)));
598
+ }
599
+ ctx.ui.setStatus("mu-subagents", statusParts.join(` ${ctx.ui.theme.fg("muted", "·")} `));
600
+ ctx.ui.setStatus("mu-subagents-meta", undefined);
601
+ const titleParts = [
602
+ ctx.ui.theme.fg("accent", ctx.ui.theme.bold("Subagents")),
603
+ ctx.ui.theme.fg("muted", "·"),
604
+ ctx.ui.theme.fg(healthColor, healthLabel),
605
+ ctx.ui.theme.fg("muted", "·"),
606
+ ctx.ui.theme.fg("accent", `mode:${state.spawnMode}`),
607
+ ];
608
+ if (state.spawnPaused) {
609
+ titleParts.push(ctx.ui.theme.fg("muted", "·"), ctx.ui.theme.fg(pausedColor, `paused:${pausedLabel}`));
610
+ }
611
+ const queueParts = [
612
+ ctx.ui.theme.fg("muted", "queues:"),
613
+ ctx.ui.theme.fg("accent", `${state.readyIssues.length}r`),
614
+ ctx.ui.theme.fg("muted", "/"),
615
+ ctx.ui.theme.fg("warning", `${state.activeIssues.length}a`),
616
+ ctx.ui.theme.fg("dim", queueBar),
617
+ ctx.ui.theme.fg("muted", "·"),
618
+ ctx.ui.theme.fg("muted", "tmux:"),
619
+ ctx.ui.theme.fg("dim", `${state.sessions.length}`),
620
+ ];
621
+ if (staleCount > 0) {
622
+ queueParts.push(ctx.ui.theme.fg("muted", "·"), ctx.ui.theme.fg("warning", `drift:${staleCount}`));
623
+ }
624
+ const refreshParts = [
625
+ ctx.ui.theme.fg("muted", "refresh:"),
626
+ ctx.ui.theme.fg(refreshStale ? "warning" : "dim", refreshAge),
627
+ ctx.ui.theme.fg("muted", "·"),
628
+ ctx.ui.theme.fg("muted", "every:"),
629
+ ctx.ui.theme.fg("dim", `${refreshSeconds}s`),
630
+ ];
631
+ if (refreshStale) {
632
+ refreshParts.push(ctx.ui.theme.fg("muted", "·"), ctx.ui.theme.fg("muted", "stale:"), ctx.ui.theme.fg("dim", `${staleAfterSeconds}s`));
633
+ }
593
634
  const lines = [
594
- [
595
- ctx.ui.theme.fg("accent", ctx.ui.theme.bold("Subagents")),
596
- ctx.ui.theme.fg("muted", "·"),
597
- ctx.ui.theme.fg(healthColor, healthLabel),
598
- ctx.ui.theme.fg("muted", "·"),
599
- ctx.ui.theme.fg("accent", `mode:${state.spawnMode}`),
600
- ctx.ui.theme.fg("muted", "·"),
601
- ctx.ui.theme.fg(pausedColor, `paused:${pausedLabel}`),
602
- ].join(" "),
635
+ titleParts.join(" "),
603
636
  `${ctx.ui.theme.fg("muted", "scope:")} ${ctx.ui.theme.fg("dim", scopeCompact)} ${ctx.ui.theme.fg("muted", "· prefix:")} ${ctx.ui.theme.fg("dim", prefixCompact)}`,
604
- [
605
- ctx.ui.theme.fg("muted", "queues:"),
606
- ctx.ui.theme.fg("accent", `${state.readyIssues.length}r`),
607
- ctx.ui.theme.fg("muted", "/"),
608
- ctx.ui.theme.fg("warning", `${state.activeIssues.length}a`),
609
- ctx.ui.theme.fg("dim", queueBar),
610
- ctx.ui.theme.fg("muted", "·"),
611
- ctx.ui.theme.fg("muted", "tmux:"),
612
- ctx.ui.theme.fg("dim", `${state.sessions.length}`),
613
- ctx.ui.theme.fg("muted", "·"),
614
- ctx.ui.theme.fg(staleCount > 0 ? "warning" : "dim", `drift:${staleCount}`),
615
- ].join(" "),
616
- [
617
- ctx.ui.theme.fg("muted", "refresh:"),
618
- ctx.ui.theme.fg(refreshStale ? "warning" : "dim", refreshAge),
619
- ctx.ui.theme.fg("muted", "·"),
620
- ctx.ui.theme.fg("muted", "every:"),
621
- ctx.ui.theme.fg("dim", `${refreshSeconds}s`),
622
- ctx.ui.theme.fg("muted", "·"),
623
- ctx.ui.theme.fg("muted", "stale:"),
624
- ctx.ui.theme.fg("dim", `${staleAfterSeconds}s`),
625
- ].join(" "),
637
+ queueParts.join(" "),
638
+ refreshParts.join(" "),
626
639
  ];
627
640
  if (state.issueError) {
628
641
  lines.push(ctx.ui.theme.fg("warning", `issue_error: ${truncateOneLine(state.issueError, WIDGET_ERROR_MAX)}`));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@femtomc/mu-agent",
3
- "version": "26.2.93",
3
+ "version": "26.2.95",
4
4
  "description": "Shared operator runtime for mu assistant sessions and serve extensions.",
5
5
  "keywords": [
6
6
  "mu",
@@ -24,7 +24,7 @@
24
24
  "themes/**"
25
25
  ],
26
26
  "dependencies": {
27
- "@femtomc/mu-core": "26.2.93",
27
+ "@femtomc/mu-core": "26.2.95",
28
28
  "@mariozechner/pi-agent-core": "^0.53.0",
29
29
  "@mariozechner/pi-ai": "^0.53.0",
30
30
  "@mariozechner/pi-coding-agent": "^0.53.0",