pi-claude-code-ui 1.0.72 → 1.0.73

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/CHANGELOG.md CHANGED
@@ -3,11 +3,18 @@
3
3
  > [!IMPORTANT]
4
4
  > **1.0.69 — package rename (permanent).** Canonical npm name is now [`pi-claude-code-ui`](https://www.npmjs.com/package/pi-claude-code-ui). `pi-claude-style-tools` is legacy and will not receive further releases. Install with `pi install npm:pi-claude-code-ui` or `npm i pi-claude-code-ui`.
5
5
 
6
+ ## 1.0.73 — 2026-07-18
7
+
8
+ ### Fixed
9
+
10
+ - **Agent rows align with other tools again** — removed the extra leading indent that only applied to Agent-family tool rows.
11
+ - **Agent breathe stays centered** — drop double-width `⬤` (it walked the baseline). Cycle is now single-cell glyphs `● → • → · → (invisible) → · → •` so the optical center never moves.
12
+
6
13
  ## 1.0.72 — 2026-07-18
7
14
 
8
15
  ### Changed
9
16
 
10
- - **Agent tools breathe** — `Agent` / subagent tools use a size cycle while pending (`⬤ → ● → • → (invisible) → • → ●`) instead of the ordinary on/off `●` blink, so agent work reads as a different kind of tool.
17
+ - **Agent tools breathe** — `Agent` / subagent tools use a size cycle while pending instead of the ordinary on/off `●` blink, so agent work reads as a different kind of tool.
11
18
 
12
19
  ## 1.0.71 — 2026-07-18
13
20
 
@@ -440,12 +440,6 @@ function isAgentFamilyToolName(name: unknown): boolean {
440
440
  return typeof name === "string" && AGENT_FAMILY_TOOL_NAMES.has(name);
441
441
  }
442
442
 
443
- function shouldIndentToolExecution(value: unknown): boolean {
444
- if (!value || typeof value !== "object") return false;
445
- const toolName = (value as Record<string, unknown>).toolName;
446
- return isAgentFamilyToolName(toolName);
447
- }
448
-
449
443
  function isTerminalImageLine(line: string): boolean {
450
444
  return line.includes(KITTY_IMAGE_PREFIX) || line.includes(ITERM2_IMAGE_PREFIX);
451
445
  }
@@ -550,8 +544,11 @@ function getToolGroupOverallStatus(tools: any[]): ToolStatus {
550
544
  // spot for ordinary tools. Agent-family tools use a breathing size cycle.
551
545
  const STATUS_DOT_FILLED = "●";
552
546
  const STATUS_DOT_BOLD = "\x1b[1m";
553
- // big → medium → small → invisible → small → medium (then back to big)
554
- const AGENT_BREATHE_GLYPHS = ["⬤", "●", "•", " ", "•", "●"] as const;
547
+ // Single-cell glyphs only (⬤ is often double-width and walks the baseline).
548
+ // Optical sizes share the same cell so the center stays put while breathing:
549
+ // big ● → medium • → small · → invisible → small · → medium •
550
+ const AGENT_BREATHE_GLYPHS = ["●", "•", "·", " ", "·", "•"] as const;
551
+ const AGENT_BREATHE_LEN = AGENT_BREATHE_GLYPHS.length;
555
552
 
556
553
  function paintStatusDot(colorAnsi: string): string {
557
554
  return `${colorAnsi}${STATUS_DOT_BOLD}${STATUS_DOT_FILLED}${TRANSPARENT_RESET}`;
@@ -563,9 +560,12 @@ function themeStatusDot(theme: Theme, colorKey: "success" | "error" | "dim" | "m
563
560
  }
564
561
 
565
562
  function agentBreatheDot(theme: Theme): string {
566
- const glyph = AGENT_BREATHE_GLYPHS[_globalBlinkPhaseIndex % AGENT_BREATHE_GLYPHS.length];
563
+ // Always exactly one display cell — matches ordinary tool dots, keeps titles aligned.
564
+ const glyph = AGENT_BREATHE_GLYPHS[_globalBlinkPhaseIndex % AGENT_BREATHE_LEN];
567
565
  if (glyph === " ") return " ";
568
- return theme.fg("success", `${STATUS_DOT_BOLD}${glyph}`);
566
+ // Bold only on the largest frame so weight changes without shifting the cell.
567
+ const bold = glyph === "●" ? STATUS_DOT_BOLD : "";
568
+ return theme.fg("success", `${bold}${glyph}`);
569
569
  }
570
570
 
571
571
  function groupStatusLight(status: ToolStatus): string {
@@ -1018,10 +1018,11 @@ function patchGlobalToolBorders(): void {
1018
1018
  (this as any)[TOOL_RENDER_CACHE] = { width, mode: toolBackgroundMode, lines: rendered, ...branchCache };
1019
1019
  return rendered;
1020
1020
  }
1021
- const indentTool = shouldIndentToolExecution(this);
1021
+ // Agent-family tools stay column-aligned with every other tool row — no extra
1022
+ // leading indent (the old nested pad made Agent look offset from Read/Bash).
1022
1023
  const core = textLines.map((line) => {
1023
1024
  const normalized = normalizeLeadingCheckGlyph(line);
1024
- return clampLineWidth(stripOuterBackgroundAnsi(indentTool && normalized ? ` ${normalized}` : normalized), width);
1025
+ return clampLineWidth(stripOuterBackgroundAnsi(normalized), width);
1025
1026
  });
1026
1027
  const spacerLine = " ".repeat(width);
1027
1028
  let result: string[];
@@ -2681,7 +2682,7 @@ function _scheduleGlobalBlinkTimer(): void {
2681
2682
  _clearAllBlinkContexts();
2682
2683
  return;
2683
2684
  }
2684
- _globalBlinkPhaseIndex = (_globalBlinkPhaseIndex + 1) % AGENT_BREATHE_GLYPHS.length;
2685
+ _globalBlinkPhaseIndex = (_globalBlinkPhaseIndex + 1) % AGENT_BREATHE_LEN;
2685
2686
  _globalBlinkPhase = _globalBlinkPhaseIndex % 2 === 0;
2686
2687
  for (const entry of getBlinkingEntries()) {
2687
2688
  try { entry.invalidate(); } catch { /* noop */ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-claude-code-ui",
3
- "version": "1.0.72",
3
+ "version": "1.0.73",
4
4
  "description": "Claude Code-style grouped tool rows for pi with Ctrl+O/Ctrl+Shift+O previews, math rendering, and consistent built-in, MCP, and custom tool rendering",
5
5
  "keywords": [
6
6
  "pi-package",