@mapick/cost-firewall 0.1.0

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 (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/dist/breaker.d.ts +30 -0
  4. package/dist/breaker.d.ts.map +1 -0
  5. package/dist/breaker.js +131 -0
  6. package/dist/breaker.js.map +1 -0
  7. package/dist/cli/index.d.ts +18 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +244 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/config-warn.d.ts +11 -0
  12. package/dist/config-warn.d.ts.map +1 -0
  13. package/dist/config-warn.js +26 -0
  14. package/dist/config-warn.js.map +1 -0
  15. package/dist/config.d.ts +7 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +32 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/dashboard/html.d.ts +2 -0
  20. package/dist/dashboard/html.d.ts.map +1 -0
  21. package/dist/dashboard/html.js +898 -0
  22. package/dist/dashboard/html.js.map +1 -0
  23. package/dist/dashboard/index.d.ts +8 -0
  24. package/dist/dashboard/index.d.ts.map +1 -0
  25. package/dist/dashboard/index.js +163 -0
  26. package/dist/dashboard/index.js.map +1 -0
  27. package/dist/dashboard/sse.d.ts +9 -0
  28. package/dist/dashboard/sse.d.ts.map +1 -0
  29. package/dist/dashboard/sse.js +22 -0
  30. package/dist/dashboard/sse.js.map +1 -0
  31. package/dist/hooks/agent-end.d.ts +18 -0
  32. package/dist/hooks/agent-end.d.ts.map +1 -0
  33. package/dist/hooks/agent-end.js +25 -0
  34. package/dist/hooks/agent-end.js.map +1 -0
  35. package/dist/hooks/before-agent-reply.d.ts +29 -0
  36. package/dist/hooks/before-agent-reply.d.ts.map +1 -0
  37. package/dist/hooks/before-agent-reply.js +42 -0
  38. package/dist/hooks/before-agent-reply.js.map +1 -0
  39. package/dist/hooks/index.d.ts +7 -0
  40. package/dist/hooks/index.d.ts.map +1 -0
  41. package/dist/hooks/index.js +17 -0
  42. package/dist/hooks/index.js.map +1 -0
  43. package/dist/hooks/model-call.d.ts +39 -0
  44. package/dist/hooks/model-call.d.ts.map +1 -0
  45. package/dist/hooks/model-call.js +120 -0
  46. package/dist/hooks/model-call.js.map +1 -0
  47. package/dist/index.d.ts +13 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +49 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/pricing.d.ts +12 -0
  52. package/dist/pricing.d.ts.map +1 -0
  53. package/dist/pricing.js +43 -0
  54. package/dist/pricing.js.map +1 -0
  55. package/dist/provider/auth.d.ts +14 -0
  56. package/dist/provider/auth.d.ts.map +1 -0
  57. package/dist/provider/auth.js +53 -0
  58. package/dist/provider/auth.js.map +1 -0
  59. package/dist/provider/index.d.ts +12 -0
  60. package/dist/provider/index.d.ts.map +1 -0
  61. package/dist/provider/index.js +134 -0
  62. package/dist/provider/index.js.map +1 -0
  63. package/dist/provider/route.d.ts +10 -0
  64. package/dist/provider/route.d.ts.map +1 -0
  65. package/dist/provider/route.js +19 -0
  66. package/dist/provider/route.js.map +1 -0
  67. package/dist/provider/stream.d.ts +10 -0
  68. package/dist/provider/stream.d.ts.map +1 -0
  69. package/dist/provider/stream.js +120 -0
  70. package/dist/provider/stream.js.map +1 -0
  71. package/dist/provider/synthetic.d.ts +13 -0
  72. package/dist/provider/synthetic.d.ts.map +1 -0
  73. package/dist/provider/synthetic.js +59 -0
  74. package/dist/provider/synthetic.js.map +1 -0
  75. package/dist/provider/upstream/anthropic.d.ts +13 -0
  76. package/dist/provider/upstream/anthropic.d.ts.map +1 -0
  77. package/dist/provider/upstream/anthropic.js +62 -0
  78. package/dist/provider/upstream/anthropic.js.map +1 -0
  79. package/dist/provider/upstream/openai.d.ts +17 -0
  80. package/dist/provider/upstream/openai.d.ts.map +1 -0
  81. package/dist/provider/upstream/openai.js +75 -0
  82. package/dist/provider/upstream/openai.js.map +1 -0
  83. package/dist/source.d.ts +35 -0
  84. package/dist/source.d.ts.map +1 -0
  85. package/dist/source.js +41 -0
  86. package/dist/source.js.map +1 -0
  87. package/dist/state.d.ts +56 -0
  88. package/dist/state.d.ts.map +1 -0
  89. package/dist/state.js +178 -0
  90. package/dist/state.js.map +1 -0
  91. package/dist/store.d.ts +23 -0
  92. package/dist/store.d.ts.map +1 -0
  93. package/dist/store.js +68 -0
  94. package/dist/store.js.map +1 -0
  95. package/dist/tools/index.d.ts +13 -0
  96. package/dist/tools/index.d.ts.map +1 -0
  97. package/dist/tools/index.js +63 -0
  98. package/dist/tools/index.js.map +1 -0
  99. package/dist/types.d.ts +98 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +7 -0
  102. package/dist/types.js.map +1 -0
  103. package/openclaw.plugin.json +44 -0
  104. package/package.json +49 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Agent Tools registration — users control Cost Firewall via conversation
3
+ *
4
+ * Usage:
5
+ * /firewall status → view status
6
+ * /firewall stop → emergency breaker
7
+ * /firewall resume → resume
8
+ * /firewall log → view recent events
9
+ */
10
+ import { getStatus, getLog } from "../cli/index.js";
11
+ export function registerTools(api, state, store) {
12
+ api.logger?.info(`[mapick-firewall] registerTools: mode=${api.registrationMode}`);
13
+ // Try using api.registerCommand instead of api.registerTool
14
+ if (typeof api.registerCommand === "function") {
15
+ api.logger?.info(`[mapick-firewall] registerCommand is available`);
16
+ api.registerCommand({
17
+ name: "firewall",
18
+ description: "Cost Firewall commands",
19
+ parameters: {
20
+ type: "object",
21
+ properties: {
22
+ action: {
23
+ type: "string",
24
+ enum: ["status", "stop", "resume", "mode", "log", "budget"],
25
+ description: "Action to perform"
26
+ }
27
+ },
28
+ required: ["action"]
29
+ },
30
+ async execute(_toolCallId, params) {
31
+ api.logger?.info(`[mapick-firewall] command executed: ${params.action}`);
32
+ switch (params.action) {
33
+ case "status": return { content: [{ type: "text", text: JSON.stringify(await getStatus(state, store), null, 2) }] };
34
+ case "stop":
35
+ state.setEmergencyStop(true);
36
+ return { content: [{ type: "text", text: "Emergency stop activated." }] };
37
+ case "resume":
38
+ state.setEmergencyStop(false);
39
+ return { content: [{ type: "text", text: "Resumed." }] };
40
+ case "log": return { content: [{ type: "text", text: JSON.stringify(await getLog(store, 10), null, 2) }] };
41
+ case "budget": return { content: [{ type: "text", text: `Daily token limit: ${state.config.dailyTokenLimit?.toLocaleString() ?? "unlimited"} tokens` }] };
42
+ case "mode": return { content: [{ type: "text", text: `Mode: ${state.globalStats.mode}` }] };
43
+ default: return { content: [{ type: "text", text: `Unknown action: ${params.action}` }] };
44
+ }
45
+ },
46
+ });
47
+ api.logger?.info(`[mapick-firewall] registerCommand done`);
48
+ }
49
+ else {
50
+ api.logger?.warn(`[mapick-firewall] registerCommand NOT available, trying registerTool...`);
51
+ api.registerTool({
52
+ name: "firewall_status",
53
+ description: "View Cost Firewall status: mode, tokens used, blocked count, token limit.",
54
+ parameters: { type: "object", properties: {}, required: [] },
55
+ async execute() {
56
+ const s = await getStatus(state, store);
57
+ return { content: [{ type: "text", text: JSON.stringify(s, null, 2) }] };
58
+ },
59
+ });
60
+ api.logger?.info(`[mapick-firewall] registerTool done`);
61
+ }
62
+ }
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,GAAQ,EAAE,KAAoB,EAAE,KAAiB;IAC7E,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,yCAAyC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAElF,4DAA4D;IAC5D,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAC9C,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACnE,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,wBAAwB;YACrC,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;wBAC3D,WAAW,EAAE,mBAAmB;qBACjC;iBACF;gBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;aACrB;YACD,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAW;gBAC5C,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,uCAAuC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACzE,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;oBACtB,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpH,KAAK,MAAM;wBAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC,EAAE,CAAC;oBACrH,KAAK,QAAQ;wBAAE,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;wBAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACvG,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC3G,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAuB,KAAK,CAAC,MAAc,CAAC,eAAe,EAAE,cAAc,EAAE,IAAI,WAAW,SAAS,EAAE,CAAC,EAAE,CAAC;oBACnK,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC7F,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC5F,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,yEAAyE,CAAC,CAAC;QAC5F,GAAG,CAAC,YAAY,CAAC;YACf,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,2EAA2E;YACxF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC5D,KAAK,CAAC,OAAO;gBACX,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3E,CAAC;SACF,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Shared type definitions
3
+ */
4
+ export type SourceKey = string;
5
+ export interface CallState {
6
+ callId: string;
7
+ provider: string;
8
+ model: string;
9
+ api?: string;
10
+ transport?: string;
11
+ startedAt: number;
12
+ durationMs?: number;
13
+ outcome?: "completed" | "error";
14
+ errorCategory?: string;
15
+ failureKind?: string;
16
+ requestPayloadBytes?: number;
17
+ responseStreamBytes?: number;
18
+ estimatedCost?: number;
19
+ }
20
+ export interface RunState {
21
+ runId: string;
22
+ sessionId?: string;
23
+ sessionKey?: string;
24
+ source: SourceKey;
25
+ startedAt: number;
26
+ calls: Map<string, CallState>;
27
+ llmCallTimestamps: number[];
28
+ cumulativeCost: number;
29
+ promptHashCounts: Map<string, number>;
30
+ finalizeWarningEmitted?: boolean;
31
+ status: "healthy" | "warning" | "danger";
32
+ reason?: string;
33
+ }
34
+ export interface BreakerState {
35
+ source: SourceKey;
36
+ consecutiveFailures: number;
37
+ brokenUntil?: number;
38
+ reason?: string;
39
+ tokenHistory: {
40
+ ts: number;
41
+ tokens: number;
42
+ }[];
43
+ callTimestamps: number[];
44
+ lastCallTs?: number;
45
+ lastCallTokens?: number;
46
+ }
47
+ export interface FirewallConfig {
48
+ breaker?: {
49
+ consecutiveFailures?: number;
50
+ cooldownSec?: number;
51
+ tokenVelocityWindowSec?: number;
52
+ tokenVelocityThreshold?: number;
53
+ callFrequencyWindowSec?: number;
54
+ callFrequencyThreshold?: number;
55
+ };
56
+ dailyTokenLimit?: number | null;
57
+ privacy?: {
58
+ storePromptText?: boolean;
59
+ enableRawConversationHooks?: boolean;
60
+ };
61
+ }
62
+ export interface GlobalStats {
63
+ emergencyStop: boolean;
64
+ mode: "observe" | "protect";
65
+ todayTokens: number;
66
+ todayBlocked: number;
67
+ todaySavedEstimate: number;
68
+ }
69
+ export interface BlockDecision {
70
+ allow: boolean;
71
+ reason?: string;
72
+ layer: "hook" | "provider";
73
+ }
74
+ export interface PrecheckResult {
75
+ allow: boolean;
76
+ reason?: string;
77
+ layer: "hook" | "provider";
78
+ }
79
+ export interface FirewallEvent {
80
+ type: string;
81
+ timestamp: number;
82
+ runId?: string;
83
+ callId?: string;
84
+ source?: SourceKey;
85
+ provider?: string;
86
+ model?: string;
87
+ outcome?: string;
88
+ failureKind?: string;
89
+ estimatedCost?: number;
90
+ cumulativeTokens?: number;
91
+ reason?: string;
92
+ layer?: "hook" | "provider";
93
+ runCalls?: number;
94
+ status?: string;
95
+ }
96
+ export declare const PLUGIN_ID = "mapick-firewall";
97
+ export declare const PLUGIN_NAME = "Mapick Cost Firewall";
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared type definitions
3
+ */
4
+ // Plugin ID
5
+ export const PLUGIN_ID = "mapick-firewall";
6
+ export const PLUGIN_NAME = "Mapick Cost Firewall";
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8GH,YAAY;AACZ,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC"}
@@ -0,0 +1,44 @@
1
+ {
2
+ "id": "mapick-firewall",
3
+ "name": "Mapick Cost Firewall",
4
+ "description": "AI call circuit breaker — block runaway requests, see who's burning money, one-click emergency stop.",
5
+ "version": "0.1.0",
6
+ "providers": ["mapick"],
7
+ "contracts": {
8
+ "tools": ["firewall"]
9
+ },
10
+ "toolMetadata": {},
11
+ "modelSupport": {
12
+ "modelPrefixes": ["mapick/"]
13
+ },
14
+ "activation": {
15
+ "onStartup": true
16
+ },
17
+ "configSchema": {
18
+ "type": "object",
19
+ "additionalProperties": false,
20
+ "properties": {
21
+ "breaker": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "consecutiveFailures": { "type": "number", "default": 3 },
26
+ "cooldownSec": { "type": "number", "default": 30 },
27
+ "tokenVelocityWindowSec": { "type": "number", "default": 60 },
28
+ "tokenVelocityThreshold": { "type": "number", "default": 100000 },
29
+ "callFrequencyWindowSec": { "type": "number", "default": 60 },
30
+ "callFrequencyThreshold": { "type": "number", "default": 30 }
31
+ }
32
+ },
33
+ "dailyTokenLimit": { "type": ["number", "null"], "default": null },
34
+ "privacy": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "properties": {
38
+ "storePromptText": { "type": "boolean", "default": false },
39
+ "enableRawConversationHooks": { "type": "boolean", "default": false }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@mapick/cost-firewall",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "description": "Mapick Cost Firewall — OpenClaw Plugs",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE",
19
+ "openclaw.plugin.json"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "test:coverage": "vitest run --coverage",
27
+ "lint": "eslint src test"
28
+ },
29
+ "openclaw": {
30
+ "extensions": [
31
+ "./src/index.ts"
32
+ ],
33
+ "providers": ["mapick"],
34
+ "compat": {
35
+ "pluginApi": ">=2026.3.24-beta.2",
36
+ "minGatewayVersion": "2026.3.24-beta.2"
37
+ },
38
+ "build": {
39
+ "openclawVersion": "2026.3.24-beta.2",
40
+ "pluginSdkVersion": "2026.3.24-beta.2"
41
+ }
42
+ },
43
+ "dependencies": {},
44
+ "devDependencies": {
45
+ "@types/node": "^22.0.0",
46
+ "typescript": "^5.7.0",
47
+ "vitest": "^3.1.1"
48
+ }
49
+ }