@mapick/cost-firewall 0.1.1 → 0.2.1

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 (61) hide show
  1. package/dist/breaker.d.ts +3 -0
  2. package/dist/breaker.d.ts.map +1 -1
  3. package/dist/breaker.js +8 -1
  4. package/dist/breaker.js.map +1 -1
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +88 -16
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +2 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/dashboard/html.d.ts.map +1 -1
  12. package/dist/dashboard/html.js +82 -38
  13. package/dist/dashboard/html.js.map +1 -1
  14. package/dist/dashboard/index.d.ts.map +1 -1
  15. package/dist/dashboard/index.js +2 -0
  16. package/dist/dashboard/index.js.map +1 -1
  17. package/dist/hooks/before-agent-reply.d.ts +9 -0
  18. package/dist/hooks/before-agent-reply.d.ts.map +1 -1
  19. package/dist/hooks/before-agent-reply.js +42 -6
  20. package/dist/hooks/before-agent-reply.js.map +1 -1
  21. package/dist/hooks/before-model-resolve.d.ts +20 -0
  22. package/dist/hooks/before-model-resolve.d.ts.map +1 -0
  23. package/dist/hooks/before-model-resolve.js +33 -0
  24. package/dist/hooks/before-model-resolve.js.map +1 -0
  25. package/dist/hooks/index.d.ts.map +1 -1
  26. package/dist/hooks/index.js +6 -2
  27. package/dist/hooks/index.js.map +1 -1
  28. package/dist/hooks/model-call.d.ts.map +1 -1
  29. package/dist/hooks/model-call.js +14 -1
  30. package/dist/hooks/model-call.js.map +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/pricing.d.ts +2 -4
  33. package/dist/pricing.d.ts.map +1 -1
  34. package/dist/pricing.js +2 -29
  35. package/dist/pricing.js.map +1 -1
  36. package/dist/provider/index.d.ts.map +1 -1
  37. package/dist/provider/index.js +5 -8
  38. package/dist/provider/index.js.map +1 -1
  39. package/dist/provider/stream.d.ts +2 -7
  40. package/dist/provider/stream.d.ts.map +1 -1
  41. package/dist/provider/stream.js +1 -119
  42. package/dist/provider/stream.js.map +1 -1
  43. package/dist/provider/synthetic.d.ts.map +1 -1
  44. package/dist/provider/synthetic.js +10 -1
  45. package/dist/provider/synthetic.js.map +1 -1
  46. package/dist/provider/upstream/anthropic.d.ts +1 -1
  47. package/dist/provider/upstream/anthropic.d.ts.map +1 -1
  48. package/dist/provider/upstream/anthropic.js +12 -4
  49. package/dist/provider/upstream/anthropic.js.map +1 -1
  50. package/dist/provider/upstream/openai.d.ts +1 -1
  51. package/dist/provider/upstream/openai.d.ts.map +1 -1
  52. package/dist/provider/upstream/openai.js +2 -3
  53. package/dist/provider/upstream/openai.js.map +1 -1
  54. package/dist/source.js +3 -3
  55. package/dist/source.js.map +1 -1
  56. package/dist/state.js +1 -1
  57. package/dist/types.d.ts +1 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js.map +1 -1
  60. package/openclaw.plugin.json +49 -13
  61. package/package.json +1 -1
@@ -6,6 +6,13 @@
6
6
  * - Daily Budget blocking
7
7
  * - Source Cooldown blocking
8
8
  */
