@lokiyou/pi-nano-footer 0.3.0 → 0.5.0

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/index.ts +30 -24
  2. package/package.json +1 -1
package/index.ts CHANGED
@@ -1,16 +1,13 @@
1
1
  /**
2
- * pi-nano-footer — 超轻量 powerline 风格 footer + 输入框脉冲发光
2
+ * pi-nano-footer — 超轻量 powerline 风格 footer + 输入框呼吸发光
3
3
  *
4
4
  * 精确复刻 pi-powerline-footer default 预设的样式 +
5
5
  * 用户自定义霓虹色配色方案。
6
6
  *
7
- * 当模型工作时(processing):
8
- * - 输入框边框呈呼吸脉冲发光效果(霓虹色循环)
7
+ * 当模型工作时:
8
+ * - 输入框边框基于当前颜色做呼吸发光(明暗渐变)
9
9
  * - "Working..." 保持原样
10
10
  * - Footer 不变
11
- *
12
- * 安装:放到 ~/.pi/agent/extensions/ 后重启 pi 即可自动加载。
13
- * 临时测试:pi -e ~/.pi/agent/extensions/pi-nano-footer.ts
14
11
  */
15
12
 
16
13
  import type { AssistantMessage } from "@earendil-works/pi-ai";
@@ -49,14 +46,8 @@ const C = {
49
46
  border: "#dfe6e9",
50
47
  };
51
48
 
52
- // ── 脉冲发光色轮(5色循环,更柔和的呼吸感) ──
53
- const GLOW_PALETTE = [
54
- "#ff3cac", // 热粉
55
- "#ff9f1c", // 橙
56
- "#00ff87", // 荧光绿
57
- "#00d4ff", // 青蓝
58
- "#a855f7", // 紫
59
- ];
49
+ // ── ANSI 24-bit true color 正则(用于从 borderColor 函数提取颜色) ──
50
+ const ANSI_RE = /\x1b\[38;2;(\d+);(\d+);(\d+)m/;
60
51
 
61
52
  // ── Rainbow 色表(high / xhigh 思考等级用) ──
62
53
  const RAINBOW = [
@@ -65,14 +56,20 @@ const RAINBOW = [
65
56
  ];
66
57
 
67
58
  // ═══════════════════════════════════════════════════════════════════════════
68
- // 输入框脉冲发光(Editor.borderColor monkey-patch)
59
+ // 输入框呼吸发光(基于当前边框颜色做明暗呼吸)
69
60
  // ═══════════════════════════════════════════════════════════════════════════
70
61
 
71
62
  let working = false;
72
63
 
73
- /** 时间相位:每 120ms 进一帧 */
74
- function getPhase(): number {
75
- return Math.floor(performance.now() / 120);
64
+ /**
65
+ * borderColor 函数采样一个字符,提取其中使用的 RGB 色值
66
+ */
67
+ function extractRGB(fn: (str: string) => string): [number, number, number] | null {
68
+ const sample = fn("─");
69
+ // borderColor 输出格式:\x1b[38;2;R;G;Bm─\x1b[0m
70
+ const m = sample.match(ANSI_RE);
71
+ if (!m) return null;
72
+ return [parseInt(m[1]), parseInt(m[2]), parseInt(m[3])];
76
73
  }
77
74
 
78
75
  /** 保存原始 render */
@@ -80,15 +77,21 @@ const origRender = Editor.prototype.render;
80
77
 
81
78
  Editor.prototype.render = function (width: number): string[] {
82
79
  if (working) {
83
- const saved = this.borderColor; // 保存原始边框颜色函数
84
- const phase = getPhase() % GLOW_PALETTE.length;
85
- const hex = GLOW_PALETTE[phase];
86
- // 临时用脉冲色渲染边框
87
- this.borderColor = (str: string) => ansi(hex, str);
80
+ const saved = this.borderColor;
81
+ const rgb = extractRGB(saved);
82
+ if (rgb) {
83
+ const [r, g, b] = rgb;
84
+ // 呼吸亮度:sin 周期 ~800ms,亮度范围 40%~100%
85
+ // 用 performance.now() 保证时间连续的呼吸曲线
86
+ const t = 0.5 + 0.5 * Math.sin(performance.now() / 400);
87
+ const bright = 0.4 + 0.6 * t;
88
+ this.borderColor = (str: string) =>
89
+ `\x1b[38;2;${Math.round(r * bright)};${Math.round(g * bright)};${Math.round(b * bright)}m${str}\x1b[0m`;
90
+ }
88
91
  try {
89
92
  return origRender.call(this, width);
90
93
  } finally {
91
- this.borderColor = saved; // 恢复原始颜色
94
+ this.borderColor = saved;
92
95
  }
93
96
  }
94
97
  return origRender.call(this, width);
@@ -106,6 +109,9 @@ export default function (pi: ExtensionAPI) {
106
109
  pi.on("session_start", async (_event, ctx) => {
107
110
  thinkingLevel = pi.getThinkingLevel();
108
111
 
112
+ // 隐藏内置的 "Working..." 指示器,用输入框呼吸代替
113
+ ctx.ui.setWorkingVisible(false);
114
+
109
115
  ctx.ui.setFooter((tui, theme, footerData) => {
110
116
  requestRender = () => tui.requestRender();
111
117
  const unsubBranch = footerData.onBranchChange(() => tui.requestRender());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lokiyou/pi-nano-footer",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "超轻量 powerline 风格 footer for Pi Coding Agent — 输入框脉冲发光,霓虹配色,实时显示模型、目录、上下文、token 和费用",
5
5
  "type": "module",
6
6
  "keywords": [