@mapick/cost-firewall 0.2.8 → 0.2.10

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
@@ -1,52 +1,162 @@
1
- # @mapick/cost-firewall
1
+ <!--
2
+ Repo description suggestion:
3
+ Local kill switch and circuit breaker for runaway AI agents. OpenClaw plugin for LLM cost monitoring, token storm detection, budget limits, dashboard control, and emergency stop.
2
4
 
3
- ![Version](https://img.shields.io/github/v/tag/mapick-ai/cost-firewall?label=version&color=2563eb)
4
- ![License](https://img.shields.io/github/license/mapick-ai/cost-firewall?color=16a34a)
5
- ![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=fff)
6
- ![OpenClaw Plugin](https://img.shields.io/badge/OpenClaw-Plugin-8B5CF6)
5
+ GitHub topics suggestion:
6
+ ai-cost llm-cost llm-observability llm-gateway ai-gateway ai-agents circuit-breaker
7
+ openclaw openai anthropic openrouter cost-monitoring budget-control rate-limit kill-switch
8
+ -->
7
9
 
8
- AI Call Firewall — real-time monitoring, budget control, automatic circuit breaker.
10
+ <div align="center">
11
+
12
+ # Mapick Cost Firewall
13
+
14
+ ### The big red switch for runaway AI agents.
15
+
16
+ **Local LLM cost monitoring, automatic breaker rules, dashboard control, and one-command emergency stop for OpenClaw.
17
+ Catch retry loops, token storms, and surprise AI bills before they become screenshots.**
18
+
19
+ [![Version](https://img.shields.io/github/v/tag/mapick-ai/cost-firewall?label=version&color=2563eb)](https://github.com/mapick-ai/cost-firewall/releases)
20
+ [![npm](https://img.shields.io/npm/v/@mapick/cost-firewall?color=cb3837&logo=npm)](https://www.npmjs.com/package/@mapick/cost-firewall)
21
+ [![License](https://img.shields.io/github/license/mapick-ai/cost-firewall?color=16a34a)](./LICENSE)
22
+ [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=fff)](#development)
23
+ [![OpenClaw](https://img.shields.io/badge/OpenClaw-plugin-8B5CF6)](#try-it)
24
+ [![Verified](https://img.shields.io/badge/real%20OpenClaw-v0.2.9%20verified-brightgreen)](#verified-on-real-openclaw)
25
+
26
+ <br />
27
+
28
+ <img src="./assets/ai-handbrake.gif" alt="Animated AI cost firewall handbrake stopping a runaway agent loop" width="720" />
29
+
30
+ <br /><br />
31
+
32
+ **[Try it](#try-it)** · **[Dashboard](#dashboard)** · **[Kill switch](#kill-switch)** · **[What it stops](#what-it-stops)** · **[Commands](#commands)** · **[Privacy](#privacy)** · **[Where it fits](#where-it-fits)**
33
+
34
+ </div>
9
35
 
10
36
  ---
11
37
 
12
- ## Install
38
+ ## Why This Exists
39
+
40
+ AI agents are wonderful until one gets stuck in a retry loop at 3 AM.
41
+
42
+ Provider dashboards tell you what happened after the bill lands. Mapick Cost Firewall acts earlier: it watches local call metadata, detects runaway behavior, and trips a breaker before one broken source keeps spending.
43
+
44
+ Think of it as a handbrake for agent infrastructure:
45
+
46
+ ```bash
47
+ openclaw firewall stop
48
+ ```
49
+
50
+ One command. Every AI call paused. Breathe first, debug second.
51
+
52
+ ## Try It
53
+
54
+ Verified on a real OpenClaw instance with `v0.2.9`.
13
55
 
14
- **Install script:**
15
56
  ```bash
16
- curl -fsSL https://raw.githubusercontent.com/mapick-ai/cost-firewall/main/install.sh | bash
57
+ curl -fsSL https://raw.githubusercontent.com/mapick-ai/cost-firewall/v0.2.10/install.sh | bash
58
+ openclaw firewall status
17
59
  ```
18
60
 
19
- **Manual:**
61
+ Manual install:
62
+
20
63
  ```bash
21
- openclaw plugins update mapick-firewall || openclaw plugins install @mapick/cost-firewall --force --pin
64
+ openclaw plugins install @mapick/cost-firewall
22
65
  openclaw plugins enable mapick-firewall
23
66
  openclaw gateway restart
24
67
  openclaw firewall status
25
68
  ```
26
69
 
27
- Dashboard: **http://localhost:18789/mapick/dashboard**
70
+ Recommended first run:
28
71
 
29
- ---
72
+ ```bash
73
+ openclaw firewall mode observe
74
+ openclaw firewall log --last 20
75
+ ```
30
76
 
31
- ## Commands
77
+ Start in `observe` mode, watch what would have happened, then switch to `protect` once the thresholds match your workload.
78
+
79
+ ```bash
80
+ openclaw firewall mode protect
81
+ ```
32
82
 
33
- | CLI | Action |
34
- |---|---|
35
- | `openclaw firewall status` | View status (mode, tokens, blocked, limit) |
36
- | `openclaw firewall stop` | 🛑 Emergency stop — block all AI calls |
37
- | `openclaw firewall resume` | ▶️ Resume after stop |
38
- | `openclaw firewall mode observe` | Observe mode — record only, no blocking |
39
- | `openclaw firewall mode protect` | Protect mode — enable all breaker rules |
40
- | `openclaw firewall budget set 50000` | Set daily token limit to 50K |
41
- | `openclaw firewall budget reset` | Remove daily token limit |
42
- | `openclaw firewall log --last 20` | Show last 20 events |
43
- | `openclaw firewall reset <source>` | Reset a source from cooldown |
83
+ ## Dashboard
44
84
 
45
- In OpenClaw chat: `/firewall status`, `/firewall stop`, `/firewall resume`, `/firewall log`
85
+ After install, open:
46
86
 
47
- ---
87
+ ```text
88
+ http://localhost:18789/mapick/dashboard
89
+ ```
90
+
91
+ The dashboard is local to your OpenClaw gateway and shows:
92
+
93
+ - today's token spend
94
+ - blocked count and saved estimate
95
+ - emergency stop state
96
+ - breaker thresholds
97
+ - cooling sources
98
+ - active runs
99
+ - recent firewall events
48
100
 
49
- ## Config
101
+ The same emergency brake is available from the dashboard and the CLI.
102
+
103
+ ## Kill Switch
104
+
105
+ When an agent starts spending faster than you can read logs:
106
+
107
+ ```bash
108
+ openclaw firewall stop
109
+ ```
110
+
111
+ Confirm it:
112
+
113
+ ```bash
114
+ openclaw firewall status
115
+ ```
116
+
117
+ You should see:
118
+
119
+ ```json
120
+ {
121
+ "emergency_stop": true
122
+ }
123
+ ```
124
+
125
+ When you are ready to resume:
126
+
127
+ ```bash
128
+ openclaw firewall resume
129
+ ```
130
+
131
+ ## What It Stops
132
+
133
+ | Failure mode | What Mapick watches | Default behavior |
134
+ | -------------- | ----------------------------------- | --------------------------------- |
135
+ | Retry loop | Same source fails repeatedly | Trip after 3 consecutive failures |
136
+ | Token storm | Tokens used inside a sliding window | Trip at 100K tokens / 60s |
137
+ | Call flood | Calls made inside a sliding window | Trip at 30 calls / 60s |
138
+ | Budget runaway | Daily token total crosses your cap | Block globally until reset |
139
+ | Panic moment | You hit emergency stop | Block all AI calls immediately |
140
+
141
+ Sources are tracked independently where OpenClaw provides enough context. One noisy agent should not take every other agent down with it.
142
+
143
+ ## Commands
144
+
145
+ | Command | Action |
146
+ | ------------------------------------- | --------------------------------------------------------------- |
147
+ | `openclaw firewall status` | Show mode, token count, blocked count, limits, cooldown sources |
148
+ | `openclaw firewall stop` | Emergency stop: pause all AI calls |
149
+ | `openclaw firewall resume` | Resume after emergency stop |
150
+ | `openclaw firewall mode observe` | Record only, do not block |
151
+ | `openclaw firewall mode protect` | Enable breaker rules |
152
+ | `openclaw firewall budget set 500000` | Set a daily token cap |
153
+ | `openclaw firewall budget reset` | Remove the daily token cap |
154
+ | `openclaw firewall log --last 20` | Show recent firewall events |
155
+ | `openclaw firewall reset <source>` | Clear cooldown for one source |
156
+
157
+ OpenClaw chat command registration uses the same vocabulary: `/firewall status`, `/firewall stop`, `/firewall resume`, `/firewall log`.
158
+
159
+ ## Configuration
50
160
 
51
161
  ```jsonc
52
162
  {
@@ -62,110 +172,124 @@ In OpenClaw chat: `/firewall status`, `/firewall stop`, `/firewall resume`, `/fi
62
172
  "tokenVelocityThreshold": 100000,
63
173
  "tokenVelocityWindowSec": 60,
64
174
  "callFrequencyThreshold": 30,
65
- "callFrequencyWindowSec": 60
66
- }
67
- }
68
- }
69
- }
70
- }
175
+ "callFrequencyWindowSec": 60,
176
+ },
177
+ },
178
+ },
179
+ },
180
+ },
71
181
  }
72
182
  ```
73
183
 
74
- ---
184
+ Defaults are meant to catch obvious loops. Raise thresholds for busy agent workloads; lower the daily cap for hobby projects or demos.
75
185
 
76
- ## Breaking Rules
186
+ ## How It Works
77
187
 
78
- Firewall has two modes: **Observe** (record, don't block) and **Protect** (active blocking).
188
+ ```mermaid
189
+ flowchart LR
190
+ A["Agent / OpenClaw session"] --> B{"Mapick Cost Firewall"}
191
+ B -->|"allowed"| C["Upstream LLM"]
192
+ B -->|"blocked"| D["Synthetic blocked response"]
193
+ C --> E["Usage metadata"]
194
+ E --> F["Breaker state"]
195
+ F -->|"trip"| B
196
+ E --> G["Local JSONL events"]
197
+ G --> H["CLI / dashboard"]
198
+ ```
79
199
 
80
- | Rule | Trigger | Effect |
81
- |---|---|---|
82
- | Emergency Stop | `openclaw firewall stop` | Block all calls |
83
- | Daily Token Limit | Today's tokens ≥ limit | Block all calls |
84
- | Consecutive Failures | N failures in a row | Block source for cooldown |
85
- | Token Velocity | N tokens in W seconds | Block source for cooldown |
86
- | Call Frequency | N calls in W seconds | Block source for cooldown |
200
+ Mapick does not need prompt text to trip breakers. The useful signals are metadata:
87
201
 
88
- ### Defaults
202
+ - source identifier
203
+ - provider and model
204
+ - outcome and error category
205
+ - estimated token usage
206
+ - timestamps and cooldown state
89
207
 
90
- | Rule | Threshold | Window | Cooldown |
91
- |---|---|---|---|
92
- | Consecutive Failures | 3 | — | 30s |
93
- | Token Velocity | 100K tokens | 60s | 30s |
94
- | Call Frequency | 30 calls | 60s | 30s |
95
- | Daily Token Limit | None (unlimited) | — | — |
208
+ ## Privacy
96
209
 
97
- ---
210
+ | Question | Answer |
211
+ | ------------------------------------- | ---------------------------- |
212
+ | Does it need a Mapick account? | No |
213
+ | Does it send telemetry to Mapick? | No |
214
+ | Does it store prompt text by default? | No |
215
+ | Where are events stored? | Local OpenClaw plugin state |
216
+ | Can I audit it? | Yes, MIT licensed TypeScript |
98
217
 
99
- ## AI Installation Checklist
218
+ The default privacy setting is `storePromptText: false`.
100
219
 
101
- Copy the entire block below and execute:
220
+ ## Verified On Real OpenClaw
102
221
 
103
- ```bash
104
- # 1. Install or update the plugin
105
- openclaw plugins update mapick-firewall || openclaw plugins install @mapick/cost-firewall --force --pin
222
+ `v0.2.9` was tested on a real OpenClaw gateway:
106
223
 
107
- # 2. Enable it
108
- openclaw plugins enable mapick-firewall
224
+ | Check | Result |
225
+ | ----------------- | ------------------------------------------------------- |
226
+ | Package installed | `@mapick/cost-firewall@0.2.9` |
227
+ | Gateway status | running |
228
+ | API route | `/mapick/api/stats` returns `application/json` |
229
+ | Dashboard route | `/mapick/dashboard` returns Mapick Firewall HTML |
230
+ | CLI status | returns `version: 0.2.9` |
231
+ | Emergency stop | `openclaw firewall stop` sets `emergency_stop: true` |
232
+ | Resume | `openclaw firewall resume` sets `emergency_stop: false` |
233
+ | Test suite | 9 files, 47 tests passing |
109
234
 
110
- # 3. Verify registration
111
- openclaw plugins list | grep mapick-firewall
235
+ If you previously installed early builds, you may see a duplicate plugin warning from an old legacy path. The active plugin should point to:
112
236
 
113
- # 4. Restart gateway
114
- openclaw gateway restart
237
+ ```text
238
+ ~/.openclaw/npm/node_modules/@mapick/cost-firewall/dist/index.js
239
+ ```
115
240
 
116
- # 5. Verify it works
117
- openclaw firewall status
241
+ and report:
118
242
 
119
- # 6. Optional: set a daily token budget
120
- openclaw firewall budget set 500000
243
+ ```json
244
+ {
245
+ "version": "0.2.9"
246
+ }
121
247
  ```
122
248
 
123
- After installation, verify:
124
- - [ ] `openclaw plugins list` shows `mapick-firewall` (enabled)
125
- - [ ] `openclaw firewall status` returns valid JSON
126
- - [ ] Dashboard accessible at http://localhost:18789/mapick/dashboard
127
- - [ ] Model config uses `mapick/` prefix if firewall protection is desired
128
- - [ ] Fallbacks also use `mapick/` prefix (non-mapick fallbacks bypass the firewall)
249
+ ## Where It Fits
129
250
 
130
- ---
251
+ Mapick is not trying to replace a full AI gateway or observability platform.
131
252
 
132
- ## Known Limitations
253
+ | Tool category | Examples | Use them for | Use Mapick for |
254
+ | ------------------ | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------- |
255
+ | AI gateway | [LiteLLM](https://github.com/BerriAI/litellm), [Portkey Gateway](https://github.com/Portkey-AI/gateway) | multi-provider routing, load balancing, central API access | local emergency brake and cost circuit breaker |
256
+ | Observability | [Helicone](https://github.com/Helicone/helicone), [Langfuse](https://github.com/langfuse/langfuse) | traces, analytics, experiments, dashboards | stopping a runaway local agent immediately |
257
+ | Provider dashboard | OpenAI, OpenRouter, Anthropic | billing history and provider-side usage | local pre-bill intervention |
258
+ | DIY scripts | shell, cron, custom rate limits | one-off control | packaged rules, CLI, dashboard, OpenClaw integration |
133
259
 
134
- - **Provider Layer**: `mapick/*` model routing is registered and unit-tested, but end-to-end gateway contract validation (createStreamFn invocation, synthetic stream delivery, fallback routing) is pending.
135
- - **Message format**: Plain text calls work; tool calls, system prompts, and reasoning payloads may need format conversion for upstream APIs.
260
+ The shortest positioning: **gateways route, dashboards explain, Mapick brakes.**
136
261
 
137
- ---
262
+ ## Troubleshooting
138
263
 
139
- ## Dev
264
+ If `openclaw firewall status` fails, check that the API is mounted:
140
265
 
141
266
  ```bash
142
- pnpm install
143
- pnpm build
144
- pnpm test
267
+ curl -i http://127.0.0.1:18789/mapick/api/stats
145
268
  ```
146
269
 
147
- ## Roadmap
270
+ Expected:
271
+
272
+ ```text
273
+ Content-Type: application/json
274
+ ```
148
275
 
149
- - **@mapick/cli** standalone CLI for skill recommendation, search, scan (works with any Agent via SKILL.md files)
150
- - **@mapick/firewall** — standalone daemon proxy: intercept ALL model calls from ANY AI CLI
276
+ If you see OpenClaw Control HTML instead, restart the gateway:
151
277
 
152
278
  ```bash
153
- # Claude Code
154
- export ANTHROPIC_BASE_URL=http://localhost:9199
279
+ openclaw gateway restart
280
+ openclaw firewall status
281
+ ```
155
282
 
156
- # Aider / Codex
157
- export OPENAI_BASE_URL=http://localhost:9199/v1
283
+ If you installed older beta builds and see a duplicate plugin warning, remove or ignore the old legacy extension path after confirming the active plugin is `0.2.9`.
158
284
 
159
- # Cursor
160
- # Settings → Model → Override Base URL → http://localhost:9199
161
- ```
285
+ ## Development
162
286
 
163
- No plugin needed. Just set a base URL.
287
+ ```bash
288
+ npm install
289
+ npm run build
290
+ npm test
291
+ ```
164
292
 
165
293
  ## License
166
294
 
167
295
  MIT
168
-
169
- ---
170
-
171
- *Made by [Mapick AI](https://github.com/mapick-ai) — because AI agents shouldn't break the bank.*
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.8",
16
+ version: "0.2.10",
17
17
  register(api) {
18
18
  const config = api.config?.plugins?.entries?.[PLUGIN_ID]?.config ?? {};
19
19
  const state = new FirewallState(config);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAe;IACb,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;IAEhB,QAAQ,CAAC,GAAQ;QACf,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAElD,sBAAsB;QACtB,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjC,0BAA0B;QAC1B,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEpC,eAAe;QACf,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE/B,8EAA8E;QAC9E,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjC,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,qBAAqB;QACrB,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjD,yBAAyB;QACzB,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACzC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC;gBACZ,IAAI,EAAE,cAAc;gBACpB,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW;gBAC3C,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAe;IACb,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,QAAQ;IAEjB,QAAQ,CAAC,GAAQ;QACf,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAElD,sBAAsB;QACtB,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjC,0BAA0B;QAC1B,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEpC,eAAe;QACf,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAE/B,8EAA8E;QAC9E,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjC,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,qBAAqB;QACrB,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEjD,yBAAyB;QACzB,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACzC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC;gBACZ,IAAI,EAAE,cAAc;gBACpB,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW;gBAC3C,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY;aAC9C,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
@@ -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.8",
5
+ "version": "0.2.10",
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.8",
3
+ "version": "0.2.10",
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": [