@mapick/cost-firewall 0.2.9 → 0.2.11

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,54 +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.11%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.
13
41
 
14
- **Install script:**
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`.
15
55
 
16
56
  ```bash
17
- curl -fsSL https://raw.githubusercontent.com/mapick-ai/cost-firewall/v0.2.9/install.sh | bash
57
+ curl -fsSL https://raw.githubusercontent.com/mapick-ai/cost-firewall/v0.2.11/install.sh | bash
58
+ openclaw firewall status
18
59
  ```
19
60
 
20
- **Manual:**
61
+ Manual install:
21
62
 
22
63
  ```bash
23
- openclaw plugins update mapick-firewall || openclaw plugins install @mapick/cost-firewall --force --pin
64
+ openclaw plugins install @mapick/cost-firewall
24
65
  openclaw plugins enable mapick-firewall
25
66
  openclaw gateway restart
26
67
  openclaw firewall status
27
68
  ```
28
69
 
29
- Dashboard: **http://localhost:18789/mapick/dashboard**
70
+ Recommended first run:
30
71
 
31
- ---
72
+ ```bash
73
+ openclaw firewall mode observe
74
+ openclaw firewall log --last 20
75
+ ```
32
76
 
33
- ## Commands
77
+ Start in `observe` mode, watch what would have happened, then switch to `protect` once the thresholds match your workload.
34
78
 
35
- | CLI | Action |
36
- | ------------------------------------ | ------------------------------------------ |
37
- | `openclaw firewall status` | View status (mode, tokens, blocked, limit) |
38
- | `openclaw firewall stop` | 🛑 Emergency stop — block all AI calls |
39
- | `openclaw firewall resume` | ▶️ Resume after stop |
40
- | `openclaw firewall mode observe` | Observe mode — record only, no blocking |
41
- | `openclaw firewall mode protect` | Protect mode — enable all breaker rules |
42
- | `openclaw firewall budget set 50000` | Set daily token limit to 50K |
43
- | `openclaw firewall budget reset` | Remove daily token limit |
44
- | `openclaw firewall log --last 20` | Show last 20 events |
45
- | `openclaw firewall reset <source>` | Reset a source from cooldown |
79
+ ```bash
80
+ openclaw firewall mode protect
81
+ ```
46
82
 
47
- In OpenClaw chat: `/firewall status`, `/firewall stop`, `/firewall resume`, `/firewall log`
83
+ ## Dashboard
48
84
 
49
- ---
85
+ After install, open:
86
+
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
100
+
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
+ ```
50
116
 
51
- ## Config
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
52
160
 
53
161
  ```jsonc
54
162
  {
@@ -73,100 +181,115 @@ In OpenClaw chat: `/firewall status`, `/firewall stop`, `/firewall resume`, `/fi
73
181
  }
74
182
  ```
75
183
 
76
- ---
184
+ Defaults are meant to catch obvious loops. Raise thresholds for busy agent workloads; lower the daily cap for hobby projects or demos.
77
185
 
78
- ## Breaking Rules
186
+ ## How It Works
79
187
 
80
- 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
+ ```
81
199
 
82
- | Rule | Trigger | Effect |
83
- | -------------------- | ------------------------ | ------------------------- |
84
- | Emergency Stop | `openclaw firewall stop` | Block all calls |
85
- | Daily Token Limit | Today's tokens ≥ limit | Block all calls |
86
- | Consecutive Failures | N failures in a row | Block source for cooldown |
87
- | Token Velocity | N tokens in W seconds | Block source for cooldown |
88
- | 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:
89
201
 
90
- ### Defaults
202
+ - source identifier
203
+ - provider and model
204
+ - outcome and error category
205
+ - estimated token usage
206
+ - timestamps and cooldown state
91
207
 
