@clawnitor/plugin 1.0.1 → 1.2.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.
- package/README.md +25 -7
- package/dist/auto-kill.d.ts +29 -0
- package/dist/auto-kill.d.ts.map +1 -0
- package/dist/auto-kill.js +53 -0
- package/dist/auto-kill.js.map +1 -0
- package/dist/hooks/lifecycle.d.ts.map +1 -1
- package/dist/hooks/lifecycle.js +14 -4
- package/dist/hooks/lifecycle.js.map +1 -1
- package/dist/hooks/llm.d.ts.map +1 -1
- package/dist/hooks/llm.js +7 -2
- package/dist/hooks/llm.js.map +1 -1
- package/dist/hooks/message.d.ts.map +1 -1
- package/dist/hooks/message.js +18 -9
- package/dist/hooks/message.js.map +1 -1
- package/dist/hooks/tool-call.d.ts +2 -0
- package/dist/hooks/tool-call.d.ts.map +1 -1
- package/dist/hooks/tool-call.js +66 -21
- package/dist/hooks/tool-call.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -3
- package/dist/index.js.map +1 -1
- package/dist/rule-cache.d.ts +1 -0
- package/dist/rule-cache.d.ts.map +1 -1
- package/dist/rule-cache.js +7 -0
- package/dist/rule-cache.js.map +1 -1
- package/dist/subagent-context.d.ts +24 -0
- package/dist/subagent-context.d.ts.map +1 -0
- package/dist/subagent-context.js +31 -0
- package/dist/subagent-context.js.map +1 -0
- package/dist/transport/sqlite-cache.d.ts.map +1 -1
- package/dist/transport/sqlite-cache.js +81 -40
- package/dist/transport/sqlite-cache.js.map +1 -1
- package/dist/transport/websocket-client.d.ts.map +1 -1
- package/dist/transport/websocket-client.js +6 -2
- package/dist/transport/websocket-client.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -12,10 +12,13 @@ Prompt-level safety instructions are fragile — they get dropped during context
|
|
|
12
12
|
## Install
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
|
|
15
|
+
openclaw plugins install @clawnitor/plugin
|
|
16
|
+
npx clawnitor init
|
|
16
17
|
```
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
`clawnitor init` handles authentication, API key generation, and config in one command.
|
|
20
|
+
|
|
21
|
+
**Or manually:** sign up at [clawnitor.io](https://clawnitor.io), copy your API key, and add to `openclaw.json`:
|
|
19
22
|
|
|
20
23
|
```json
|
|
21
24
|
{
|
|
@@ -41,15 +44,17 @@ Get your API key at [clawnitor.io](https://clawnitor.io). Events appear on your
|
|
|
41
44
|
| LLM requests | `llm_input` / `llm_output` | Model, tokens, cost |
|
|
42
45
|
| Messages | `message_sending` / `message_sent` / `message_received` | Content (redacted). **Can block sends.** |
|
|
43
46
|
| Lifecycle | `session_start` / `session_end` / `agent_end` | Session tracking |
|
|
44
|
-
| Sub-agents | `subagent_spawning` / `subagent_ended` |
|
|
47
|
+
| Sub-agents | `subagent_spawning` / `subagent_ended` | Subagent ID attribution, parent-child tracking |
|
|
45
48
|
|
|
46
|
-
## Pre-action defense (3 layers)
|
|
49
|
+
## Pre-action defense (3 layers + auto-kill)
|
|
47
50
|
|
|
48
51
|
Every tool call and message is checked **before execution**:
|
|
49
52
|
|
|
50
|
-
1. **Kill state** — server-triggered pause via WebSocket.
|
|
53
|
+
1. **Kill state** — server-triggered pause via WebSocket. Kill from anywhere — dashboard, API, any device.
|
|
51
54
|
2. **Local failsafe** — spend circuit breaker, rate limiter, tool blocklist. Always active, even offline.
|
|
52
|
-
3. **Cached rules** — your server-side rules fetched every 60s, evaluated locally. Keyword, rate, threshold — all pre-action.
|
|
55
|
+
3. **Cached rules** — your server-side rules fetched every 60s, evaluated locally. Keyword, rate, threshold — all pre-action. Each rule is configured to **block**, **alert**, or **both** — alert-only rules let the action proceed and notify you instead.
|
|
56
|
+
|
|
57
|
+
**Auto-kill:** If an agent triggers 3+ rule violations within a configurable time window (default: 10 minutes), Clawnitor automatically kills it. No manual intervention needed. Configurable per agent.
|
|
53
58
|
|
|
54
59
|
If any layer triggers, the action is blocked in-process. Zero network latency.
|
|
55
60
|
|
|
@@ -60,7 +65,11 @@ If any layer triggers, the action is blocked in-process. Zero network latency.
|
|
|
60
65
|
BLOCKED by Clawnitor
|
|
61
66
|
Rule matched: keyword "rm -rf"
|
|
62
67
|
Action stopped before execution
|
|
63
|
-
|
|
68
|
+
|
|
69
|
+
// After 3 violations in 10 minutes:
|
|
70
|
+
AUTO-KILLED by Clawnitor
|
|
71
|
+
3 violations in 8 minutes (threshold: 3)
|
|
72
|
+
Agent fully stopped. Resume from dashboard when ready.
|
|
64
73
|
```
|
|
65
74
|
|
|
66
75
|
## Configuration
|
|
@@ -94,6 +103,15 @@ BLOCKED by Clawnitor
|
|
|
94
103
|
}
|
|
95
104
|
```
|
|
96
105
|
|
|
106
|
+
## Dashboard features powered by this plugin
|
|
107
|
+
|
|
108
|
+
All captured events feed into the Clawnitor dashboard at [app.clawnitor.io](https://app.clawnitor.io):
|
|
109
|
+
|
|
110
|
+
- **Cost tracking** — per-agent spend breakdowns, 7-day trend charts, most expensive calls ranked
|
|
111
|
+
- **Decision traces** — visual session timelines showing every tool call in order, with cost and model attribution
|
|
112
|
+
- **Subagent tracking** — parent-child relationships visible in session timelines via subagent_id attribution
|
|
113
|
+
- **Saves counter** — tracks every time Clawnitor blocked a harmful action
|
|
114
|
+
|
|
97
115
|
## Privacy
|
|
98
116
|
|
|
99
117
|
Sensitive data (API keys, passwords, tokens) is automatically redacted before transmission. 25+ built-in patterns plus your custom `redactionPatterns`. Data sharing for aggregate pattern improvement is opt-in and **off by default**.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ViolationEntry {
|
|
2
|
+
ruleId: string;
|
|
3
|
+
ruleName: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
action: string;
|
|
6
|
+
target: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AutoKillConfig {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
threshold: number;
|
|
11
|
+
windowMinutes: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AutoKillResult {
|
|
14
|
+
shouldKill: boolean;
|
|
15
|
+
violations: ViolationEntry[];
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class ViolationTracker {
|
|
19
|
+
private violations;
|
|
20
|
+
private config;
|
|
21
|
+
constructor(config?: Partial<AutoKillConfig>);
|
|
22
|
+
updateConfig(config: Partial<AutoKillConfig>): void;
|
|
23
|
+
recordViolation(entry: ViolationEntry): AutoKillResult;
|
|
24
|
+
getViolationCount(): number;
|
|
25
|
+
getConfig(): Readonly<AutoKillConfig>;
|
|
26
|
+
reset(): void;
|
|
27
|
+
private prune;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=auto-kill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-kill.d.ts","sourceRoot":"","sources":["../src/auto-kill.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAQ5C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC;IAO5C,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc;IAoBtD,iBAAiB,IAAI,MAAM;IAO3B,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC;IAIrC,KAAK;IAIL,OAAO,CAAC,KAAK;CAMd"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class ViolationTracker {
|
|
2
|
+
violations = [];
|
|
3
|
+
config;
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.config = {
|
|
6
|
+
enabled: config?.enabled ?? true,
|
|
7
|
+
threshold: config?.threshold ?? 3,
|
|
8
|
+
windowMinutes: config?.windowMinutes ?? 10,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
updateConfig(config) {
|
|
12
|
+
if (config.enabled !== undefined)
|
|
13
|
+
this.config.enabled = config.enabled;
|
|
14
|
+
if (config.threshold !== undefined)
|
|
15
|
+
this.config.threshold = config.threshold;
|
|
16
|
+
if (config.windowMinutes !== undefined)
|
|
17
|
+
this.config.windowMinutes = config.windowMinutes;
|
|
18
|
+
}
|
|
19
|
+
recordViolation(entry) {
|
|
20
|
+
if (!this.config.enabled) {
|
|
21
|
+
return { shouldKill: false, violations: [], message: "" };
|
|
22
|
+
}
|
|
23
|
+
this.violations.push(entry);
|
|
24
|
+
this.prune();
|
|
25
|
+
const windowMs = this.config.windowMinutes * 60_000;
|
|
26
|
+
const cutoff = Date.now() - windowMs;
|
|
27
|
+
const inWindow = this.violations.filter((v) => v.timestamp > cutoff);
|
|
28
|
+
if (inWindow.length >= this.config.threshold) {
|
|
29
|
+
const message = `Auto-killed: ${inWindow.length} violations in ${this.config.windowMinutes} minutes (threshold: ${this.config.threshold})`;
|
|
30
|
+
return { shouldKill: true, violations: [...inWindow], message };
|
|
31
|
+
}
|
|
32
|
+
return { shouldKill: false, violations: [], message: "" };
|
|
33
|
+
}
|
|
34
|
+
getViolationCount() {
|
|
35
|
+
this.prune();
|
|
36
|
+
const windowMs = this.config.windowMinutes * 60_000;
|
|
37
|
+
const cutoff = Date.now() - windowMs;
|
|
38
|
+
return this.violations.filter((v) => v.timestamp > cutoff).length;
|
|
39
|
+
}
|
|
40
|
+
getConfig() {
|
|
41
|
+
return { ...this.config };
|
|
42
|
+
}
|
|
43
|
+
reset() {
|
|
44
|
+
this.violations = [];
|
|
45
|
+
}
|
|
46
|
+
prune() {
|
|
47
|
+
// Keep only violations within 2x the window (generous buffer)
|
|
48
|
+
const maxAge = this.config.windowMinutes * 2 * 60_000;
|
|
49
|
+
const cutoff = Date.now() - maxAge;
|
|
50
|
+
this.violations = this.violations.filter((v) => v.timestamp > cutoff);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=auto-kill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-kill.js","sourceRoot":"","sources":["../src/auto-kill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/hooks/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,IACrD,OAAO,GAAG,UAenB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,IACnD,OAAO,GAAG,UAiBnB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,IACjD,OAAO,GAAG,UAgBnB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB;sBAEtC,GAAG;
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/hooks/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,IACrD,OAAO,GAAG,UAenB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,IACnD,OAAO,GAAG,UAiBnB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,IACjD,OAAO,GAAG,UAgBnB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB;sBAEtC,GAAG;mBAkBN,GAAG;EAiBrB"}
|
package/dist/hooks/lifecycle.js
CHANGED
|
@@ -51,25 +51,35 @@ export function createAgentEndHandler(ctx) {
|
|
|
51
51
|
export function createSubagentHandlers(ctx) {
|
|
52
52
|
return {
|
|
53
53
|
spawning: (event) => {
|
|
54
|
+
const subagentId = event.subagentId || event.childSessionKey || "unknown";
|
|
54
55
|
const clawnitorEvent = buildEvent({
|
|
55
56
|
agentId: ctx.agentId,
|
|
56
57
|
sessionId: ctx.sessionId,
|
|
57
58
|
eventType: "subagent",
|
|
58
59
|
action: "subagent spawning",
|
|
59
|
-
target:
|
|
60
|
-
metadata: {
|
|
60
|
+
target: subagentId,
|
|
61
|
+
metadata: {
|
|
62
|
+
subagent_id: subagentId,
|
|
63
|
+
raw_snippet: event.label || event.task
|
|
64
|
+
? `${event.label || "subagent"}: ${(event.task || "").slice(0, 450)}`
|
|
65
|
+
: undefined,
|
|
66
|
+
},
|
|
61
67
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
62
68
|
});
|
|
63
69
|
ctx.sender.enqueue(clawnitorEvent);
|
|
64
70
|
},
|
|
65
71
|
ended: (event) => {
|
|
72
|
+
const subagentId = event.subagentId || event.childSessionKey || "unknown";
|
|
66
73
|
const clawnitorEvent = buildEvent({
|
|
67
74
|
agentId: ctx.agentId,
|
|
68
75
|
sessionId: ctx.sessionId,
|
|
69
76
|
eventType: "subagent",
|
|
70
77
|
action: "subagent ended",
|
|
71
|
-
target:
|
|
72
|
-
metadata: {
|
|
78
|
+
target: subagentId,
|
|
79
|
+
metadata: {
|
|
80
|
+
subagent_id: subagentId,
|
|
81
|
+
duration_ms: event.duration || event.runtimeMs,
|
|
82
|
+
},
|
|
73
83
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
74
84
|
});
|
|
75
85
|
ctx.sender.enqueue(clawnitorEvent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/hooks/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYjD,MAAM,UAAU,yBAAyB,CAAC,GAAqB;IAC7D,OAAO,CAAC,KAAU,EAAE,EAAE;QACpB,GAAG,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvD,MAAM,cAAc,GAAG,UAAU,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;YAC3C,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,EAAE;YACZ,uBAAuB,EAAE,GAAG,CAAC,iBAAiB;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,OAAO,CAAC,KAAU,EAAE,EAAE;QACpB,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAErD,MAAM,cAAc,GAAG,UAAU,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;YAC3C,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE;gBACR,WAAW,EAAE,KAAK,CAAC,QAAQ;aAC5B;YACD,uBAAuB,EAAE,GAAG,CAAC,iBAAiB;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAqB;IACzD,OAAO,CAAC,KAAU,EAAE,EAAE;QACpB,MAAM,cAAc,GAAG,UAAU,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,aAAa;YAC9D,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE;gBACR,WAAW,EAAE,KAAK,CAAC,QAAQ;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO;aAC5B;YACD,uBAAuB,EAAE,GAAG,CAAC,iBAAiB;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAqB;IAC1D,OAAO;QACL,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE;YACvB,MAAM,cAAc,GAAG,UAAU,CAAC;gBAChC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS,EAAE,UAAU;gBACrB,MAAM,EAAE,mBAAmB;gBAC3B,MAAM,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/hooks/lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/llm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/hooks/llm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/hooks/llm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGhE,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,IAC3C,OAAO,GAAG,UAiBnB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,UAAU,IAC5C,OAAO,GAAG,UAkBnB"}
|
package/dist/hooks/llm.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { buildEvent } from "../event-builder.js";
|
|
2
|
+
import { getSubagentInfo } from "../subagent-context.js";
|
|
2
3
|
export function createLlmInputHandler(ctx) {
|
|
3
4
|
return (event) => {
|
|
5
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
4
6
|
const clawnitorEvent = buildEvent({
|
|
5
7
|
agentId: ctx.agentId,
|
|
6
|
-
sessionId:
|
|
8
|
+
sessionId: sub.sessionId,
|
|
7
9
|
eventType: "llm_call",
|
|
8
10
|
action: `llm_input: ${event.model || "unknown"}`,
|
|
9
11
|
target: event.provider || "unknown",
|
|
10
12
|
metadata: {
|
|
11
13
|
tool_name: event.model,
|
|
14
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
12
15
|
},
|
|
13
16
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
14
17
|
});
|
|
@@ -17,15 +20,17 @@ export function createLlmInputHandler(ctx) {
|
|
|
17
20
|
}
|
|
18
21
|
export function createLlmOutputHandler(ctx) {
|
|
19
22
|
return (event) => {
|
|
23
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
20
24
|
const clawnitorEvent = buildEvent({
|
|
21
25
|
agentId: ctx.agentId,
|
|
22
|
-
sessionId:
|
|
26
|
+
sessionId: sub.sessionId,
|
|
23
27
|
eventType: "llm_call",
|
|
24
28
|
action: `llm_output: ${event.model || "unknown"}`,
|
|
25
29
|
target: event.provider || "unknown",
|
|
26
30
|
metadata: {
|
|
27
31
|
tokens_used: event.usage?.totalTokens,
|
|
28
32
|
cost_usd: event.usage?.cost,
|
|
33
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
29
34
|
},
|
|
30
35
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
31
36
|
});
|
package/dist/hooks/llm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/hooks/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/hooks/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AASzD,MAAM,UAAU,qBAAqB,CAAC,GAAe;IACnD,OAAO,CAAC,KAAU,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,UAAU,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,cAAc,KAAK,CAAC,KAAK,IAAI,SAAS,EAAE;YAChD,MAAM,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;YACnC,QAAQ,EAAE;gBACR,SAAS,EAAE,KAAK,CAAC,KAAK;gBACtB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D;YACD,uBAAuB,EAAE,GAAG,CAAC,iBAAiB;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAe;IACpD,OAAO,CAAC,KAAU,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,UAAU,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,eAAe,KAAK,CAAC,KAAK,IAAI,SAAS,EAAE;YACjD,MAAM,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS;YACnC,QAAQ,EAAE;gBACR,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW;gBACrC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;gBAC3B,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D;YACD,uBAAuB,EAAE,GAAG,CAAC,iBAAiB;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,cAAc,IACrD,OAAO,GAAG;;cAuBnB;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,cAAc,IAClD,OAAO,GAAG,UAgBnB;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,cAAc,IACtD,OAAO,GAAG,UAgBnB"}
|
package/dist/hooks/message.js
CHANGED
|
@@ -1,35 +1,41 @@
|
|
|
1
1
|
import { buildEvent } from "../event-builder.js";
|
|
2
2
|
import { killState } from "../kill-switch/kill-state.js";
|
|
3
|
+
import { getSubagentInfo } from "../subagent-context.js";
|
|
3
4
|
export function createMessageSendingHandler(ctx) {
|
|
4
5
|
return (event) => {
|
|
6
|
+
// Check kill state BEFORE enqueueing — don't log blocked messages as sent
|
|
7
|
+
if (killState.isKilled()) {
|
|
8
|
+
return { cancel: true };
|
|
9
|
+
}
|
|
10
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
5
11
|
const clawnitorEvent = buildEvent({
|
|
6
12
|
agentId: ctx.agentId,
|
|
7
|
-
sessionId:
|
|
13
|
+
sessionId: sub.sessionId,
|
|
8
14
|
eventType: "message_sent",
|
|
9
15
|
action: `sending message`,
|
|
10
16
|
target: event.channel || "unknown",
|
|
11
17
|
metadata: {
|
|
12
18
|
raw_snippet: event.text ? String(event.text).slice(0, 500) : undefined,
|
|
19
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
13
20
|
},
|
|
14
21
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
15
22
|
});
|
|
16
23
|
ctx.sender.enqueue(clawnitorEvent);
|
|
17
|
-
// Block outbound messages when killed
|
|
18
|
-
if (killState.isKilled()) {
|
|
19
|
-
return { cancel: true };
|
|
20
|
-
}
|
|
21
24
|
return undefined;
|
|
22
25
|
};
|
|
23
26
|
}
|
|
24
27
|
export function createMessageSentHandler(ctx) {
|
|
25
28
|
return (event) => {
|
|
29
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
26
30
|
const clawnitorEvent = buildEvent({
|
|
27
31
|
agentId: ctx.agentId,
|
|
28
|
-
sessionId:
|
|
32
|
+
sessionId: sub.sessionId,
|
|
29
33
|
eventType: "message_sent",
|
|
30
34
|
action: `message sent`,
|
|
31
35
|
target: event.channel || "unknown",
|
|
32
|
-
metadata: {
|
|
36
|
+
metadata: {
|
|
37
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
38
|
+
},
|
|
33
39
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
34
40
|
});
|
|
35
41
|
ctx.sender.enqueue(clawnitorEvent);
|
|
@@ -37,13 +43,16 @@ export function createMessageSentHandler(ctx) {
|
|
|
37
43
|
}
|
|
38
44
|
export function createMessageReceivedHandler(ctx) {
|
|
39
45
|
return (event) => {
|
|
46
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
40
47
|
const clawnitorEvent = buildEvent({
|
|
41
48
|
agentId: ctx.agentId,
|
|
42
|
-
sessionId:
|
|
49
|
+
sessionId: sub.sessionId,
|
|
43
50
|
eventType: "message_received",
|
|
44
51
|
action: `message received`,
|
|
45
52
|
target: event.channel || "unknown",
|
|
46
|
-
metadata: {
|
|
53
|
+
metadata: {
|
|
54
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
55
|
+
},
|
|
47
56
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
48
57
|
});
|
|
49
58
|
ctx.sender.enqueue(clawnitorEvent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AASzD,MAAM,UAAU,2BAA2B,CAAC,GAAmB;IAC7D,OAAO,CAAC,KAAU,EAAE,EAAE;QACpB,MAAM,cAAc,GAAG,UAAU,CAAC;YAChC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,cAAc;YACzB,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS;YAClC,QAAQ,EAAE;gBACR,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/hooks/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { HttpsSender } from "../transport/https-sender.js";
|
|
|
2
2
|
import type { RateTracker } from "../severity.js";
|
|
3
3
|
import type { LocalFailsafe } from "../kill-switch/local-failsafe.js";
|
|
4
4
|
import type { RuleCache } from "../rule-cache.js";
|
|
5
|
+
import type { ViolationTracker } from "../auto-kill.js";
|
|
5
6
|
interface ToolCallContext {
|
|
6
7
|
agentId: string;
|
|
7
8
|
sessionId: string;
|
|
@@ -10,6 +11,7 @@ interface ToolCallContext {
|
|
|
10
11
|
redactionPatterns: string[];
|
|
11
12
|
failsafe: LocalFailsafe;
|
|
12
13
|
ruleCache: RuleCache;
|
|
14
|
+
violationTracker: ViolationTracker;
|
|
13
15
|
}
|
|
14
16
|
export declare function createBeforeToolCallHandler(ctx: ToolCallContext): (event: any) => {
|
|
15
17
|
block: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-call.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-call.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,eAAe,IACtD,OAAO,GAAG;;;cA6GnB;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,eAAe,IACrD,OAAO,GAAG,UAoCnB"}
|
package/dist/hooks/tool-call.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { buildEvent } from "../event-builder.js";
|
|
2
2
|
import { killState } from "../kill-switch/kill-state.js";
|
|
3
|
+
import { getSubagentInfo } from "../subagent-context.js";
|
|
3
4
|
export function createBeforeToolCallHandler(ctx) {
|
|
4
5
|
return (event) => {
|
|
6
|
+
// Resolve agent ID from session key on first event
|
|
7
|
+
ctx.resolveAgentFromEvent?.(event);
|
|
8
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
5
9
|
ctx.rateTracker.record();
|
|
6
10
|
ctx.failsafe.recordToolCall();
|
|
7
11
|
// Record event in rule cache for time-window based rules
|
|
@@ -13,50 +17,89 @@ export function createBeforeToolCallHandler(ctx) {
|
|
|
13
17
|
action: event.toolName,
|
|
14
18
|
target: event.toolName,
|
|
15
19
|
});
|
|
20
|
+
// Build a descriptive action label from tool name + params
|
|
21
|
+
const toolName = event.toolName || "unknown";
|
|
22
|
+
const paramHint = event.params?.command
|
|
23
|
+
? `: ${String(event.params.command).slice(0, 80)}`
|
|
24
|
+
: event.params?.url
|
|
25
|
+
? `: ${String(event.params.url).slice(0, 80)}`
|
|
26
|
+
: event.params?.file_path
|
|
27
|
+
? `: ${String(event.params.file_path).slice(0, 80)}`
|
|
28
|
+
: event.params?.action
|
|
29
|
+
? `: ${String(event.params.action).slice(0, 80)}`
|
|
30
|
+
: "";
|
|
16
31
|
const clawnitorEvent = buildEvent({
|
|
17
32
|
agentId: ctx.agentId,
|
|
18
|
-
sessionId:
|
|
33
|
+
sessionId: sub.sessionId,
|
|
19
34
|
eventType: "tool_use",
|
|
20
|
-
action:
|
|
21
|
-
target:
|
|
35
|
+
action: `${toolName}${paramHint}`,
|
|
36
|
+
target: toolName,
|
|
22
37
|
metadata: {
|
|
23
|
-
tool_name:
|
|
38
|
+
tool_name: toolName,
|
|
39
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
24
40
|
...(event.params ? { raw_snippet: JSON.stringify(event.params).slice(0, 500) } : {}),
|
|
25
41
|
},
|
|
26
42
|
rateTracker: ctx.rateTracker,
|
|
27
43
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
28
44
|
});
|
|
29
45
|
ctx.sender.enqueue(clawnitorEvent);
|
|
46
|
+
// Helper: capture a blocked event
|
|
47
|
+
const captureBlocked = (reason, source) => {
|
|
48
|
+
const blockedEvent = buildEvent({
|
|
49
|
+
agentId: ctx.agentId,
|
|
50
|
+
sessionId: sub.sessionId,
|
|
51
|
+
eventType: "tool_use",
|
|
52
|
+
action: `BLOCKED: ${toolName}${paramHint}`,
|
|
53
|
+
target: toolName,
|
|
54
|
+
metadata: {
|
|
55
|
+
tool_name: toolName,
|
|
56
|
+
blocked: true,
|
|
57
|
+
block_reason: reason,
|
|
58
|
+
block_source: source,
|
|
59
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
60
|
+
},
|
|
61
|
+
rateTracker: ctx.rateTracker,
|
|
62
|
+
customRedactionPatterns: ctx.redactionPatterns,
|
|
63
|
+
});
|
|
64
|
+
ctx.sender.enqueue(blockedEvent);
|
|
65
|
+
};
|
|
30
66
|
// 1. Check kill state (server-triggered)
|
|
31
67
|
if (killState.isKilled()) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
68
|
+
const reason = `Clawnitor: agent paused — ${killState.getReason() || "unknown reason"}`;
|
|
69
|
+
captureBlocked(reason, "kill-state");
|
|
70
|
+
return { block: true, blockReason: reason };
|
|
36
71
|
}
|
|
37
72
|
// 2. Check local failsafe (spend/rate/blocklist)
|
|
38
73
|
const failsafeResult = ctx.failsafe.check(event.toolName || "");
|
|
39
74
|
if (failsafeResult.block) {
|
|
75
|
+
captureBlocked(failsafeResult.reason, "failsafe");
|
|
40
76
|
killState.setKilled(failsafeResult.reason);
|
|
41
|
-
return {
|
|
42
|
-
block: true,
|
|
43
|
-
blockReason: failsafeResult.reason,
|
|
44
|
-
};
|
|
77
|
+
return { block: true, blockReason: failsafeResult.reason };
|
|
45
78
|
}
|
|
46
79
|
// 3. Check cached server rules locally (PRE-ACTION for pattern rules)
|
|
47
80
|
const ruleResult = ctx.ruleCache.checkBeforeToolCall(event.toolName || "", event.params);
|
|
48
81
|
if (ruleResult.blocked) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
82
|
+
captureBlocked(ruleResult.reason || "Rule matched", `rule:${ruleResult.ruleName}`);
|
|
83
|
+
// Record violation for auto-kill tracking
|
|
84
|
+
const autoKillResult = ctx.violationTracker.recordViolation({
|
|
85
|
+
ruleId: ruleResult.ruleName || "unknown",
|
|
86
|
+
ruleName: ruleResult.ruleName || "unknown",
|
|
87
|
+
timestamp: Date.now(),
|
|
88
|
+
action: event.toolName || "unknown",
|
|
89
|
+
target: event.toolName || "unknown",
|
|
90
|
+
});
|
|
91
|
+
if (autoKillResult.shouldKill) {
|
|
92
|
+
killState.setKilled(autoKillResult.message);
|
|
93
|
+
return { block: true, blockReason: autoKillResult.message };
|
|
94
|
+
}
|
|
95
|
+
return { block: true, blockReason: ruleResult.reason };
|
|
54
96
|
}
|
|
55
97
|
return undefined;
|
|
56
98
|
};
|
|
57
99
|
}
|
|
58
100
|
export function createAfterToolCallHandler(ctx) {
|
|
59
101
|
return (event) => {
|
|
102
|
+
const sub = getSubagentInfo(event, ctx.sessionId);
|
|
60
103
|
// Track spend for failsafe and rule cache
|
|
61
104
|
if (typeof event.cost === "number") {
|
|
62
105
|
ctx.failsafe.addSpend(event.cost);
|
|
@@ -67,18 +110,20 @@ export function createAfterToolCallHandler(ctx) {
|
|
|
67
110
|
costUsd: event.cost,
|
|
68
111
|
});
|
|
69
112
|
}
|
|
113
|
+
const afterToolName = event.toolName || "unknown";
|
|
70
114
|
const clawnitorEvent = buildEvent({
|
|
71
115
|
agentId: ctx.agentId,
|
|
72
|
-
sessionId:
|
|
116
|
+
sessionId: sub.sessionId,
|
|
73
117
|
eventType: "tool_use",
|
|
74
|
-
action:
|
|
75
|
-
target:
|
|
118
|
+
action: `${afterToolName} completed${event.error ? " (error)" : ""}`,
|
|
119
|
+
target: afterToolName,
|
|
76
120
|
metadata: {
|
|
77
|
-
tool_name:
|
|
121
|
+
tool_name: afterToolName,
|
|
78
122
|
duration_ms: event.duration,
|
|
79
123
|
error: event.error?.message,
|
|
80
124
|
cost_usd: event.cost,
|
|
81
125
|
raw_snippet: event.result ? String(event.result).slice(0, 500) : undefined,
|
|
126
|
+
...(sub.subagentId ? { subagent_id: sub.subagentId } : {}),
|
|
82
127
|
},
|
|
83
128
|
rateTracker: ctx.rateTracker,
|
|
84
129
|
customRedactionPatterns: ctx.redactionPatterns,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../src/hooks/tool-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../src/hooks/tool-call.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QAqIxC"}
|
package/dist/index.js
CHANGED
|
@@ -6,16 +6,22 @@ import { createRateTracker } from "./severity.js";
|
|
|
6
6
|
import { killState } from "./kill-switch/kill-state.js";
|
|
7
7
|
import { LocalFailsafe } from "./kill-switch/local-failsafe.js";
|
|
8
8
|
import { RuleCache } from "./rule-cache.js";
|
|
9
|
+
import { ViolationTracker } from "./auto-kill.js";
|
|
9
10
|
import { createBeforeToolCallHandler, createAfterToolCallHandler, } from "./hooks/tool-call.js";
|
|
10
11
|
import { createLlmInputHandler, createLlmOutputHandler } from "./hooks/llm.js";
|
|
11
12
|
import { createMessageSendingHandler, createMessageSentHandler, createMessageReceivedHandler, } from "./hooks/message.js";
|
|
12
13
|
import { createSessionStartHandler, createSessionEndHandler, createAgentEndHandler, createSubagentHandlers, } from "./hooks/lifecycle.js";
|
|
13
14
|
export default function register(api) {
|
|
14
|
-
const rawConfig = api.config || {};
|
|
15
|
+
const rawConfig = api.pluginConfig || api.config || {};
|
|
15
16
|
const config = parseConfig(rawConfig);
|
|
16
17
|
const rateTracker = createRateTracker();
|
|
17
18
|
const failsafe = new LocalFailsafe(config);
|
|
18
19
|
const ruleCache = new RuleCache(config);
|
|
20
|
+
const violationTracker = new ViolationTracker({
|
|
21
|
+
enabled: true,
|
|
22
|
+
threshold: 3,
|
|
23
|
+
windowMinutes: 10,
|
|
24
|
+
});
|
|
19
25
|
// Initialize SQLite cache for offline resilience
|
|
20
26
|
const cache = new SqliteCache();
|
|
21
27
|
// Initialize HTTPS sender
|
|
@@ -56,19 +62,42 @@ export default function register(api) {
|
|
|
56
62
|
}, 30_000);
|
|
57
63
|
// Shared context for all hooks
|
|
58
64
|
let currentSessionId = "default";
|
|
59
|
-
|
|
65
|
+
// Resolve agent ID: config > workspace path > sessionKey > "unknown"
|
|
66
|
+
let resolvedAgentId = rawConfig.agentId || "unknown";
|
|
67
|
+
if (resolvedAgentId === "unknown") {
|
|
68
|
+
// Extract from workspace path: /.../.openclaw/workspace-<agentId>
|
|
69
|
+
const cwd = process.cwd();
|
|
70
|
+
const wsMatch = cwd.match(/workspace-([^/]+)$/);
|
|
71
|
+
if (wsMatch)
|
|
72
|
+
resolvedAgentId = wsMatch[1];
|
|
73
|
+
}
|
|
74
|
+
let agentIdResolved = resolvedAgentId !== "unknown";
|
|
60
75
|
const ctx = {
|
|
61
76
|
get agentId() {
|
|
62
|
-
return
|
|
77
|
+
return resolvedAgentId;
|
|
63
78
|
},
|
|
64
79
|
get sessionId() {
|
|
65
80
|
return currentSessionId;
|
|
66
81
|
},
|
|
82
|
+
resolveAgentFromEvent(event) {
|
|
83
|
+
if (agentIdResolved)
|
|
84
|
+
return;
|
|
85
|
+
const sk = event?.sessionKey;
|
|
86
|
+
if (sk && sk.startsWith("agent:")) {
|
|
87
|
+
// Format: agent:<agentId>:main or agent:<agentId>:subagent:<uuid>
|
|
88
|
+
const parts = sk.split(":");
|
|
89
|
+
if (parts.length >= 2 && parts[1]) {
|
|
90
|
+
resolvedAgentId = parts[1];
|
|
91
|
+
agentIdResolved = true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
67
95
|
sender,
|
|
68
96
|
rateTracker,
|
|
69
97
|
redactionPatterns: config.redactionPatterns,
|
|
70
98
|
failsafe,
|
|
71
99
|
ruleCache,
|
|
100
|
+
violationTracker,
|
|
72
101
|
};
|
|
73
102
|
// Register hooks
|
|
74
103
|
api.on("before_tool_call", createBeforeToolCallHandler(ctx), {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAQ;IACvC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/rule-cache.d.ts
CHANGED
package/dist/rule-cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-cache.d.ts","sourceRoot":"","sources":["../src/rule-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-cache.d.ts","sourceRoot":"","sources":["../src/rule-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAO;gBAE7B,MAAM,EAAE,YAAY;IAIhC,KAAK;IAML,IAAI;YAOU,UAAU;IAiBxB,WAAW,CAAC,KAAK,EAAE,WAAW;IAS9B,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,eAAe;IAsBlB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,eAAe;IAgCvB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,iBAAiB;IA8BzB,YAAY,IAAI,MAAM;CAGvB"}
|
package/dist/rule-cache.js
CHANGED
|
@@ -45,9 +45,16 @@ export class RuleCache {
|
|
|
45
45
|
// Evaluate all cached pattern rules against the current tool call + recent history
|
|
46
46
|
checkBeforeToolCall(toolName, params) {
|
|
47
47
|
const paramsStr = params ? JSON.stringify(params).slice(0, 500) : "";
|
|
48
|
+
// Skip rule evaluation for tool calls that target the Clawnitor backend itself
|
|
49
|
+
// (e.g., curl commands creating rules with keywords in the config)
|
|
50
|
+
if (paramsStr.includes("api.clawnitor.io") || paramsStr.includes("/api/rules")) {
|
|
51
|
+
return { blocked: false };
|
|
52
|
+
}
|
|
48
53
|
for (const rule of this.rules) {
|
|
49
54
|
if (rule.rule_type === "nl")
|
|
50
55
|
continue; // Can't evaluate locally
|
|
56
|
+
if (rule.action_mode === "alert")
|
|
57
|
+
continue; // Alert-only rules don't block
|
|
51
58
|
const result = this.evaluateRule(rule, toolName, paramsStr);
|
|
52
59
|
if (result.blocked) {
|
|
53
60
|
return result;
|
package/dist/rule-cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-cache.js","sourceRoot":"","sources":["../src/rule-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rule-cache.js","sourceRoot":"","sources":["../src/rule-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect subagent context from OpenClaw hook events.
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw hooks fire globally (main + subagents). When running in a subagent
|
|
5
|
+
* context, the event's sessionKey contains "subagent:" — e.g.
|
|
6
|
+
* "agent:my-agent:subagent:abc-123".
|
|
7
|
+
*
|
|
8
|
+
* This module extracts subagent identity so all events carry attribution.
|
|
9
|
+
*/
|
|
10
|
+
export interface SubagentInfo {
|
|
11
|
+
/** The session ID to use (event's sessionKey if available, fallback to parent) */
|
|
12
|
+
sessionId: string;
|
|
13
|
+
/** The subagent ID if running in subagent context, undefined otherwise */
|
|
14
|
+
subagentId: string | undefined;
|
|
15
|
+
/** Whether this event is from a subagent */
|
|
16
|
+
isSubagent: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extract subagent context from an OpenClaw hook event.
|
|
20
|
+
* @param event The raw hook event from OpenClaw
|
|
21
|
+
* @param fallbackSessionId The parent session ID to use if event has no sessionKey
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSubagentInfo(event: any, fallbackSessionId: string): SubagentInfo;
|
|
24
|
+
//# sourceMappingURL=subagent-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-context.d.ts","sourceRoot":"","sources":["../src/subagent-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,YAAY;IAC3B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,GAAG,YAAY,CAiBnF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect subagent context from OpenClaw hook events.
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw hooks fire globally (main + subagents). When running in a subagent
|
|
5
|
+
* context, the event's sessionKey contains "subagent:" — e.g.
|
|
6
|
+
* "agent:my-agent:subagent:abc-123".
|
|
7
|
+
*
|
|
8
|
+
* This module extracts subagent identity so all events carry attribution.
|
|
9
|
+
*/
|
|
10
|
+
const SUBAGENT_PATTERN = /subagent:([^:]+)$/;
|
|
11
|
+
/**
|
|
12
|
+
* Extract subagent context from an OpenClaw hook event.
|
|
13
|
+
* @param event The raw hook event from OpenClaw
|
|
14
|
+
* @param fallbackSessionId The parent session ID to use if event has no sessionKey
|
|
15
|
+
*/
|
|
16
|
+
export function getSubagentInfo(event, fallbackSessionId) {
|
|
17
|
+
const sessionKey = event?.sessionKey;
|
|
18
|
+
if (!sessionKey) {
|
|
19
|
+
return { sessionId: fallbackSessionId, subagentId: undefined, isSubagent: false };
|
|
20
|
+
}
|
|
21
|
+
const match = sessionKey.match(SUBAGENT_PATTERN);
|
|
22
|
+
if (match) {
|
|
23
|
+
return {
|
|
24
|
+
sessionId: sessionKey,
|
|
25
|
+
subagentId: match[1],
|
|
26
|
+
isSubagent: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return { sessionId: sessionKey, subagentId: undefined, isSubagent: false };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=subagent-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-context.js","sourceRoot":"","sources":["../src/subagent-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAW7C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAU,EAAE,iBAAyB;IACnE,MAAM,UAAU,GAAuB,KAAK,EAAE,UAAU,CAAC;IAEzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YACpB,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-cache.d.ts","sourceRoot":"","sources":["../../src/transport/sqlite-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,CAAC,EAAE,MAAM;IAa3B,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"sqlite-cache.d.ts","sourceRoot":"","sources":["../../src/transport/sqlite-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,CAAC,EAAE,MAAM;IAa3B,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAiBrC,KAAK,CAAC,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE;IAkC3C,KAAK,IAAI,MAAM;IAWf,SAAS,IAAI,MAAM;IAanB,KAAK,IAAI,IAAI;IAsBb,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -17,58 +17,99 @@ export class SqliteCache {
|
|
|
17
17
|
`);
|
|
18
18
|
}
|
|
19
19
|
cache(events) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
try {
|
|
21
|
+
const insert = this.db.prepare("INSERT INTO cached_events (payload) VALUES (?)");
|
|
22
|
+
const tx = this.db.transaction((evts) => {
|
|
23
|
+
for (const event of evts) {
|
|
24
|
+
insert.run(JSON.stringify(event));
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
tx(events);
|
|
28
|
+
this.prune();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error("Clawnitor: SQLite cache write failed:", err.message);
|
|
32
|
+
}
|
|
28
33
|
}
|
|
29
34
|
flush(limit = 50) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
try {
|
|
36
|
+
const rows = this.db
|
|
37
|
+
.prepare("SELECT id, payload FROM cached_events ORDER BY id ASC LIMIT ?")
|
|
38
|
+
.all(limit);
|
|
39
|
+
if (rows.length === 0)
|
|
40
|
+
return [];
|
|
41
|
+
const events = [];
|
|
42
|
+
const ids = [];
|
|
43
|
+
for (const r of rows) {
|
|
44
|
+
try {
|
|
45
|
+
events.push(JSON.parse(r.payload));
|
|
46
|
+
ids.push(r.id);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Skip corrupted entries, still delete them
|
|
50
|
+
ids.push(r.id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (ids.length > 0) {
|
|
54
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
55
|
+
this.db
|
|
56
|
+
.prepare(`DELETE FROM cached_events WHERE id IN (${placeholders})`)
|
|
57
|
+
.run(...ids);
|
|
58
|
+
}
|
|
59
|
+
return events;
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
console.error("Clawnitor: SQLite cache flush failed:", err.message);
|
|
34
63
|
return [];
|
|
35
|
-
|
|
36
|
-
const ids = rows.map((r) => r.id);
|
|
37
|
-
const placeholders = ids.map(() => "?").join(",");
|
|
38
|
-
this.db
|
|
39
|
-
.prepare(`DELETE FROM cached_events WHERE id IN (${placeholders})`)
|
|
40
|
-
.run(...ids);
|
|
41
|
-
return events;
|
|
64
|
+
}
|
|
42
65
|
}
|
|
43
66
|
count() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
67
|
+
try {
|
|
68
|
+
const row = this.db
|
|
69
|
+
.prepare("SELECT COUNT(*) as count FROM cached_events")
|
|
70
|
+
.get();
|
|
71
|
+
return row.count;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
48
76
|
}
|
|
49
77
|
sizeBytes() {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
78
|
+
try {
|
|
79
|
+
const row = this.db
|
|
80
|
+
.prepare("SELECT COALESCE(SUM(LENGTH(payload)), 0) as size FROM cached_events")
|
|
81
|
+
.get();
|
|
82
|
+
return row.size;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
54
87
|
}
|
|
55
88
|
prune() {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
89
|
+
try {
|
|
90
|
+
// Age-based eviction
|
|
91
|
+
const maxAge = Math.floor((Date.now() - CACHE_AGE_LIMIT) / 1000);
|
|
92
|
+
this.db
|
|
93
|
+
.prepare("DELETE FROM cached_events WHERE created_at < ?")
|
|
94
|
+
.run(maxAge);
|
|
95
|
+
// Size-based eviction
|
|
96
|
+
while (this.sizeBytes() > CACHE_SIZE_LIMIT) {
|
|
97
|
+
const deleted = this.db
|
|
98
|
+
.prepare("DELETE FROM cached_events WHERE id IN (SELECT id FROM cached_events ORDER BY id ASC LIMIT 100)")
|
|
99
|
+
.run();
|
|
100
|
+
if (deleted.changes === 0)
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.error("Clawnitor: SQLite prune failed:", err.message);
|
|
68
106
|
}
|
|
69
107
|
}
|
|
70
108
|
close() {
|
|
71
|
-
|
|
109
|
+
try {
|
|
110
|
+
this.db.close();
|
|
111
|
+
}
|
|
112
|
+
catch { }
|
|
72
113
|
}
|
|
73
114
|
}
|
|
74
115
|
//# sourceMappingURL=sqlite-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-cache.js","sourceRoot":"","sources":["../../src/transport/sqlite-cache.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,OAAO,WAAW;IACd,EAAE,CAAoB;IAE9B,YAAY,MAAe;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;KAMZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAwB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC5B,gDAAgD,CACjD,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-cache.js","sourceRoot":"","sources":["../../src/transport/sqlite-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/transport/websocket-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,CAAa;gBAG5B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;KACvB;IAOH,KAAK;IAKL,IAAI;IAYJ,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/transport/websocket-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,CAAa;gBAG5B,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;KACvB;IAOH,KAAK;IAKL,IAAI;IAYJ,OAAO,CAAC,OAAO;IA2Cf,OAAO,CAAC,iBAAiB;CAe1B"}
|
|
@@ -30,9 +30,10 @@ export class WebSocketClient {
|
|
|
30
30
|
connect() {
|
|
31
31
|
if (this.stopped)
|
|
32
32
|
return;
|
|
33
|
+
// wss:// for production (https), ws:// only for localhost development
|
|
33
34
|
const wsUrl = this.config.backendUrl
|
|
34
35
|
.replace("https://", "wss://")
|
|
35
|
-
.replace("http://", "ws://");
|
|
36
|
+
.replace("http://", "ws://"); // nosemgrep: insecure-websocket — ws:// only used for localhost dev
|
|
36
37
|
try {
|
|
37
38
|
this.ws = new WebSocket(`${wsUrl}/ws`);
|
|
38
39
|
this.ws.onopen = () => {
|
|
@@ -73,7 +74,10 @@ export class WebSocketClient {
|
|
|
73
74
|
// Add jitter (±25%)
|
|
74
75
|
const jitter = delay * (0.75 + Math.random() * 0.5);
|
|
75
76
|
this.reconnectAttempt++;
|
|
76
|
-
this.reconnectTimer = setTimeout(() =>
|
|
77
|
+
this.reconnectTimer = setTimeout(() => {
|
|
78
|
+
if (!this.stopped)
|
|
79
|
+
this.connect();
|
|
80
|
+
}, jitter);
|
|
77
81
|
}
|
|
78
82
|
}
|
|
79
83
|
//# sourceMappingURL=websocket-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../src/transport/websocket-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,OAAO,eAAe;IAClB,EAAE,GAAqB,IAAI,CAAC;IAC5B,MAAM,CAAe;IACrB,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAAyC,IAAI,CAAC;IAC5D,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,CAA6C;IACnD,QAAQ,CAAc;IAE9B,YACE,MAAoB,EACpB,IAGC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;aACjC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;aAC7B,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../src/transport/websocket-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawnitor/plugin",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "OpenClaw plugin for Clawnitor — agent monitoring, alerting, and kill switch",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@clawnitor/shared": "workspace:^",
|
|
46
|
+
"@clawnitor/cli": "workspace:^",
|
|
46
47
|
"better-sqlite3": "^11"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|