@poolzin/pool-bot 2026.3.22 → 2026.3.24
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/CHANGELOG.md +111 -0
- package/dist/.buildstamp +1 -1
- package/dist/acp/bindings-store.js +209 -0
- package/dist/acp/control-plane/runtime-cache.js +54 -0
- package/dist/acp/control-plane/runtime-options.js +215 -0
- package/dist/acp/control-plane/session-actor-queue.js +36 -0
- package/dist/acp/policy.js +52 -0
- package/dist/acp/runtime/errors.js +47 -0
- package/dist/acp/runtime/registry.js +86 -0
- package/dist/acp/runtime/types.js +1 -0
- package/dist/acp/translator.js +97 -0
- package/dist/agents/btw.js +280 -0
- package/dist/agents/failover-error.js +145 -47
- package/dist/agents/fast-mode.js +24 -0
- package/dist/agents/live-model-errors.js +23 -0
- package/dist/agents/model-auth-env-vars.js +44 -0
- package/dist/agents/model-auth-markers.js +69 -0
- package/dist/agents/models-config.providers.discovery.js +180 -0
- package/dist/agents/models-config.providers.static.js +480 -0
- package/dist/auto-reply/reply/typing-policy.js +15 -0
- package/dist/browser/browser-profile-manager.js +319 -0
- package/dist/browser/cdp-proxy-bypass.js +129 -0
- package/dist/browser/cdp-timeouts.js +41 -0
- package/dist/browser/chrome-extension-validator.js +406 -0
- package/dist/browser/chrome-mcp-snapshot.js +222 -0
- package/dist/browser/chrome-mcp.js +421 -0
- package/dist/browser/chrome-mcp.snapshot.js +133 -0
- package/dist/browser/errors.js +67 -0
- package/dist/browser/form-fields.js +22 -0
- package/dist/browser/output-atomic.js +44 -0
- package/dist/browser/profile-capabilities.js +47 -0
- package/dist/browser/safe-filename.js +25 -0
- package/dist/browser/snapshot-roles.js +60 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/account-snapshot-fields.js +176 -0
- package/dist/channels/draft-stream-controls.js +89 -0
- package/dist/channels/inbound-debounce-policy.js +28 -0
- package/dist/channels/typing-lifecycle.js +39 -0
- package/dist/cli/program/command-registry.js +52 -0
- package/dist/commands/agent-binding.js +123 -0
- package/dist/commands/agents.commands.bind.js +280 -0
- package/dist/commands/backup-shared.js +186 -0
- package/dist/commands/backup-verify.js +236 -0
- package/dist/commands/backup.js +166 -0
- package/dist/commands/channel-account-context.js +15 -0
- package/dist/commands/channel-account.js +190 -0
- package/dist/commands/gateway-install-token.js +117 -0
- package/dist/commands/oauth-tls-preflight.js +121 -0
- package/dist/commands/ollama-setup.js +402 -0
- package/dist/commands/security-owner-only.js +86 -0
- package/dist/commands/self-hosted-provider-setup.js +207 -0
- package/dist/commands/session-store-targets.js +12 -0
- package/dist/commands/sessions-cleanup.js +97 -0
- package/dist/control-ui/assets/{index-Dvkl4Xlx.js → index-D7shnQwQ.js} +404 -388
- package/dist/control-ui/assets/index-D7shnQwQ.js.map +1 -0
- package/dist/control-ui/index.html +1 -1
- package/dist/cron/cron-filters.js +150 -0
- package/dist/cron/heartbeat-policy.js +26 -0
- package/dist/gateway/device-pairing-security.js +197 -0
- package/dist/gateway/event-deduplication.js +167 -0
- package/dist/gateway/hooks-mapping.js +46 -7
- package/dist/gateway/run-tracker.js +253 -0
- package/dist/gateway/server-methods/nodes.js +14 -0
- package/dist/gateway/websocket-preauth-security.js +188 -0
- package/dist/hooks/module-loader.js +28 -0
- package/dist/infra/agent-command-binding.js +144 -0
- package/dist/infra/backup.js +328 -0
- package/dist/infra/channel-account-context.js +173 -0
- package/dist/infra/errors.js +53 -13
- package/dist/infra/exec-approvals-security.js +217 -0
- package/dist/infra/security/command-analyzer.js +257 -0
- package/dist/infra/session-cleanup.js +143 -0
- package/dist/plugins/loader.js +16 -8
- package/dist/security/external-content.js +51 -1
- package/dist/sessions/session-costs.js +228 -0
- package/dist/shared/param-key.js +16 -0
- package/dist/shared/poll-params.js +58 -0
- package/dist/shared/polls.js +55 -0
- package/docs/DASHBOARD-GAP-ANALYSIS-AND-PLAN.md +430 -0
- package/docs/FEATURES.md +523 -0
- package/docs/FINAL-IMPLEMENTATION-REVIEW.md +274 -0
- package/docs/FINAL-IMPLEMENTATION-SUMMARY.md +356 -0
- package/docs/FINAL-PROFESSIONAL-EVALUATION.md +312 -0
- package/docs/IMPLEMENTATION-PRIORITY-EVALUATION.md +298 -0
- package/docs/IMPLEMENTATION-PROGRESS.md +237 -0
- package/docs/IMPLEMENTATION-REVIEW-PHASE1-2.md +381 -0
- package/docs/IMPLEMENTATION-REVIEW-PHASE4.md +389 -0
- package/docs/IMPLEMENTATION-REVIEW-PHASE5.md +420 -0
- package/docs/IMPLEMENTATION-REVIEW-PHASE6.md +422 -0
- package/docs/IMPLEMENTATION-REVIEW-PHASE7-FINAL.md +184 -0
- package/docs/MIKRODASH-ANALYSIS.md +412 -0
- package/docs/OPENCLAW-GAP-ANALYSIS-FINAL.md +431 -0
- package/docs/OPENCLAW-VS-POOLBOT-ANALYSIS.md +351 -0
- package/docs/PHASE-7-SUMMARY.md +144 -0
- package/docs/POOLBOT-OFFICE-PLAN.md +697 -0
- package/docs/PROJECT-FINAL-STATUS.md +237 -0
- package/docs/README.md +116 -0
- package/docs/REAL-IMPROVEMENTS-EVALUATION.md +477 -0
- package/docs/SECURITY-HARDENING-IMPLEMENTATION.md +161 -0
- package/docs/channels/googlechat.md +235 -206
- package/docs/channels/irc.md +332 -0
- package/docs/channels/nostr.md +255 -168
- package/docs/components/command-palette.md +166 -0
- package/docs/components/login-gate.md +219 -0
- package/docs/getting-started/installation.md +191 -0
- package/docs/getting-started/introduction.md +120 -0
- package/docs/improvements/USAGE-GUIDE.md +359 -0
- package/docs/plans/2026-03-15-openclaw-features-implementation.md +1632 -0
- package/docs/reference/deadcode-detection.md +72 -0
- package/extensions/acpx/node_modules/.bin/acpx +21 -0
- package/extensions/agency-agents/node_modules/.bin/vite +4 -4
- package/extensions/agency-agents/node_modules/.bin/vitest +2 -2
- package/extensions/googlechat/node_modules/.bin/tsc +21 -0
- package/extensions/googlechat/node_modules/.bin/tsserver +21 -0
- package/extensions/googlechat/node_modules/.bin/vitest +21 -0
- package/extensions/googlechat/package.json +11 -28
- package/extensions/googlechat/src/googlechat-channel.test.ts +60 -0
- package/extensions/googlechat/src/googlechat-channel.ts +120 -0
- package/extensions/googlechat/src/index.ts +14 -0
- package/extensions/irc/node_modules/.bin/tsc +21 -0
- package/extensions/irc/node_modules/.bin/tsserver +21 -0
- package/extensions/irc/node_modules/.bin/vitest +21 -0
- package/extensions/irc/package.json +16 -8
- package/extensions/irc/src/index.ts +14 -0
- package/extensions/irc/src/irc-channel.test.ts +43 -0
- package/extensions/irc/src/irc-channel.ts +191 -0
- package/extensions/keyed-async-queue/node_modules/.bin/tsc +21 -0
- package/extensions/keyed-async-queue/node_modules/.bin/tsserver +21 -0
- package/extensions/keyed-async-queue/node_modules/.bin/vitest +21 -0
- package/extensions/keyed-async-queue/package.json +20 -0
- package/extensions/keyed-async-queue/src/index.ts +14 -0
- package/extensions/keyed-async-queue/src/queue.test.ts +135 -0
- package/extensions/keyed-async-queue/src/queue.ts +200 -0
- package/extensions/memory-core/node_modules/.bin/tsc +21 -0
- package/extensions/memory-core/node_modules/.bin/tsserver +21 -0
- package/extensions/memory-core/node_modules/.bin/vitest +21 -0
- package/extensions/memory-core/package.json +11 -8
- package/extensions/memory-core/src/index.ts +14 -0
- package/extensions/memory-core/src/memory-manager.test.ts +124 -0
- package/extensions/memory-core/src/memory-manager.ts +186 -0
- package/extensions/nostr/node_modules/.bin/tsc +2 -2
- package/extensions/nostr/node_modules/.bin/tsserver +2 -2
- package/extensions/nostr/node_modules/.bin/vitest +21 -0
- package/extensions/nostr/package.json +15 -24
- package/extensions/nostr/src/index.ts +14 -0
- package/extensions/nostr/src/nostr-channel.test.ts +55 -0
- package/extensions/nostr/src/nostr-channel.ts +228 -0
- package/extensions/page-agent/node_modules/.bin/vitest +2 -2
- package/extensions/test-utils/node_modules/.bin/jiti +21 -0
- package/extensions/test-utils/node_modules/.bin/playwright +21 -0
- package/extensions/test-utils/node_modules/.bin/tsx +21 -0
- package/extensions/test-utils/node_modules/.bin/vite +21 -0
- package/extensions/test-utils/node_modules/.bin/vitest +21 -0
- package/extensions/test-utils/node_modules/.bin/yaml +21 -0
- package/extensions/xyops/node_modules/.bin/vitest +2 -2
- package/package.json +2 -1
- package/dist/control-ui/assets/index-Dvkl4Xlx.js.map +0 -1
- package/extensions/googlechat/node_modules/.bin/poolbot +0 -21
- package/extensions/memory-core/node_modules/.bin/poolbot +0 -21
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# Pool Bot Improvements - Usage Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide documents the professional improvements implemented in Pool Bot, providing usage examples and integration points.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Table of Contents
|
|
10
|
+
|
|
11
|
+
1. [Event Deduplication](#1-event-deduplication)
|
|
12
|
+
2. [Run Tracker](#2-run-tracker)
|
|
13
|
+
3. [Command Analyzer](#3-command-analyzer)
|
|
14
|
+
4. [Browser Profile Manager](#4-browser-profile-manager)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Event Deduplication
|
|
19
|
+
|
|
20
|
+
**Location:** `src/gateway/event-deduplication.ts`
|
|
21
|
+
|
|
22
|
+
**Purpose:** Prevent duplicate event processing within a configurable time window.
|
|
23
|
+
|
|
24
|
+
### Basic Usage
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { EventDeduplicator, generateEventId } from './gateway/event-deduplication';
|
|
28
|
+
|
|
29
|
+
// Create deduplicator with 5 second TTL
|
|
30
|
+
const dedup = new EventDeduplicator({ ttlMs: 5000 });
|
|
31
|
+
|
|
32
|
+
// In event handler
|
|
33
|
+
function handleEvent(event: Event) {
|
|
34
|
+
const eventId = generateEventId({
|
|
35
|
+
type: event.type,
|
|
36
|
+
sessionId: event.sessionId,
|
|
37
|
+
payload: event.payload
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (dedup.isDuplicate(eventId)) {
|
|
41
|
+
console.log(`Skipping duplicate event ${eventId}`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Process event
|
|
46
|
+
processEvent(event);
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Advanced Configuration
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
const dedup = new EventDeduplicator({
|
|
54
|
+
ttlMs: 10000, // 10 second TTL
|
|
55
|
+
maxSize: 5000, // Max 5000 events in memory
|
|
56
|
+
autoCleanup: true // Auto cleanup expired events
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Get statistics
|
|
60
|
+
const stats = dedup.getStats();
|
|
61
|
+
console.log(`Total events: ${stats.totalEvents}`);
|
|
62
|
+
console.log(`Duplicates: ${stats.duplicates}`);
|
|
63
|
+
|
|
64
|
+
// Manual cleanup
|
|
65
|
+
const removed = dedup.cleanup();
|
|
66
|
+
console.log(`Removed ${removed} expired events`);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Use Cases
|
|
70
|
+
|
|
71
|
+
- **Gateway event processing:** Prevent duplicate WebSocket events
|
|
72
|
+
- **Retry handling:** Avoid processing retried events multiple times
|
|
73
|
+
- **Race condition prevention:** Handle concurrent event submissions
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 2. Run Tracker
|
|
78
|
+
|
|
79
|
+
**Location:** `src/gateway/run-tracker.ts`
|
|
80
|
+
|
|
81
|
+
**Purpose:** Track active agent runs with AbortController support for cancellation.
|
|
82
|
+
|
|
83
|
+
### Basic Usage
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { RunTracker, generateRunId } from './gateway/run-tracker';
|
|
87
|
+
|
|
88
|
+
const tracker = new RunTracker();
|
|
89
|
+
|
|
90
|
+
// Start a new run
|
|
91
|
+
const run = tracker.startRun(generateRunId(), {
|
|
92
|
+
sessionKey: 'session-123',
|
|
93
|
+
model: 'gpt-4'
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Stream data
|
|
97
|
+
await tracker.writeToRun(run.runId, {
|
|
98
|
+
type: 'chunk',
|
|
99
|
+
data: 'response chunk'
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Complete on success
|
|
103
|
+
await tracker.completeRun(run.runId, {
|
|
104
|
+
outputTokens: 150,
|
|
105
|
+
inputTokens: 50
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Or abort on cancel
|
|
109
|
+
await tracker.abortRun(run.runId, 'User cancelled');
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Error Handling
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
try {
|
|
116
|
+
const run = tracker.startRun(runId, { sessionKey, model });
|
|
117
|
+
|
|
118
|
+
// Process...
|
|
119
|
+
await tracker.writeToRun(runId, chunk);
|
|
120
|
+
|
|
121
|
+
await tracker.completeRun(runId);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
await tracker.failRun(runId, error);
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Session Grouping
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
// Get all runs for a session
|
|
131
|
+
const sessionRuns = tracker.getRunsBySession('session-123');
|
|
132
|
+
|
|
133
|
+
// Get statistics
|
|
134
|
+
const stats = tracker.getStats();
|
|
135
|
+
console.log(`Active runs: ${stats.activeRuns}`);
|
|
136
|
+
console.log(`Completed: ${stats.completedRuns}`);
|
|
137
|
+
console.log(`Average duration: ${stats.averageDuration}ms`);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Use Cases
|
|
141
|
+
|
|
142
|
+
- **Agent loop tracking:** Monitor active LLM runs
|
|
143
|
+
- **Resource cleanup:** Prevent memory leaks from abandoned runs
|
|
144
|
+
- **User cancellation:** Support clean abort of long operations
|
|
145
|
+
- **Observability:** Track run duration and success rates
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 3. Command Analyzer
|
|
150
|
+
|
|
151
|
+
**Location:** `src/infra/security/command-analyzer.ts`
|
|
152
|
+
|
|
153
|
+
**Purpose:** Analyze commands for security risks before execution.
|
|
154
|
+
|
|
155
|
+
### Basic Usage
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { CommandAnalyzer } from './infra/security/command-analyzer';
|
|
159
|
+
|
|
160
|
+
const analyzer = new CommandAnalyzer();
|
|
161
|
+
|
|
162
|
+
// Analyze command
|
|
163
|
+
const analysis = analyzer.analyze(command, args);
|
|
164
|
+
|
|
165
|
+
if (analysis.blockedReason) {
|
|
166
|
+
throw new SecurityError(analysis.blockedReason);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (analysis.requiresApproval) {
|
|
170
|
+
const approved = await requestApproval(analysis);
|
|
171
|
+
if (!approved) {
|
|
172
|
+
throw new Error('Command not approved');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Execute command
|
|
177
|
+
await execute(command, args);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Risk Levels
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Low risk - safe to execute
|
|
184
|
+
const safe = analyzer.analyze('ls', ['-la']);
|
|
185
|
+
// riskLevel: 'low', requiresApproval: false
|
|
186
|
+
|
|
187
|
+
// Medium risk - requires approval
|
|
188
|
+
const medium = analyzer.analyze('kill', ['-9', '1234']);
|
|
189
|
+
// riskLevel: 'medium', requiresApproval: true
|
|
190
|
+
|
|
191
|
+
// High risk - shell wrapper detected
|
|
192
|
+
const high = analyzer.analyze('bash', ['-c', 'rm -rf /']);
|
|
193
|
+
// riskLevel: 'high', requiresApproval: true
|
|
194
|
+
|
|
195
|
+
// Critical - blocked
|
|
196
|
+
const critical = analyzer.analyze('rm', ['-rf', '/']);
|
|
197
|
+
// riskLevel: 'critical', blockedReason: 'Recursive/force delete'
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Path Sanitization
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
import { PathSanitizer } from './infra/security/command-analyzer';
|
|
204
|
+
|
|
205
|
+
const sanitizer = new PathSanitizer('/workspace');
|
|
206
|
+
|
|
207
|
+
// Sanitize path
|
|
208
|
+
const safePath = sanitizer.sanitize('./file.txt');
|
|
209
|
+
// Returns: '/workspace/file.txt'
|
|
210
|
+
|
|
211
|
+
// Block traversal
|
|
212
|
+
try {
|
|
213
|
+
sanitizer.sanitize('../etc/passwd');
|
|
214
|
+
} catch (error) {
|
|
215
|
+
console.error('Path traversal blocked');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Sanitize arguments
|
|
219
|
+
const safeArgs = sanitizer.sanitizeArguments(['./file.txt', 'arg2']);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Integration with Node Invoke
|
|
223
|
+
|
|
224
|
+
The Command Analyzer is already integrated in `src/gateway/server-methods/nodes.ts`:
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// In node.invoke handler
|
|
228
|
+
const analysis = commandAnalyzer.analyze(command, []);
|
|
229
|
+
|
|
230
|
+
if (analysis.blockedReason) {
|
|
231
|
+
context.logGateway.warn(
|
|
232
|
+
`node.invoke blocked command=${command} reason=${analysis.blockedReason}`
|
|
233
|
+
);
|
|
234
|
+
respond(false, undefined, errorShape(...));
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Use Cases
|
|
240
|
+
|
|
241
|
+
- **Node command execution:** Security check before running commands on devices
|
|
242
|
+
- **Shell command validation:** Prevent dangerous command execution
|
|
243
|
+
- **Injection prevention:** Detect command injection attempts
|
|
244
|
+
- **Audit logging:** Log risky command attempts
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 4. Browser Profile Manager
|
|
249
|
+
|
|
250
|
+
**Location:** `src/browser/chrome-mcp.ts` (integrated)
|
|
251
|
+
|
|
252
|
+
**Purpose:** Manage multiple Chrome profiles with isolated user data.
|
|
253
|
+
|
|
254
|
+
### Basic Usage
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
import { registerBrowserProfile, getBrowserProfile } from './browser/chrome-mcp';
|
|
258
|
+
|
|
259
|
+
// Register a profile
|
|
260
|
+
registerBrowserProfile({
|
|
261
|
+
name: 'profile-1',
|
|
262
|
+
userDataDir: '/tmp/chrome-profile-1',
|
|
263
|
+
preferences: {
|
|
264
|
+
'download.default_directory': '/tmp/downloads'
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// Get profile
|
|
269
|
+
const profile = getBrowserProfile('profile-1');
|
|
270
|
+
|
|
271
|
+
// List all profiles
|
|
272
|
+
const profiles = listBrowserProfiles();
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Multiple Profiles
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// Register multiple isolated profiles
|
|
279
|
+
registerBrowserProfile({
|
|
280
|
+
name: 'work',
|
|
281
|
+
userDataDir: '/tmp/chrome-work',
|
|
282
|
+
proxy: {
|
|
283
|
+
host: 'proxy.example.com',
|
|
284
|
+
port: 8080
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
registerBrowserProfile({
|
|
289
|
+
name: 'personal',
|
|
290
|
+
userDataDir: '/tmp/chrome-personal'
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// Each profile has isolated:
|
|
294
|
+
// - Cookies
|
|
295
|
+
// - LocalStorage
|
|
296
|
+
// - Extensions
|
|
297
|
+
// - Preferences
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Use Cases
|
|
301
|
+
|
|
302
|
+
- **Multi-account automation:** Separate browser sessions for different accounts
|
|
303
|
+
- **Testing:** Isolated browser environments for testing
|
|
304
|
+
- **Privacy:** Separate work/personal browsing contexts
|
|
305
|
+
- **Proxy per profile:** Different network contexts per profile
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Testing
|
|
310
|
+
|
|
311
|
+
All components include comprehensive test suites:
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
# Run tests
|
|
315
|
+
pnpm test src/gateway/event-deduplication.test.ts
|
|
316
|
+
pnpm test src/gateway/run-tracker.test.ts
|
|
317
|
+
pnpm test src/infra/security/command-analyzer.test.ts
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Test Coverage
|
|
321
|
+
|
|
322
|
+
- **Event Deduplication:** 15+ tests
|
|
323
|
+
- **Run Tracker:** 20+ tests
|
|
324
|
+
- **Command Analyzer:** 30+ tests
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Performance
|
|
329
|
+
|
|
330
|
+
| Component | Memory | CPU | Latency |
|
|
331
|
+
|-----------|--------|-----|---------|
|
|
332
|
+
| Event Dedup | ~100KB | <1ms | <1ms |
|
|
333
|
+
| Run Tracker | ~50KB/run | <1ms | <1ms |
|
|
334
|
+
| Command Analyzer | ~50KB | <1ms | <1ms |
|
|
335
|
+
| Browser Profiles | ~1MB/profile | <5ms | <10ms |
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Best Practices
|
|
340
|
+
|
|
341
|
+
1. **Always check OpenClaw first** - Don't duplicate existing functionality
|
|
342
|
+
2. **Integrate, don't duplicate** - New code should be used, not isolated
|
|
343
|
+
3. **Test thoroughly** - Target 70%+ coverage
|
|
344
|
+
4. **Document usage** - Provide clear examples
|
|
345
|
+
5. **Monitor performance** - Track memory and latency impact
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## Support
|
|
350
|
+
|
|
351
|
+
For issues or questions:
|
|
352
|
+
- Check existing documentation in `docs/`
|
|
353
|
+
- Review test files for usage examples
|
|
354
|
+
- Open GitHub issue with reproduction steps
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
**Last Updated:** March 2026
|
|
359
|
+
**Version:** 1.0
|