92
- | Rule | Threshold | Window | Cooldown |
93
- | -------------------- | ---------------- | ------ | -------- |
94
- | Consecutive Failures | 3 | — | 30s |
95
- | Token Velocity | 100K tokens | 60s | 30s |
96
- | Call Frequency | 30 calls | 60s | 30s |
97
- | Daily Token Limit | None (unlimited) | — | — |
208
+ ## Privacy
98
209
 
99
- ---
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 |
100
217
 
101
- ## AI Installation Checklist
218
+ The default privacy setting is `storePromptText: false`.
102
219
 
103
- Copy the entire block below and execute:
220
+ ## Verified On Real OpenClaw
104
221
 
105
- ```bash
106
- # 1. Install or update the plugin
107
- openclaw plugins update mapick-firewall || openclaw plugins install @mapick/cost-firewall --force --pin
222
+ `v0.2.9` was tested on a real OpenClaw gateway:
108
223
 
109
- # 2. Enable it
110
- 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 |
111
234
 
112
- # 3. Verify registration
113
- 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:
114
236
 
115
- # 4. Restart gateway
116
- openclaw gateway restart
237
+ ```text
238
+ ~/.openclaw/npm/node_modules/@mapick/cost-firewall/dist/index.js
239
+ ```
117
240
 
118
- # 5. Verify it works
119
- openclaw firewall status
241
+ and report:
120
242
 
243
+ ```json
244
+ {
245
+ "version": "0.2.9"
246
+ }
121
247
  ```
122
248
 
123
- After installation, verify:
249
+ ## Where It Fits
124
250
 
125
- - [ ] `openclaw plugins list` shows `mapick-firewall` (enabled)
126
- - [ ] `openclaw firewall status` returns valid JSON
127
- - [ ] Dashboard accessible at http://localhost:18789/mapick/dashboard
128
- - [ ] Model config uses `mapick/` prefix if firewall protection is desired
129
- - [ ] Fallbacks also use `mapick/` prefix (non-mapick fallbacks bypass the firewall)
251
+ Mapick is not trying to replace a full AI gateway or observability platform.
130
252
 
131
- ---
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 |
132
259
 
133
- ## Known Limitations
260
+ The shortest positioning: **gateways route, dashboards explain, Mapick brakes.**
134
261
 
135
- - **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.
136
- - **Message format**: Plain text calls work; tool calls, system prompts, and reasoning payloads may need format conversion for upstream APIs.
262
+ ## Troubleshooting
137
263
 
138
- ---
139
-
140
- ## Dev
264
+ If `openclaw firewall status` fails, check that the API is mounted:
141
265
 
142
266
  ```bash
143
- pnpm install
144
- pnpm build
145
- pnpm test
267
+ curl -i http://127.0.0.1:18789/mapick/api/stats
146
268
  ```
147
269
 
148
- ## Roadmap
270
+ Expected:
271
+
272
+ ```text
273
+ Content-Type: application/json
274
+ ```
149
275
 
150
- - **@mapick/cli** standalone CLI for skill recommendation, search, scan (works with any Agent via SKILL.md files)
151
- - **@mapick/firewall** — standalone daemon proxy: intercept ALL model calls from ANY AI CLI
276
+ If you see OpenClaw Control HTML instead, restart the gateway:
152
277
 
153
278
  ```bash
154
- # Claude Code
155
- export ANTHROPIC_BASE_URL=http://localhost:9199
279
+ openclaw gateway restart
280
+ openclaw firewall status
281
+ ```
156
282
 
157
- # Aider / Codex
158
- 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`.
159
284
 
160
- # Cursor
161
- # Settings → Model → Override Base URL → http://localhost:9199
162
- ```
285
+ ## Development
163
286
 
164
- No plugin needed. Just set a base URL.
287
+ ```bash
288
+ npm install
289
+ npm run build
290
+ npm test
291
+ ```
165
292
 
166
293
  ## License
167
294
 
168
295
  MIT
169
-
170
- ---
171
-
172
- _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.9",
16
+ version: "0.2.11",
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.9",
5
+ "version": "0.2.11",
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.9",
3
+ "version": "0.2.11",
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": [