9
+ // Test block flag — set by llm_input hook when user types 'block test'
10
+ export let testBlockRequested = null;
11
+ // Prevent re-triggering from conversation history containing "block test"
12
+ let testBlockProcessed = false;
13
+ export function clearTestBlock() {
14
+ testBlockRequested = null;
15
+ }
9
16
  export function createBeforeAgentReplyHandler(state, store) {
10
17
  return async function handleBeforeAgentReply(event, ctx) {
11
18
  const source = event.agentId ?? event.sessionKey ?? "unknown";
@@ -20,12 +27,12 @@ export function createBeforeAgentReplyHandler(state, store) {
20
27
  });
21
28
  state.globalStats.todayBlocked++;
22
29
  const messages = {
23
- emergency_stop: "Mapick Cost Firewall: all AI calls are paused.",
24
- daily_token_limit: "Mapick Cost Firewall: today's token limit has been reached.",
25
- source_cooldown: "Mapick Cost Firewall: this source is cooling down.",
26
- consecutive_failures: "Mapick Cost Firewall: this source is cooling down due to consecutive failures.",
27
- token_velocity: "Mapick Cost Firewall: this source is cooling down due to high token velocity.",
28
- call_frequency: "Mapick Cost Firewall: this source is cooling down due to high call frequency.",
30
+ emergency_stop: "🛑 Emergency stop activated. All AI calls are blocked. Use `openclaw firewall resume` to restore.",
31
+ daily_token_limit: `⛔ Daily token limit reached. Today's AI usage has exceeded the limit. Use \`openclaw firewall status\` to check usage or \`openclaw firewall budget reset\` to remove the limit.`,
32
+ source_cooldown: `🔥 Breaker tripped source is in cooldown for ${state.breaker.getCooldownRemaining(source)}ms. Wait for cooldown or use \`openclaw firewall reset "${source}"\` to clear.`,
33
+ consecutive_failures: `⚠️ Source "${source}" blocked: ${state.config.breaker?.consecutiveFailures ?? 3} consecutive failures triggered breaker. Use \`openclaw firewall reset "${source}"\` to clear.`,
34
+ token_velocity: `⚡ Source "${source}" blocked: token rate exceeded ${state.config.breaker?.tokenVelocityThreshold?.toLocaleString() ?? "limit"} tokens/${state.config.breaker?.tokenVelocityWindowSec ?? 60}s. Use \`openclaw firewall reset "${source}"\` to clear.`,
35
+ call_frequency: `📞 Source "${source}" blocked: call frequency exceeded ${state.config.breaker?.callFrequencyThreshold ?? 30} calls/${state.config.breaker?.callFrequencyWindowSec ?? 60}s. Use \`openclaw firewall reset "${source}"\` to clear.`,
29
36
  };
30
37
  return {
31
38
  handled: true,
@@ -36,7 +43,36 @@ export function createBeforeAgentReplyHandler(state, store) {
36
43
  reason: result.reason,
37
44
  };
38
45
  }
46
+ // Test block trigger
47
+ if (testBlockRequested) {
48
+ const src = testBlockRequested.source || "unknown";
49
+ testBlockRequested = null;
50
+ store.append({ type: "blocked", source: src, reason: "test_block", layer: "hook" });
51
+ state.globalStats.todayBlocked++;
52
+ return {
53
+ handled: true,
54
+ reply: {
55
+ text: `🧪 Block test triggered successfully for source "${src}". The firewall is working. Use \`openclaw firewall status\` to verify the blocked count increased.`,
56
+ isError: true,
57
+ },
58
+ reason: "test_block",
59
+ };
60
+ }
39
61
  return undefined;
40
62
  };
41
63
  }
64
+ /** Handle llm_input — check for test block trigger phrase */
65
+ export function createTestBlockDetector(store) {
66
+ return function detectTestBlock(event, _ctx) {
67
+ const prompt = event.prompt ?? "";
68
+ if (prompt.includes("阻断测试") || prompt.includes("block test") || prompt.includes("test block")) {
69
+ // Only trigger once per gateway process to avoid re-triggering from history
70
+ if (testBlockProcessed)
71
+ return;
72
+ testBlockProcessed = true;
73
+ testBlockRequested = { source: event.provider ?? "chat" };
74
+ store.append({ type: "test_block_triggered", reason: "user requested block test" });
75
+ }
76
+ };
77
+ }
42
78
  //# sourceMappingURL=before-agent-reply.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"before-agent-reply.js","sourceRoot":"","sources":["../../src/hooks/before-agent-reply.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAyBH,MAAM,UAAU,6BAA6B,CAC3C,KAAoB,EACpB,KAAiB;IAEjB,OAAO,KAAK,UAAU,sBAAsB,CAC1C,KAA4B,EAC5B,GAAwB;QAExB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QAE9D,mBAAmB;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,MAAM,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,MAAO;gBACtB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;YACH,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;YAEjC,MAAM,QAAQ,GAA2B;gBACvC,cAAc,EAAE,gDAAgD;gBAChE,iBAAiB,EAAE,6DAA6D;gBAChF,eAAe,EAAE,oDAAoD;gBACrE,oBAAoB,EAAE,gFAAgF;gBACtG,cAAc,EAAE,+EAA+E;gBAC/F,cAAc,EAAE,+EAA+E;aAChG,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAO,CAAC,IAAI,wCAAwC;oBAC1E,OAAO,EAAE,IAAI;iBACd;gBACD,MAAM,EAAE,MAAM,CAAC,MAAO;aACvB,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"before-agent-reply.js","sourceRoot":"","sources":["../../src/hooks/before-agent-reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * before_model_resolve hook — transparent model routing through firewall
