@mapick/cost-firewall 0.2.26 → 0.2.27

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
@@ -21,7 +21,7 @@ Catch retry loops, token storms, and surprise AI bills before they become screen
21
21
  [![License](https://img.shields.io/github/license/mapick-ai/cost-firewall?color=16a34a)](./LICENSE)
22
22
  [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=fff)](#development)
23
23
  [![OpenClaw](https://img.shields.io/badge/OpenClaw-plugin-8B5CF6)](#try-it)
24
- [![Verified](https://img.shields.io/badge/real%20OpenClaw-v0.2.26%20verified-brightgreen)](#verified-on-real-openclaw)
24
+ [![Verified](https://img.shields.io/badge/real%20OpenClaw-v0.2.27%20verified-brightgreen)](#verified-on-real-openclaw)
25
25
 
26
26
  <br />
27
27
 
@@ -54,7 +54,7 @@ One command. Every AI call paused. Breathe first, debug second.
54
54
  Requires OpenClaw `2026.4.1` or newer. Verified on a real OpenClaw instance with `v0.2.18`.
55
55
 
56
56
  ```bash
57
- curl -fsSL https://raw.githubusercontent.com/mapick-ai/cost-firewall/v0.2.26/install.sh | bash
57
+ curl -fsSL https://raw.githubusercontent.com/mapick-ai/cost-firewall/v0.2.27/install.sh | bash
58
58
  openclaw firewall status
59
59
  ```
60
60
 
@@ -566,7 +566,7 @@ export function renderDashboardHtml(_stats) {
566
566
  </div>
567
567
 
568
568
  <div id="alert-unbind" style="display:none;background:#fef2f2;border:1px solid var(--destructive);border-radius:8px;padding:12px 18px;margin:12px auto;max-width:1200px">
569
- <strong>⚠️ Unbind Alert</strong>:Emergency Stop activated,但仍检测到新的 API 请求。请运行 <code>openclaw gateway restart</code>。
569
+ <strong>⚠️ Unbind Alert</strong>:Emergency Stop activated,but new API requests detected. Run <code>openclaw gateway restart</code>。
570
570
  <span id="alert-unbind-detail" style="display:block;margin-top:4px;font-size:12px;color:var(--muted)"></span>
571
571
  </div>
572
572
 
@@ -971,10 +971,10 @@ export function renderDashboardHtml(_stats) {
971
971
  document.getElementById('status-fail').textContent = (breaker.consecutive_failures ?? 3) + ' failures → ' + (breaker.cooldown_sec ?? 30) + ' s';
972
972
  document.getElementById('status-velocity').textContent = (breaker.token_velocity_threshold ?? 0) > 0
973
973
  ? (breaker.token_velocity_threshold ?? 0).toLocaleString() + ' / ' + (breaker.token_velocity_window_sec ?? 60) + ' s'
974
- : '关闭';
974
+ : 'Off';
975
975
  document.getElementById('status-frequency').textContent = (breaker.call_frequency_threshold ?? 0) > 0
976
976
  ? (breaker.call_frequency_threshold ?? 0) + ' / ' + (breaker.call_frequency_window_sec ?? 60) + ' s'
977
- : '关闭';
977
+ : 'Off';
978
978
 
979
979
  const coolingSources = data.cooling_sources ?? [];
980
980
  const coolingList = document.getElementById('list-cooling');
@@ -1016,7 +1016,7 @@ export function renderDashboardHtml(_stats) {
1016
1016
  function renderEvents(events) {
1017
1017
  const log = document.getElementById('events-log');
1018
1018
  if (!events || events.length === 0) {
1019
- log.innerHTML = '<div class="empty">暂无Events记录</div>';
1019
+ log.innerHTML = '<div class="empty">No events recorded</div>';
1020
1020
  return;
1021
1021
  }
1022
1022
  log.innerHTML = events.slice(0, 50).reverse().map(e => {
@@ -1058,7 +1058,7 @@ export function renderDashboardHtml(_stats) {
1058
1058
  text = 'Run ended — ' + (e.runId ?? '').slice(0, 8);
1059
1059
  } else if (type === 'config_warning') {
1060
1060
  icon = '⚙️'; cls = 'dim';
1061
- text = '配置 — ' + (e.reason ?? e.message ?? '');
1061
+ text = 'Config — ' + (e.reason ?? e.message ?? '');
1062
1062
  } else if (type === 'emergency_stop') {
1063
1063
  icon = '🛑'; cls = 'err';
1064
1064
  text = 'Emergency Stop activated';
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import { detectConfigRisks } from "./config-warn.js";
13
13
  export default {
14
14
  id: PLUGIN_ID,
15
15
  name: PLUGIN_NAME,
16
- version: "0.2.26",
16
+ version: "0.2.27",
17
17
  register(api) {
18
18
  const config = api.config?.plugins?.entries?.[PLUGIN_ID]?.config ?? {};
19
19
  const state = new FirewallState(config);
@@ -2,7 +2,7 @@
2
2
  "id": "mapick-firewall",
3
3
  "name": "Mapick Cost Firewall",
4
4
  "description": "AI call circuit breaker — block runaway requests, see who's burning money, one-click emergency stop.",
5
- "version": "0.2.26",
5
+ "version": "0.2.27",
6
6
  "providers": [
7
7
  "mapick"
8
8
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mapick/cost-firewall",
3
- "version": "0.2.26",
3
+ "version": "0.2.27",
4
4
  "license": "MIT",
5
5
  "description": "AI Call Firewall — real-time monitoring, budget control, automatic circuit breaker for LLM agents (Claude Code, Aider, OpenClaw, Cursor)",
6
6
  "keywords": [