feat: show fast mode in minimal footer

This commit is contained in:
叶林立
2026-08-19 22:24:37 +08:00
parent 3cdcc3510b
commit 5c4d6c6a87
15 changed files with 1340 additions and 14 deletions
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Can Celik
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+75
View File
@@ -0,0 +1,75 @@
# pi-minimal-footer
Minimal footer for [pi](https://github.com/earendil-works/pi) that replaces the default footer with a compact two-line display: context gauge on top, subscription usage bars below.
![Claude Max](assets/claude.png)
![OpenAI Codex](assets/codex.png)
## Features
- **Context gauge** — optional working directory and git branch, model, thinking level, and context window usage with token counts
- **Subscription usage bars** — rolling window quotas with reset timers for supported providers
- **Auto-refresh** — fetches usage on startup and model switch, then every 5 minutes
- **Git integration** — branch name, dirty state, ahead/behind counts
- **Extension statuses** — preserves statuses published through `ctx.ui.setStatus()` and shows `Fast on` while Codex Fast mode is enabled
## Supported providers
| Provider | What it shows |
| -------------- | ------------------------------------------------------ |
| Claude Max | 5h + weekly rolling windows |
| OpenAI Codex | Primary + secondary rolling windows |
| GitHub Copilot | Premium interactions + chat quotas |
| Google Gemini | Pro + Flash remaining quotas |
| MiniMax | 5h + weekly rolling windows (Token Plan, credit-based) |
| MiniMax CN | Same as MiniMax, China endpoint |
| Kimi Coding | 5h + weekly rolling windows (Plan) |
## Install
```bash
pi install npm:@ogulcancelik/pi-minimal-footer
```
## Configuration
Environment variables (all optional):
| Variable | Description | Default |
| ------------------------------- | -------------------------------------------------------- | ------- |
| `PI_MINIMAL_FOOTER_SHOW_CWD` | Show current working directory in footer status line | `1` |
| `PI_MINIMAL_FOOTER_SHOW_BRANCH` | Show git branch/dirty/ahead/behind in footer status line | `1` |
Accepted false values: `0`, `false`, `no`, `off` (case-insensitive).
## How it works
The footer reads context usage from the last assistant message's token counts (free — comes with every LLM response). Subscription usage is fetched from each provider's dedicated quota API using your existing auth tokens from `~/.pi/agent/auth.json` or environment variables.
Usage is fetched:
- Once on startup
- Immediately on model switch (Ctrl+P)
- Every 5 minutes after that
Git state is refreshed:
- Once on startup
- When pi reports a branch change
- At the end of each turn
The footer adapts to narrow terminals by stacking lines vertically instead of the single-line wide layout.
## Known issues
### Claude Max usage bar not showing
Anthropic's OAuth usage endpoint (`/api/oauth/usage`) has been returning persistent 429 (rate limit) errors since late March 2026, affecting all third-party tools that display Claude usage data (CodexBar, oh-my-claudecode, claude-pulse, etc.). This is an Anthropic-side issue — tracked in [claude-code#30930](https://github.com/anthropics/claude-code/issues/30930) and [claude-code#31021](https://github.com/anthropics/claude-code/issues/31021). The usage bar will start working again once Anthropic fixes the endpoint.
## Notes
- Replaces the default pi footer entirely via `ctx.ui.setFooter()`
- The local `my-pi` version reads `footerData.getExtensionStatuses()`; `codex-fast-mode=on` is rendered as an accented `Fast on` segment, while the disabled state is hidden.
- Auth tokens are read from `~/.pi/agent/auth.json` (populated by `/login`) or standard env vars (`ANTHROPIC_API_KEY`, `MINIMAX_API_KEY`, etc.)
- Providers without auth simply don't show a usage bar — no errors
+8
View File
@@ -0,0 +1,8 @@
# Upstream source
- Repository: <https://github.com/ogulcancelik/pi-extensions/tree/main/packages/pi-minimal-footer>
- Imported commit: `77bd1e175003cd08e6d05d9e7fed695f86ae87b7`
- Imported package version: `@ogulcancelik/pi-minimal-footer@0.1.10`
- Imported on: 2026-08-19
This directory is maintained directly by `my-pi`; it is not a submodule and does not retain upstream Git metadata. Local changes add rendering for Pi extension statuses, including an explicit `Fast on` indicator for `@firstpick/pi-extension-codex-fast-mode`.
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because it is too large Load Diff
+46
View File
@@ -0,0 +1,46 @@
{
"name": "@ogulcancelik/pi-minimal-footer",
"version": "0.1.10-my-pi.1",
"description": "Minimal footer for pi with context gauge and subscription usage bars",
"type": "module",
"keywords": [
"pi-package",
"pi-extension",
"footer",
"context",
"usage",
"coding-agent"
],
"author": "Can Celik",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/ogulcancelik/pi-extensions.git",
"directory": "packages/pi-minimal-footer"
},
"bugs": {
"url": "https://github.com/ogulcancelik/pi-extensions/issues"
},
"homepage": "https://github.com/ogulcancelik/pi-extensions/tree/main/packages/pi-minimal-footer#readme",
"engines": {
"node": ">=18.0.0"
},
"pi": {
"extensions": [
"./index.ts"
]
},
"files": [
"index.ts",
"status.ts",
"assets/claude.png",
"assets/codex.png",
"README.md",
"UPSTREAM.md",
"LICENSE"
],
"scripts": {
"test": "node --experimental-strip-types --test test/*.test.ts",
"check": "node --experimental-strip-types --check index.ts"
}
}
+28
View File
@@ -0,0 +1,28 @@
export const FAST_MODE_STATUS_KEY = "codex-fast-mode";
export interface FooterStatusItem {
text: string;
accent: boolean;
}
/** Convert Pi extension statuses into compact footer segments. */
export function collectFooterStatusItems(
statuses: ReadonlyMap<string, string>,
): FooterStatusItem[] {
const items: FooterStatusItem[] = [];
for (const [key, value] of statuses) {
if (key === FAST_MODE_STATUS_KEY) {
if (value.trim().toLowerCase() === "on") {
items.push({ text: "Fast on", accent: true });
}
continue;
}
if (value.trim()) {
items.push({ text: value, accent: false });
}
}
return items;
}
+29
View File
@@ -0,0 +1,29 @@
import assert from "node:assert/strict";
import test from "node:test";
import { collectFooterStatusItems, FAST_MODE_STATUS_KEY } from "../status.ts";
test("renders enabled Codex Fast mode as an explicit accented segment", () => {
const items = collectFooterStatusItems(new Map([[FAST_MODE_STATUS_KEY, "on"]]));
assert.deepEqual(items, [{ text: "Fast on", accent: true }]);
});
test("hides disabled Codex Fast mode", () => {
const items = collectFooterStatusItems(new Map([[FAST_MODE_STATUS_KEY, "off"]]));
assert.deepEqual(items, []);
});
test("preserves other non-empty extension statuses", () => {
const items = collectFooterStatusItems(new Map([
["one", "Ready"],
["empty", " "],
["two", "2 tasks"],
]));
assert.deepEqual(items, [
{ text: "Ready", accent: false },
{ text: "2 tasks", accent: false },
]);
});