3
+ *
4
+ * Intercepts model resolution and rewrites non-mapick models to
5
+ * mapick/<provider>/<model>, making the Provider Layer transparent.
6
+ * Users keep their existing model config — no changes needed.
7
+ */
8
+ import type { FirewallState } from "../state.js";
9
+ import type { EventStore } from "../store.js";
10
+ export interface BeforeModelResolveEvent {
11
+ provider: string;
12
+ model: string;
13
+ runId?: string;
14
+ }
15
+ export interface ModelResolveResult {
16
+ providerOverride?: string;
17
+ modelOverride?: string;
18
+ }
19
+ export declare function createBeforeModelResolveHandler(state: FirewallState, store: EventStore): (event: any, _ctx: any) => ModelResolveResult | undefined;
20
+ //# sourceMappingURL=before-model-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-model-resolve.d.ts","sourceRoot":"","sources":["../../src/hooks/before-model-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,IAGf,OAAO,GAAG,EACV,MAAM,GAAG,KACR,kBAAkB,GAAG,SAAS,CAuBlC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * before_model_resolve hook — transparent model routing through firewall
3
+ *
4
+ * Intercepts model resolution and rewrites non-mapick models to
5
+ * mapick/<provider>/<model>, making the Provider Layer transparent.
6
+ * Users keep their existing model config — no changes needed.
7
+ */
8
+ import { isMapickModelRef } from "../provider/route.js";
9
+ export function createBeforeModelResolveHandler(state, store) {
10
+ return function handleBeforeModelResolve(event, _ctx) {
11
+ // Defensive: real OpenClaw events may have undefined model/provider
12
+ if (!event.model || !event.provider)
13
+ return undefined;
14
+ // Already using mapick/* — no rewrite needed
15
+ if (isMapickModelRef(event.model))
16
+ return undefined;
17
+ // Rewrite ALL calls to mapick/<provider>/<model>
18
+ // observe mode: routes through Provider Layer for tracking (no blocking)
19
+ // protect mode: routes through Provider Layer for tracking + blocking
20
+ const newModel = `mapick/${event.provider}/${event.model}`;
21
+ store.append({
22
+ type: "model_rewrite",
23
+ reason: "transparent_firewall_routing",
24
+ provider: event.provider,
25
+ model: event.model,
26
+ });
27
+ return {
28
+ providerOverride: "mapick",
29
+ modelOverride: newModel,
30
+ };
31
+ };
32
+ }
33
+ //# sourceMappingURL=before-model-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-model-resolve.js","sourceRoot":"","sources":["../../src/hooks/before-model-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAaxD,MAAM,UAAU,+BAA+B,CAC7C,KAAoB,EACpB,KAAiB;IAEjB,OAAO,SAAS,wBAAwB,CACtC,KAAU,EACV,IAAS;QAET,oEAAoE;QACpE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAEtD,6CAA6C;QAC7C,IAAI,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEpD,iDAAiD;QACjD,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3D,KAAK,CAAC,MAAM,CAAC;YACX,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,8BAA8B;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,OAAO;YACL,gBAAgB,EAAE,QAAQ;YAC1B,aAAa,EAAE,QAAQ;SACxB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,GAChB,IAAI,CAUN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,GAChB,IAAI,CAcN"}
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * Hook registration entry point
3
3
  */
4
- import { createBeforeAgentReplyHandler } from "./before-agent-reply.js";
4
+ import { createBeforeAgentReplyHandler, createTestBlockDetector } from "./before-agent-reply.js";
5
+ import { createBeforeModelResolveHandler } from "./before-model-resolve.js";
5
6
  import { createModelCallStartedHandler, createModelCallEndedHandler } from "./model-call.js";
6
7
  import { createAgentEndHandler } from "./agent-end.js";
7
8
  export function registerHooks(api, state, store) {
8
9
  api.on("before_agent_reply", createBeforeAgentReplyHandler(state, store));
10
+ api.on("before_model_resolve", createBeforeModelResolveHandler(state, store));
9
11
  api.on("model_call_started", createModelCallStartedHandler(state, store));
10
12
  api.on("model_call_ended", createModelCallEndedHandler(state, store));
11
13
  api.on("agent_end", createAgentEndHandler(state, store));
14
+ // llm_input — test block detection (triggers on "block test" phrase)
15
+ api.on("llm_input", createTestBlockDetector(store));
12
16
  if (state.config.privacy?.enableRawConversationHooks) {
13
- // llm_input/output — opt-in only
17
+ // llm_output — opt-in only
14
18
  // To be implemented in future versions
15
19
  }
16
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,UAAU,aAAa,CAC3B,GAAQ,EACR,KAAoB,EACpB,KAAiB;IAEjB,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEzD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,0BAA0B,EAAE,CAAC;QACrD,iCAAiC;QACjC,uCAAuC;IACzC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,UAAU,aAAa,CAC3B,GAAQ,EACR,KAAoB,EACpB,KAAiB;IAEjB,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,EAAE,CAAC,sBAAsB,EAAE,+BAA+B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9E,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEzD,qEAAqE;IACrE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,0BAA0B,EAAE,CAAC;QACrD,2BAA2B;QAC3B,uCAAuC;IACzC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-call.d.ts","sourceRoot":"","sources":["../../src/hooks/model-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC9F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE;QACN,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,IAGf,OAAO,qBAAqB,EAC5B,KAAK,GAAG,KACP,IAAI,CAeR;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,IAGf,OAAO,mBAAmB,EAC1B,KAAK,GAAG,KACP,IAAI,CAmGR"}
1
+ {"version":3,"file":"model-call.d.ts","sourceRoot":"","sources":["../../src/hooks/model-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,SAAS,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC9F,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE;QACN,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,IAGf,OAAO,qBAAqB,EAC5B,KAAK,GAAG,KACP,IAAI,CAyBR;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,IAGf,OAAO,mBAAmB,EAC1B,KAAK,GAAG,KACP,IAAI,CAuGR"}
@@ -8,9 +8,18 @@
8
8
  * - Write event log
9
9
  */
10
10
  import { sourceFromModelCall } from "../source.js";
11
+ import { testBlockRequested, clearTestBlock } from "./before-agent-reply.js";
11
12
  export function createModelCallStartedHandler(state, store) {
12
13
  return function handleModelCallStarted(event, ctx) {
13
14
  const source = sourceFromModelCall(event, ctx);
15
+ // Test block detection: user typed "block test" → activate emergency stop now
16
+ if (testBlockRequested) {
17
+ const src = testBlockRequested.source || source;
18
+ clearTestBlock();
19
+ store.append({ type: "blocked", source: src, reason: "test_block", layer: "hook" });
20
+ state.globalStats.todayBlocked++;
21
+ state.setEmergencyStop(true);
22
+ }
14
23
  const run = state.getOrCreateRun(event.runId, source, event.sessionId, event.sessionKey);
15
24
  state.addCallToRun(event.runId, event.callId, {
16
25
  callId: event.callId,
@@ -55,7 +64,11 @@ export function createModelCallEndedHandler(state, store) {
55
64
  state.breaker.recordSuccess(source);
56
65
  }
57
66
  state.updateRunCost(event.runId, estimatedTokens);
58
- state.updateSourceStats(source, estimatedTokens);
67
+ // Provider layer tracks tokens for mapick/* calls — skip to avoid double-counting
68
+ // Uses model prefix check (more reliable than provider field)
69
+ if (!event.model?.startsWith("mapick/")) {
70
+ state.updateSourceStats(source, estimatedTokens);
71
+ }
59
72
  // Token velocity + call frequency + zero output detection
60
73
  if (event.outcome === "completed") {
61
74
  state.breaker.recordTokens(source, estimatedTokens);
@@ -1 +1 @@
1
- {"version":3,"file":"model-call.js","sourceRoot":"","sources":["../../src/hooks/model-call.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-call.js","sourceRoot":"","sources":["../../src/hooks/model-call.ts"],"names":[],"mappings":"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"}
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.1.0",
16
+ version: "0.2.1",
17
17
  register(api) {
18
18
  const config = api.config?.plugins?.entries?.[PLUGIN_ID]?.config ?? {};
19
19
  const state = new FirewallState(config);
package/dist/pricing.d.ts CHANGED
@@ -1,12 +1,10 @@
1
1
  /**
2
- * Model pricing and cost estimation
3
- *
4
- * OpenRouter: pass-through pricing (inherits upstream provider pricing)
2
+ * Token estimation estimates token count from usage or response bytes.
5
3
  */
6
4
  export interface TokenUsage {
7
5
  prompt_tokens?: number;
8
6
  completion_tokens?: number;
9
7
  }
10
- export declare function estimateCost(usage: TokenUsage | null | undefined, provider: string, model: string, responseStreamBytes?: number): number;
8
+ export declare function estimateTokens(usage: TokenUsage | null | undefined, provider: string, model: string, responseStreamBytes?: number): number;
11
9
  export declare function getProviderModelKey(provider: string, model: string): string;
12
10
  //# sourceMappingURL=pricing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,GAC3B,MAAM,CAUR;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3E"}
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,GAC3B,MAAM,CAUR;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3E"}
package/dist/pricing.js CHANGED
@@ -1,34 +1,7 @@
1
1
  /**
2
- * Model pricing and cost estimation
3
- *
4
- * OpenRouter: pass-through pricing (inherits upstream provider pricing)
2
+ * Token estimation estimates token count from usage or response bytes.
5
3
  */
6
- // Pricing table: $/1M tokens
7
- const PRICING = {
8
- openai: {
9
- "gpt-4o": { input: 2.5, output: 10 },
10
- "gpt-4o-mini": { input: 0.15, output: 0.6 },
11
- "gpt-4-turbo": { input: 10, output: 30 },
12
- "gpt-3.5-turbo": { input: 0.5, output: 1.5 },
13
- },
14
- anthropic: {
15
- "claude-sonnet-4-6": { input: 3, output: 15 },
16
- "claude-sonnet-4-20250514": { input: 3, output: 15 },
17
- "claude-sonnet-4-5": { input: 3, output: 15 },
18
- "claude-haiku-3-5": { input: 0.8, output: 4 },
19
- },
20
- openrouter: {}, // pass-through pricing
21
- deepseek: {
22
- "deepseek-chat": { input: 0.28, output: 0.42 },
23
- "deepseek-reasoner": { input: 0.55, output: 2.19 },
24
- },
25
- qwen: {
26
- "qwen3-plus": { input: 0.5, output: 2 },
27
- },
28
- };
29
- // Fallback: estimate by response bytes (assuming 1 token ≈ 4 bytes, $3/1M tokens)
30
- const FALLBACK_COST_PER_BYTE = 3 / 1_000_000 / 4;
31
- export function estimateCost(usage, provider, model, responseStreamBytes) {
4
+ export function estimateTokens(usage, provider, model, responseStreamBytes) {
32
5
  if (usage?.prompt_tokens || usage?.completion_tokens) {
33
6
  return (usage.prompt_tokens ?? 0) + (usage.completion_tokens ?? 0);
34
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6BAA6B;AAC7B,MAAM,OAAO,GAAsE;IACjF,MAAM,EAAE;QACN,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;QAC3C,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxC,eAAe,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;KAC7C;IACD,SAAS,EAAE;QACT,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7C,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACpD,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7C,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;KAC9C;IACD,UAAU,EAAE,EAAE,EAAE,uBAAuB;IACvC,QAAQ,EAAE;QACR,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9C,mBAAmB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;KACnD;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;KACxC;CACF,CAAC;AAEF,kFAAkF;AAClF,MAAM,sBAAsB,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;AAOjD,MAAM,UAAU,YAAY,CAC1B,KAAoC,EACpC,QAAgB,EAChB,KAAa,EACb,mBAA4B;IAE5B,IAAI,KAAK,EAAE,aAAa,IAAI,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAa;IACjE,OAAO,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,UAAU,cAAc,CAC5B,KAAoC,EACpC,QAAgB,EAChB,KAAa,EACb,mBAA4B;IAE5B,IAAI,KAAK,EAAE,aAAa,IAAI,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAa;IACjE,OAAO,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;AAChC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoB9C,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,GAChB,IAAI,CAuGN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoB9C,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,GAChB,IAAI,CAoGN"}
@@ -19,7 +19,7 @@ import { resolveUpstreamAuth } from "./auth.js";
19
19
  import { createBlockedStream } from "./synthetic.js";
20
20
  import { streamOpenAi, getOpenAiBaseUrl } from "./upstream/openai.js";
21
21
  import { streamAnthropic } from "./upstream/anthropic.js";
22
- import { estimateCost } from "../pricing.js";
22
+ import { estimateTokens } from "../pricing.js";
23
23
  function categorizeError(err) {
24
24
  const m = err?.message ?? String(err);
25
25
  if (m.includes("timeout") || m.includes("ETIMEDOUT"))
@@ -80,7 +80,6 @@ export function registerProvider(api, state, store) {
80
80
  };
81
81
  },
82
82
  createStreamFn() {
83
- const self = this;
84
83
  return async function* stream(model, context, options) {
85
84
  // model may come from ctx, use catalog + resolveDynamicModel provided model
86
85
  const modelId = typeof model === "string" ? model : model?.id ?? "";
@@ -109,13 +108,14 @@ export function registerProvider(api, state, store) {
109
108
  }
110
109
  // Resolve upstream auth
111
110
  const auth = await resolveUpstreamAuth(api, route.upstream, route.model);
111
+ const timeout = state.config.upstreamTimeoutMs ?? 30_000;
112
112
  let inputTokens = 0;
113
113
  let outputTokens = 0;
114
114
  let responseStreamBytes = 0;
115
115
  try {
116
116
  const s = route.upstream === "anthropic"
117
- ? streamAnthropic({ apiKey: auth.apiKey, model: route.model, messages: context?.messages ?? [], ...options })
118
- : streamOpenAi({ baseUrl: getOpenAiBaseUrl(route.upstream), apiKey: auth.apiKey, model: route.model, messages: context?.messages ?? [], ...options });
117
+ ? streamAnthropic({ apiKey: auth.apiKey, model: route.model, messages: context?.messages ?? [], ...options }, timeout)
118
+ : streamOpenAi({ baseUrl: getOpenAiBaseUrl(route.upstream), apiKey: auth.apiKey, model: route.model, messages: context?.messages ?? [], ...options }, timeout);
119
119
  for await (const chunk of s) {
120
120
  responseStreamBytes += JSON.stringify(chunk).length;
121
121
  if (chunk.usage) {
@@ -124,14 +124,11 @@ export function registerProvider(api, state, store) {
124
124
  }
125
125
  yield chunk;
126
126
  }
127
- const cost = estimateCost({ prompt_tokens: inputTokens, completion_tokens: outputTokens }, route.upstream, route.model, responseStreamBytes);
128
- store.append({ type: "model_call_ended", provider: route.upstream, model: route.model, outcome: "completed", estimatedCost: cost });
127
+ const cost = estimateTokens({ prompt_tokens: inputTokens, completion_tokens: outputTokens }, route.upstream, route.model, responseStreamBytes);
129
128
  state.updateSourceStats(src, cost);
130
129
  state.breaker.recordSuccess(src);
131
130
  }
132
131
  catch (err) {
133
- const msg = err?.message ?? String(err);
134
- store.append({ type: "model_call_ended", provider: route.upstream, model: route.model, outcome: "error", failureKind: categorizeError(err), reason: msg.slice(0, 200) });
135
132
  state.breaker.recordFailure(src);
136
133
  throw err;
137
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,5 @@
1
1
  /**
2
- * createStreamFn implementation
3
- *
4
- * Core: precheck before real upstream request is sent
5
- * SDK convention: createStreamFn(ctx) => async function*(model, context, options)
2
+ * stream.ts — removed. Provider Layer uses inline createStreamFn in provider/index.ts.
6
3
  */
7
- import type { FirewallState } from "../state.js";
8
- import type { EventStore } from "../store.js";
9
- export declare function createStreamFn(state: FirewallState, store: EventStore, api: any): (ctx: any) => (model: string, context: any, options: any) => AsyncGenerator<any, void, any>;
4
+ export {};
10
5
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/provider/stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,GAAG,IAIS,KAAK,GAAG,MACO,OAAO,MAAM,EAAE,SAAS,GAAG,EAAE,SAAS,GAAG,oCAwG1E"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/provider/stream.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC"}
@@ -1,120 +1,2 @@
1
- /**
2
- * createStreamFn implementation
3
- *
4
- * Core: precheck before real upstream request is sent
5
- * SDK convention: createStreamFn(ctx) => async function*(model, context, options)
6
- */
7
- import { parseMapickModelRef } from "./route.js";
8
- import { resolveUpstreamAuth } from "./auth.js";
9
- import { createBlockedStream } from "./synthetic.js";
10
- import { streamOpenAi, getOpenAiBaseUrl } from "./upstream/openai.js";
11
- import { streamAnthropic } from "./upstream/anthropic.js";
12
- import { sourceFromProviderContext } from "../source.js";
13
- import { estimateCost } from "../pricing.js";
14
- export function createStreamFn(state, store, api) {
15
- // Return createStreamFn matching SDK signature
16
- // OpenClaw calls createStreamFn(ctx), returns async generator function
17
- return function (ctx) {
18
- return async function* stream(model, context, options) {
19
- const route = parseMapickModelRef(model);
20
- if (!route) {
21
- throw new Error(`Invalid Mapick model reference: ${model}`);
22
- }
23
- const source = sourceFromProviderContext({ ...context, ...ctx }, route);
24
- // Precheck
25
- const result = state.precheck(source);
26
- if (!result.allow) {
27
- store.append({
28
- type: "blocked",
29
- source,
30
- provider: route.upstream,
31
- model: route.model,
32
- reason: result.reason,
33
- layer: result.layer,
34
- });
35
- state.globalStats.todayBlocked++;
36
- state.globalStats.todaySavedEstimate += estimateCost(null, route.upstream, route.model);
37
- yield* createBlockedStream({
38
- provider: route.upstream,
39
- model: route.model,
40
- reason: result.reason,
41
- format: route.upstream === "anthropic" ? "anthropic" : "openai",
42
- });
43
- return;
44
- }
45
- // Get upstream auth
46
- const auth = await resolveUpstreamAuth(api, route.upstream, route.model);
47
- // Call upstream
48
- let inputTokens = 0;
49
- let outputTokens = 0;
50
- let responseStreamBytes = 0;
51
- try {
52
- let upstreamStream;
53
- if (route.upstream === "anthropic") {
54
- upstreamStream = streamAnthropic({
55
- apiKey: auth.apiKey,
56
- model: route.model,
57
- messages: context.messages ?? [],
58
- ...options,
59
- });
60
- }
61
- else {
62
- upstreamStream = streamOpenAi({
63
- baseUrl: getOpenAiBaseUrl(route.upstream),
64
- apiKey: auth.apiKey,
65
- model: route.model,
66
- messages: context.messages ?? [],
67
- ...options,
68
- });
69
- }
70
- for await (const chunk of upstreamStream) {
71
- responseStreamBytes += JSON.stringify(chunk).length;
72
- if (chunk.usage) {
73
- inputTokens = chunk.usage.prompt_tokens ?? inputTokens;
74
- outputTokens = chunk.usage.completion_tokens ?? outputTokens;
75
- }
76
- yield chunk;
77
- }
78
- const cost = estimateCost({ prompt_tokens: inputTokens, completion_tokens: outputTokens }, route.upstream, route.model, responseStreamBytes);
79
- store.append({
80
- type: "model_call_ended",
81
- source,
82
- provider: route.upstream,
83
- model: route.model,
84
- outcome: "completed",
85
- estimatedCost: cost,
86
- });
87
- state.updateSourceStats(source, cost);
88
- state.breaker.recordSuccess(source);
89
- }
90
- catch (err) {
91
- store.append({
92
- type: "model_call_ended",
93
- source,
94
- provider: route.upstream,
95
- model: route.model,
96
- outcome: "error",
97
- failureKind: categorizeError(err),
98
- });
99
- state.breaker.recordFailure(source);
100
- throw err;
101
- }
102
- };
103
- };
104
- }
105
- function categorizeError(err) {
106
- if (err.message.includes("timeout"))
107
- return "timeout";
108
- if (err.message.includes("ECONNRESET"))
109
- return "connection_reset";
110
- if (err.message.includes("ECONNREFUSED"))
111
- return "connection_closed";
112
- if (err.message.includes("401"))
113
- return "auth_error";
114
- if (err.message.includes("429"))
115
- return "rate_limit";
116
- if (err.message.includes("5"))
117
- return "server_error";
118
- return "unknown";
119
- }
1
+ export {};
120
2
  //# sourceMappingURL=stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/provider/stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/provider/stream.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"synthetic.d.ts","sourceRoot":"","sources":["../../src/provider/synthetic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CACjC;AAED,wBAAuB,mBAAmB,CACxC,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAAC,GAAG,CAAC,CAwDrB"}
1
+ {"version":3,"file":"synthetic.d.ts","sourceRoot":"","sources":["../../src/provider/synthetic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CACjC;AAED,wBAAuB,mBAAmB,CACxC,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAAC,GAAG,CAAC,CAiErB"}
@@ -5,7 +5,16 @@
5
5
  */
6
6
  export async function* createBlockedStream(options) {
7
7
  const { provider, model, reason, format = "openai" } = options;
8
- const message = `Mapick Cost Firewall: Request blocked (${reason}). Provider: ${provider}, Model: ${model}.`;
8
+ const hints = {
9
+ emergency_stop: `🛑 Emergency stop. Use \`openclaw firewall resume\`.`,
10
+ daily_token_limit: `⛔ Token limit reached. Use \`openclaw firewall budget reset\`.`,
11
+ consecutive_failures: `⚠️ Consecutive failures. Use \`openclaw firewall reset ${provider}\` to clear.`,
12
+ token_velocity: `⚡ Token velocity exceeded. Cooldown active.`,
13
+ call_frequency: `📞 Call frequency exceeded. Cooldown active.`,
14
+ source_cooldown: `🔥 Source in cooldown. Wait or reset.`,
15
+ };
16
+ const hint = hints[reason] ?? `Blocked: ${reason}`;
17
+ const message = `Mapick Firewall — ${hint}`;
9
18
  if (format === "anthropic") {
10
19
  yield {
11
20
  type: "message_start",
@@ -1 +1 @@
1
- {"version":3,"file":"synthetic.js","sourceRoot":"","sources":["../../src/provider/synthetic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CACxC,OAA6B;IAE7B,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC/D,MAAM,OAAO,GAAG,0CAA0C,MAAM,gBAAgB,QAAQ,YAAY,KAAK,GAAG,CAAC;IAE7G,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM;YACJ,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE;gBACP,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;aAC7C;SACF,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,CAAC;YACR,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;SAC1C,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;SAC7C,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,CAAC;SACT,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;YAClC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;SAC5B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM;YACJ,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE;YACnC,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;oBAC9C,aAAa,EAAE,MAAM;iBACtB;aACF;YACD,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"synthetic.js","sourceRoot":"","sources":["../../src/provider/synthetic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CACxC,OAA6B;IAE7B,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC/D,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,sDAAsD;QACtE,iBAAiB,EAAE,gEAAgE;QACnF,oBAAoB,EAAE,0DAA0D,QAAQ,cAAc;QACtG,cAAc,EAAE,6CAA6C;QAC7D,cAAc,EAAE,8CAA8C;QAC9D,eAAe,EAAE,uCAAuC;KACzD,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,qBAAqB,IAAI,EAAE,CAAC;IAE5C,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,MAAM;YACJ,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE;gBACP,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE;gBAC9B,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,UAAU;gBACvB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;aAC7C;SACF,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,CAAC;YACR,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;SAC1C,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;SAC7C,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,CAAC;SACT,CAAC;QAEF,MAAM;YACJ,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE;YAClC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE;SAC5B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM;YACJ,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE;YACnC,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE;oBAC9C,aAAa,EAAE,MAAM;iBACtB;aACF;YACD,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -9,5 +9,5 @@ export interface AnthropicStreamOptions {
9
9
  stream?: boolean;
10
10
  [key: string]: any;
11
11
  }
12
- export declare function streamAnthropic(options: AnthropicStreamOptions): AsyncGenerator<any>;
12
+ export declare function streamAnthropic(options: AnthropicStreamOptions, timeoutMs?: number): AsyncGenerator<any>;
13
13
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/provider/upstream/anthropic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,wBAAuB,eAAe,CACpC,OAAO,EAAE,sBAAsB,GAC9B,cAAc,CAAC,GAAG,CAAC,CAgErB"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/provider/upstream/anthropic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,wBAAuB,eAAe,CACpC,OAAO,EAAE,sBAAsB,EAC/B,SAAS,GAAE,MAAe,GACzB,cAAc,CAAC,GAAG,CAAC,CAuErB"}