@poolzin/pool-bot 2026.3.13 → 2026.3.15
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 +87 -0
- package/dist/agents/checkpoint-manager.js +291 -0
- package/dist/agents/poolbot-tools.js +5 -0
- package/dist/agents/subagent-announce-reliability.js +160 -0
- package/dist/agents/tool-result-truncation.js +299 -0
- package/dist/agents/tools/nodes-file-tool.js +197 -0
- package/dist/build-info.json +3 -3
- package/dist/cli/config-cli.js +60 -0
- package/dist/cron/cron-improvements.js +195 -0
- package/dist/discord/discord-improvements.js +167 -0
- package/dist/gateway/auth-rate-limit.js +19 -0
- package/dist/gateway/auth.js +41 -0
- package/dist/gateway/gateway-improvements.js +294 -0
- package/dist/gateway/node-command-policy.js +7 -2
- package/dist/infra/net/ssrf.js +15 -2
- package/dist/infra/shell-security.js +201 -0
- package/dist/memory/memory-improvements.js +239 -0
- package/dist/node-host/runner.js +146 -79
- package/dist/security/prototype-pollution.js +141 -0
- package/dist/security/webhook-security.js +253 -0
- package/dist/shared/net/ip.js +52 -1
- package/dist/slack/slack-improvements.js +225 -0
- package/dist/telegram/telegram-improvements.js +220 -0
- package/dist/ui-plugins/ui-plugins-improvements.js +191 -0
- package/docs/ANALISE_OPENCLAW_PROFISSIONAL.md +520 -0
- package/docs/competitive-analysis.md +421 -0
- package/docs/implementation-analysis.md +393 -0
- package/docs/plans/2026-03-11-file-operations-security-hardening.md +307 -0
- package/docs/plans/2026-03-11-integracao-projetos-poolbot.md +666 -0
- package/extensions/agency-agents/README.md +301 -0
- package/extensions/agency-agents/agents/CONTRIBUTING.md +353 -0
- package/extensions/agency-agents/agents/README.md +602 -0
- package/extensions/agency-agents/agents/design/design-brand-guardian.md +320 -0
- package/extensions/agency-agents/agents/design/design-image-prompt-engineer.md +234 -0
- package/extensions/agency-agents/agents/design/design-ui-designer.md +381 -0
- package/extensions/agency-agents/agents/design/design-ux-architect.md +467 -0
- package/extensions/agency-agents/agents/design/design-ux-researcher.md +327 -0
- package/extensions/agency-agents/agents/design/design-visual-storyteller.md +147 -0
- package/extensions/agency-agents/agents/design/design-whimsy-injector.md +436 -0
- package/extensions/agency-agents/agents/engineering/engineering-ai-engineer.md +144 -0
- package/extensions/agency-agents/agents/engineering/engineering-backend-architect.md +233 -0
- package/extensions/agency-agents/agents/engineering/engineering-devops-automator.md +374 -0
- package/extensions/agency-agents/agents/engineering/engineering-frontend-developer.md +223 -0
- package/extensions/agency-agents/agents/engineering/engineering-mobile-app-builder.md +491 -0
- package/extensions/agency-agents/agents/engineering/engineering-rapid-prototyper.md +460 -0
- package/extensions/agency-agents/agents/engineering/engineering-security-engineer.md +275 -0
- package/extensions/agency-agents/agents/engineering/engineering-senior-developer.md +174 -0
- package/extensions/agency-agents/agents/examples/README.md +48 -0
- package/extensions/agency-agents/agents/examples/nexus-spatial-discovery.md +852 -0
- package/extensions/agency-agents/agents/examples/workflow-landing-page.md +119 -0
- package/extensions/agency-agents/agents/examples/workflow-startup-mvp.md +155 -0
- package/extensions/agency-agents/agents/integrations/README.md +117 -0
- package/extensions/agency-agents/agents/integrations/aider/README.md +38 -0
- package/extensions/agency-agents/agents/integrations/antigravity/README.md +49 -0
- package/extensions/agency-agents/agents/integrations/claude-code/README.md +31 -0
- package/extensions/agency-agents/agents/integrations/cursor/README.md +38 -0
- package/extensions/agency-agents/agents/integrations/gemini-cli/README.md +36 -0
- package/extensions/agency-agents/agents/integrations/opencode/README.md +58 -0
- package/extensions/agency-agents/agents/integrations/windsurf/README.md +26 -0
- package/extensions/agency-agents/agents/marketing/marketing-app-store-optimizer.md +319 -0
- package/extensions/agency-agents/agents/marketing/marketing-content-creator.md +52 -0
- package/extensions/agency-agents/agents/marketing/marketing-growth-hacker.md +52 -0
- package/extensions/agency-agents/agents/marketing/marketing-instagram-curator.md +111 -0
- package/extensions/agency-agents/agents/marketing/marketing-reddit-community-builder.md +121 -0
- package/extensions/agency-agents/agents/marketing/marketing-social-media-strategist.md +123 -0
- package/extensions/agency-agents/agents/marketing/marketing-tiktok-strategist.md +123 -0
- package/extensions/agency-agents/agents/marketing/marketing-twitter-engager.md +124 -0
- package/extensions/agency-agents/agents/marketing/marketing-wechat-official-account.md +143 -0
- package/extensions/agency-agents/agents/marketing/marketing-xiaohongshu-specialist.md +136 -0
- package/extensions/agency-agents/agents/marketing/marketing-zhihu-strategist.md +160 -0
- package/extensions/agency-agents/agents/product/product-feedback-synthesizer.md +117 -0
- package/extensions/agency-agents/agents/product/product-sprint-prioritizer.md +152 -0
- package/extensions/agency-agents/agents/product/product-trend-researcher.md +157 -0
- package/extensions/agency-agents/agents/project-management/project-management-experiment-tracker.md +196 -0
- package/extensions/agency-agents/agents/project-management/project-management-project-shepherd.md +192 -0
- package/extensions/agency-agents/agents/project-management/project-management-studio-operations.md +198 -0
- package/extensions/agency-agents/agents/project-management/project-management-studio-producer.md +201 -0
- package/extensions/agency-agents/agents/project-management/project-manager-senior.md +133 -0
- package/extensions/agency-agents/agents/scripts/convert.sh +362 -0
- package/extensions/agency-agents/agents/scripts/install.sh +465 -0
- package/extensions/agency-agents/agents/scripts/lint-agents.sh +115 -0
- package/extensions/agency-agents/agents/spatial-computing/macos-spatial-metal-engineer.md +335 -0
- package/extensions/agency-agents/agents/spatial-computing/terminal-integration-specialist.md +68 -0
- package/extensions/agency-agents/agents/spatial-computing/visionos-spatial-engineer.md +52 -0
- package/extensions/agency-agents/agents/spatial-computing/xr-cockpit-interaction-specialist.md +30 -0
- package/extensions/agency-agents/agents/spatial-computing/xr-immersive-developer.md +30 -0
- package/extensions/agency-agents/agents/spatial-computing/xr-interface-architect.md +30 -0
- package/extensions/agency-agents/agents/specialized/agentic-identity-trust.md +367 -0
- package/extensions/agency-agents/agents/specialized/agents-orchestrator.md +365 -0
- package/extensions/agency-agents/agents/specialized/data-analytics-reporter.md +52 -0
- package/extensions/agency-agents/agents/specialized/data-consolidation-agent.md +58 -0
- package/extensions/agency-agents/agents/specialized/lsp-index-engineer.md +312 -0
- package/extensions/agency-agents/agents/specialized/report-distribution-agent.md +63 -0
- package/extensions/agency-agents/agents/specialized/sales-data-extraction-agent.md +65 -0
- package/extensions/agency-agents/agents/strategy/EXECUTIVE-BRIEF.md +95 -0
- package/extensions/agency-agents/agents/strategy/QUICKSTART.md +194 -0
- package/extensions/agency-agents/agents/strategy/coordination/agent-activation-prompts.md +401 -0
- package/extensions/agency-agents/agents/strategy/coordination/handoff-templates.md +357 -0
- package/extensions/agency-agents/agents/strategy/nexus-strategy.md +1110 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-0-discovery.md +178 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-1-strategy.md +238 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-2-foundation.md +278 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-3-build.md +286 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-4-hardening.md +332 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-5-launch.md +277 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-6-operate.md +318 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-enterprise-feature.md +157 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-incident-response.md +217 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-marketing-campaign.md +187 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-startup-mvp.md +154 -0
- package/extensions/agency-agents/agents/support/support-analytics-reporter.md +363 -0
- package/extensions/agency-agents/agents/support/support-executive-summary-generator.md +210 -0
- package/extensions/agency-agents/agents/support/support-finance-tracker.md +440 -0
- package/extensions/agency-agents/agents/support/support-infrastructure-maintainer.md +616 -0
- package/extensions/agency-agents/agents/support/support-legal-compliance-checker.md +586 -0
- package/extensions/agency-agents/agents/support/support-support-responder.md +583 -0
- package/extensions/agency-agents/agents/testing/testing-accessibility-auditor.md +313 -0
- package/extensions/agency-agents/agents/testing/testing-api-tester.md +304 -0
- package/extensions/agency-agents/agents/testing/testing-evidence-collector.md +208 -0
- package/extensions/agency-agents/agents/testing/testing-performance-benchmarker.md +266 -0
- package/extensions/agency-agents/agents/testing/testing-reality-checker.md +236 -0
- package/extensions/agency-agents/agents/testing/testing-test-results-analyzer.md +303 -0
- package/extensions/agency-agents/agents/testing/testing-tool-evaluator.md +392 -0
- package/extensions/agency-agents/agents/testing/testing-workflow-optimizer.md +448 -0
- package/extensions/agency-agents/index.ts +733 -0
- package/extensions/agency-agents/node_modules/.bin/jiti +21 -0
- package/extensions/agency-agents/node_modules/.bin/tsc +21 -0
- package/extensions/agency-agents/node_modules/.bin/tsserver +21 -0
- package/extensions/agency-agents/node_modules/.bin/tsx +21 -0
- package/extensions/agency-agents/node_modules/.bin/vite +21 -0
- package/extensions/agency-agents/node_modules/.bin/vitest +21 -0
- package/extensions/agency-agents/node_modules/.bin/yaml +21 -0
- package/extensions/agency-agents/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/extensions/agency-agents/package.json +25 -0
- package/extensions/agency-agents/poolbot.plugin.json +11 -0
- package/extensions/agency-agents/src/AgencyAgentsService.test.ts +443 -0
- package/extensions/agency-agents/src/AgencyAgentsService.ts +288 -0
- package/extensions/agency-agents/src/types.ts +147 -0
- package/extensions/agency-agents/vitest.config.ts +8 -0
- package/extensions/hexstrike-ai/README.md +98 -0
- package/extensions/hexstrike-ai/node_modules/.bin/tsc +21 -0
- package/extensions/hexstrike-ai/node_modules/.bin/tsserver +21 -0
- package/extensions/hexstrike-ai/package.json +29 -0
- package/extensions/hexstrike-ai/poolbot.plugin.json +31 -0
- package/extensions/hexstrike-ai/src/client.ts +91 -0
- package/extensions/hexstrike-ai/src/index.ts +170 -0
- package/extensions/hexstrike-ai/src/server/hexstrike_mcp.py +5470 -0
- package/extensions/hexstrike-ai/src/server/hexstrike_server.py +17289 -0
- package/extensions/hexstrike-ai/src/server/requirements.txt +84 -0
- package/extensions/hexstrike-ai/src/server-manager.ts +83 -0
- package/extensions/hexstrike-ai/tsconfig.json +20 -0
- package/extensions/page-agent/README.md +159 -0
- package/extensions/page-agent/index.ts +595 -0
- package/extensions/page-agent/node_modules/.bin/jiti +21 -0
- package/extensions/page-agent/node_modules/.bin/playwright +21 -0
- package/extensions/page-agent/node_modules/.bin/tsc +21 -0
- package/extensions/page-agent/node_modules/.bin/tsserver +21 -0
- package/extensions/page-agent/node_modules/.bin/tsx +21 -0
- package/extensions/page-agent/node_modules/.bin/vitest +21 -0
- package/extensions/page-agent/node_modules/.bin/yaml +21 -0
- package/extensions/page-agent/package.json +43 -0
- package/extensions/page-agent/poolbot.plugin.json +24 -0
- package/extensions/page-agent/src/PageAgentService.test.ts +517 -0
- package/extensions/page-agent/src/PageAgentService.ts +636 -0
- package/extensions/page-agent/src/PoolBotPageController.test.ts +358 -0
- package/extensions/page-agent/src/PoolBotPageController.ts +245 -0
- package/extensions/page-agent/src/index.ts +20 -0
- package/extensions/page-agent/src/tools.test.ts +231 -0
- package/extensions/page-agent/src/tools.ts +167 -0
- package/extensions/page-agent/src/types.ts +198 -0
- package/extensions/xyops/README.md +227 -0
- package/extensions/xyops/index.ts +342 -0
- package/extensions/xyops/node_modules/.bin/jiti +21 -0
- package/extensions/xyops/node_modules/.bin/tsc +21 -0
- package/extensions/xyops/node_modules/.bin/tsserver +21 -0
- package/extensions/xyops/node_modules/.bin/tsx +21 -0
- package/extensions/xyops/node_modules/.bin/vitest +21 -0
- package/extensions/xyops/node_modules/.bin/yaml +21 -0
- package/extensions/xyops/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/extensions/xyops/package.json +39 -0
- package/extensions/xyops/poolbot.plugin.json +21 -0
- package/extensions/xyops/src/client.test.ts +467 -0
- package/extensions/xyops/src/client.ts +157 -0
- package/extensions/xyops/src/types.ts +147 -0
- package/extensions/xyops/vitest.config.ts +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
# Análise Profissional: PoolBot vs OpenClaw
|
|
2
|
+
|
|
3
|
+
> **Data:** 2026-03-11
|
|
4
|
+
> **Analista:** Build Agent
|
|
5
|
+
> **Objetivo:** Identificar gaps e oportunidades de melhoria no PoolBot baseado nas práticas do OpenClaw
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. RESUMO EXECUTIVO
|
|
10
|
+
|
|
11
|
+
Após análise profunda do código OpenClaw, identifiquei **7 áreas críticas** onde o PoolBot pode ser significativamente melhorado:
|
|
12
|
+
|
|
13
|
+
| Área | OpenClaw | PoolBot | Prioridade |
|
|
14
|
+
|------|----------|---------|------------|
|
|
15
|
+
| **Arquitetura de Node-Host** | Separação clara em módulos (`runner.ts`, `invoke.ts`, handlers separados) | Tudo em um arquivo monolítico (`runner.ts` 1200+ linhas) | 🔴 Alta |
|
|
16
|
+
| **Tratamento de Erros** | Códigos padronizados, helpers consistentes, `errorShape()` | Erros ad-hoc, strings hardcoded | 🔴 Alta |
|
|
17
|
+
| **Validação de Protocolo** | AJV + schemas TypeBox completos | Validação mínima/inline | 🟡 Média |
|
|
18
|
+
| **Estrutura de Comandos** | Constantes centralizadas (`node-commands.ts`) | Strings espalhadas no código | 🟡 Média |
|
|
19
|
+
| **Ferramentas de Agente** | Classes de erro especializadas, helpers de parâmetros | Validação inline repetida | 🟡 Média |
|
|
20
|
+
| **Testes** | Vitest com fixtures e harnesses abrangentes | Cobertura básica | 🟢 Baixa |
|
|
21
|
+
| **Documentação** | AGENTS.md detalhado, CLAUDE.md symlink | AGENTS.md básico | 🟢 Baixa |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 2. ANÁLISE DETALHADA
|
|
26
|
+
|
|
27
|
+
### 2.1 Arquitetura de Node-Host
|
|
28
|
+
|
|
29
|
+
#### OpenClaw (Excelente)
|
|
30
|
+
```
|
|
31
|
+
src/node-host/
|
|
32
|
+
├── runner.ts # Apenas orquestração (200 linhas)
|
|
33
|
+
├── invoke.ts # Lógica de invoke (800 linhas)
|
|
34
|
+
├── invoke-types.ts # Tipos compartilhados
|
|
35
|
+
├── invoke-system-run.ts # Handler específico
|
|
36
|
+
├── invoke-browser.ts # Handler específico
|
|
37
|
+
└── config.ts
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Princípios aplicados:**
|
|
41
|
+
- **SRP (Single Responsibility):** Cada arquivo tem uma responsabilidade única
|
|
42
|
+
- **Composição:** `runner.ts` delega para handlers específicos
|
|
43
|
+
- **Testabilidade:** Handlers podem ser testados isoladamente
|
|
44
|
+
|
|
45
|
+
#### PoolBot (Problema)
|
|
46
|
+
```
|
|
47
|
+
src/node-host/
|
|
48
|
+
└── runner.ts # Tudo em um arquivo (1200+ linhas)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Problemas identificados:**
|
|
52
|
+
1. **God Object:** `handleInvoke` faz tudo (exec approvals, browser proxy, system run, file operations)
|
|
53
|
+
2. **Código duplicado:** Padrões de erro repetidos em cada handler
|
|
54
|
+
3. **Difícil testar:** Não há separação para testes unitários
|
|
55
|
+
4. **Manutenção:** Adicionar novo comando requer editar arquivo grande
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### 2.2 Tratamento de Erros
|
|
60
|
+
|
|
61
|
+
#### OpenClaw (Excelente)
|
|
62
|
+
|
|
63
|
+
**Códigos padronizados:**
|
|
64
|
+
```typescript
|
|
65
|
+
// src/gateway/protocol/index.ts
|
|
66
|
+
export const ErrorCodes = {
|
|
67
|
+
PARSE_ERROR: -32700,
|
|
68
|
+
INVALID_REQUEST: -32600,
|
|
69
|
+
METHOD_NOT_FOUND: -32601,
|
|
70
|
+
INVALID_PARAMS: -32602,
|
|
71
|
+
INTERNAL_ERROR: -32603,
|
|
72
|
+
UNAVAILABLE: -32000,
|
|
73
|
+
TIMEOUT: -32001,
|
|
74
|
+
NOT_FOUND: -32002,
|
|
75
|
+
ALREADY_EXISTS: -32003,
|
|
76
|
+
UNAUTHORIZED: -32004,
|
|
77
|
+
} as const;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Helper consistente:**
|
|
81
|
+
```typescript
|
|
82
|
+
// src/gateway/server-methods/nodes.helpers.ts
|
|
83
|
+
export function errorShape(
|
|
84
|
+
code: number,
|
|
85
|
+
message: string,
|
|
86
|
+
meta?: { details?: unknown }
|
|
87
|
+
): ErrorShape {
|
|
88
|
+
return { code, message, ...(meta ? { details: meta.details } : {}) };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Uso em qualquer lugar:
|
|
92
|
+
respond(false, undefined, errorShape(ErrorCodes.INVALID_PARAMS, "missing path"));
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### PoolBot (Problema)
|
|
96
|
+
|
|
97
|
+
**Inconsistência:**
|
|
98
|
+
```typescript
|
|
99
|
+
// Cada handler faz seu próprio erro:
|
|
100
|
+
await sendInvokeResult(client, frame, {
|
|
101
|
+
ok: false,
|
|
102
|
+
error: { code: "INVALID_REQUEST", message: String(err) },
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Em outro lugar:
|
|
106
|
+
await sendInvokeResult(client, frame, {
|
|
107
|
+
ok: false,
|
|
108
|
+
error: { code: "UNAVAILABLE", message: "command not supported" },
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Código às vezes maiúsculo, às vezes não:
|
|
112
|
+
// "INVALID_REQUEST" vs "Not found"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Problemas:**
|
|
116
|
+
1. Códigos não padronizados (string vs number)
|
|
117
|
+
2. Mensagens hardcoded
|
|
118
|
+
3. Sem estrutura consistente
|
|
119
|
+
4. Difícil internacionalizar ou modificar
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### 2.3 Validação de Protocolo
|
|
124
|
+
|
|
125
|
+
#### OpenClaw (Excelente)
|
|
126
|
+
|
|
127
|
+
**Schemas AJV completos:**
|
|
128
|
+
```typescript
|
|
129
|
+
// src/gateway/protocol/index.ts
|
|
130
|
+
export const NodeInvokeParamsSchema = {
|
|
131
|
+
type: "object",
|
|
132
|
+
properties: {
|
|
133
|
+
nodeId: { type: "string" },
|
|
134
|
+
command: { type: "string" },
|
|
135
|
+
params: { type: "object" },
|
|
136
|
+
timeoutMs: { type: "number" },
|
|
137
|
+
},
|
|
138
|
+
required: ["nodeId", "command"],
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
export function validateNodeInvokeParams(value: unknown): value is NodeInvokeParams {
|
|
142
|
+
return validateAgainstSchema(value, NodeInvokeParamsSchema);
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### PoolBot (Problema)
|
|
147
|
+
|
|
148
|
+
**Validação inline mínima:**
|
|
149
|
+
```typescript
|
|
150
|
+
// Validação ad-hoc em cada handler:
|
|
151
|
+
const filePath = String(params.path ?? "").trim();
|
|
152
|
+
if (!filePath) {
|
|
153
|
+
throw new Error("INVALID_REQUEST: path required");
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### 2.4 Estrutura de Comandos
|
|
160
|
+
|
|
161
|
+
#### OpenClaw (Excelente)
|
|
162
|
+
|
|
163
|
+
**Constantes centralizadas:**
|
|
164
|
+
```typescript
|
|
165
|
+
// src/infra/node-commands.ts
|
|
166
|
+
export const NODE_SYSTEM_RUN_COMMANDS = [
|
|
167
|
+
"system.run.prepare",
|
|
168
|
+
"system.run",
|
|
169
|
+
"system.which",
|
|
170
|
+
] as const;
|
|
171
|
+
|
|
172
|
+
export const NODE_EXEC_APPROVALS_COMMANDS = [
|
|
173
|
+
"system.execApprovals.get",
|
|
174
|
+
"system.execApprovals.set",
|
|
175
|
+
] as const;
|
|
176
|
+
|
|
177
|
+
export const NODE_BROWSER_PROXY_COMMAND = "browser.proxy";
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Uso consistente:**
|
|
181
|
+
```typescript
|
|
182
|
+
// src/node-host/runner.ts
|
|
183
|
+
commands: [
|
|
184
|
+
...NODE_SYSTEM_RUN_COMMANDS,
|
|
185
|
+
...NODE_EXEC_APPROVALS_COMMANDS,
|
|
186
|
+
...(browserProxyEnabled ? [NODE_BROWSER_PROXY_COMMAND] : []),
|
|
187
|
+
],
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### PoolBot (Problema)
|
|
191
|
+
|
|
192
|
+
**Strings espalhadas:**
|
|
193
|
+
```typescript
|
|
194
|
+
// Hardcoded em múltiplos lugares:
|
|
195
|
+
if (command === "system.execApprovals.get") { ... }
|
|
196
|
+
if (command === "browser.proxy") { ... }
|
|
197
|
+
if (command === "file.read") { ... } // Novo código adicionado inline
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
### 2.5 Ferramentas de Agente
|
|
203
|
+
|
|
204
|
+
#### OpenClaw (Excelente)
|
|
205
|
+
|
|
206
|
+
**Classes de erro especializadas:**
|
|
207
|
+
```typescript
|
|
208
|
+
// src/agents/tools/common.ts
|
|
209
|
+
export class ToolInputError extends Error {
|
|
210
|
+
readonly status: number = 400;
|
|
211
|
+
constructor(message: string) {
|
|
212
|
+
super(message);
|
|
213
|
+
this.name = "ToolInputError";
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export class ToolAuthorizationError extends ToolInputError {
|
|
218
|
+
override readonly status = 403;
|
|
219
|
+
constructor(message: string) {
|
|
220
|
+
super(message);
|
|
221
|
+
this.name = "ToolAuthorizationError";
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Helpers de parâmetros reutilizáveis:**
|
|
227
|
+
```typescript
|
|
228
|
+
// src/agents/tools/common.ts
|
|
229
|
+
export function readStringParam(
|
|
230
|
+
params: Record<string, unknown>,
|
|
231
|
+
key: string,
|
|
232
|
+
options: StringParamOptions = {},
|
|
233
|
+
) {
|
|
234
|
+
const { required = false, trim = true, label = key, allowEmpty = false } = options;
|
|
235
|
+
const raw = readParamRaw(params, key);
|
|
236
|
+
if (typeof raw !== "string") {
|
|
237
|
+
if (required) {
|
|
238
|
+
throw new ToolInputError(`${label} required`);
|
|
239
|
+
}
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
// ...
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
#### PoolBot (Problema)
|
|
247
|
+
|
|
248
|
+
**Validação inline repetida:**
|
|
249
|
+
```typescript
|
|
250
|
+
// Cada ferramenta repete a mesma lógica:
|
|
251
|
+
const filePath = String(params.path ?? "").trim();
|
|
252
|
+
if (!filePath) {
|
|
253
|
+
throw new Error("path required");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Sem helpers reutilizáveis
|
|
257
|
+
// Sem classes de erro especializadas
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 3. RECOMENDAÇÕES DE MELHORIA
|
|
263
|
+
|
|
264
|
+
### 3.1 Refatoração de Arquitetura (Prioridade: 🔴 Alta)
|
|
265
|
+
|
|
266
|
+
**Ação:** Separar `src/node-host/runner.ts` em módulos
|
|
267
|
+
|
|
268
|
+
**Estrutura proposta:**
|
|
269
|
+
```
|
|
270
|
+
src/node-host/
|
|
271
|
+
├── runner.ts # Apenas orquestração
|
|
272
|
+
├── invoke.ts # Dispatcher de handlers
|
|
273
|
+
├── handlers/
|
|
274
|
+
│ ├── system-run.ts # system.run, system.which
|
|
275
|
+
│ ├── exec-approvals.ts # execApprovals.get/set
|
|
276
|
+
│ ├── browser-proxy.ts # browser.proxy
|
|
277
|
+
│ └── file-operations.ts # file.read/write/exists/delete/list
|
|
278
|
+
├── types.ts # Tipos compartilhados
|
|
279
|
+
└── config.ts
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Benefícios:**
|
|
283
|
+
- Testabilidade: cada handler pode ser testado isoladamente
|
|
284
|
+
- Manutenção: mudanças em um handler não afetam outros
|
|
285
|
+
- Clareza: novo desenvolvedor entende rapidamente
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
### 3.2 Padronização de Erros (Prioridade: 🔴 Alta)
|
|
290
|
+
|
|
291
|
+
**Ação:** Criar sistema de erros padronizado
|
|
292
|
+
|
|
293
|
+
**Implementação:**
|
|
294
|
+
```typescript
|
|
295
|
+
// src/gateway/protocol/errors.ts
|
|
296
|
+
export const ErrorCodes = {
|
|
297
|
+
PARSE_ERROR: -32700,
|
|
298
|
+
INVALID_REQUEST: -32600,
|
|
299
|
+
METHOD_NOT_FOUND: -32601,
|
|
300
|
+
INVALID_PARAMS: -32602,
|
|
301
|
+
INTERNAL_ERROR: -32603,
|
|
302
|
+
UNAVAILABLE: -32000,
|
|
303
|
+
TIMEOUT: -32001,
|
|
304
|
+
NOT_FOUND: -32002,
|
|
305
|
+
} as const;
|
|
306
|
+
|
|
307
|
+
export function errorShape(
|
|
308
|
+
code: number,
|
|
309
|
+
message: string,
|
|
310
|
+
meta?: { details?: unknown }
|
|
311
|
+
): ErrorShape {
|
|
312
|
+
return { code, message, ...(meta?.details ? { details: meta.details } : {}) };
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**Refatorar todos os handlers para usar:**
|
|
317
|
+
```typescript
|
|
318
|
+
// Antes:
|
|
319
|
+
await sendInvokeResult(client, frame, {
|
|
320
|
+
ok: false,
|
|
321
|
+
error: { code: "INVALID_REQUEST", message: "path required" },
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
// Depois:
|
|
325
|
+
await sendInvokeResult(client, frame, {
|
|
326
|
+
ok: false,
|
|
327
|
+
error: errorShape(ErrorCodes.INVALID_PARAMS, "path required"),
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
### 3.3 Centralização de Comandos (Prioridade: 🟡 Média)
|
|
334
|
+
|
|
335
|
+
**Ação:** Criar constantes para comandos de node
|
|
336
|
+
|
|
337
|
+
**Implementação:**
|
|
338
|
+
```typescript
|
|
339
|
+
// src/infra/node-commands.ts
|
|
340
|
+
export const NODE_SYSTEM_RUN_COMMANDS = [
|
|
341
|
+
"system.run",
|
|
342
|
+
"system.which",
|
|
343
|
+
] as const;
|
|
344
|
+
|
|
345
|
+
export const NODE_EXEC_APPROVALS_COMMANDS = [
|
|
346
|
+
"system.execApprovals.get",
|
|
347
|
+
"system.execApprovals.set",
|
|
348
|
+
] as const;
|
|
349
|
+
|
|
350
|
+
export const NODE_FILE_COMMANDS = [
|
|
351
|
+
"file.read",
|
|
352
|
+
"file.write",
|
|
353
|
+
"file.exists",
|
|
354
|
+
"file.delete",
|
|
355
|
+
"file.list",
|
|
356
|
+
] as const;
|
|
357
|
+
|
|
358
|
+
export const NODE_BROWSER_PROXY_COMMAND = "browser.proxy";
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
### 3.4 Melhorias nos File Operations (O que já implementamos)
|
|
364
|
+
|
|
365
|
+
**Status:** ✅ Implementado
|
|
366
|
+
|
|
367
|
+
**O que foi feito:**
|
|
368
|
+
1. Adicionado handlers para `file.read`, `file.write`, `file.exists`, `file.delete`, `file.list`
|
|
369
|
+
2. Registrado comandos na lista de capabilities do node-host
|
|
370
|
+
3. Adicionado ao node-command-policy como dangerous commands
|
|
371
|
+
|
|
372
|
+
**O que ainda precisa ser melhorado:**
|
|
373
|
+
1. **Validação de paths:** Prevenir path traversal attacks
|
|
374
|
+
```typescript
|
|
375
|
+
// Adicionar validação:
|
|
376
|
+
if (path.includes("..") || path.startsWith("/") && isWindows) {
|
|
377
|
+
throw new Error("Invalid path: path traversal detected");
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
2. **Rate limiting:** Limitar operações de escrita/exclusão
|
|
382
|
+
3. **Logging:** Auditoria de operações de arquivo
|
|
383
|
+
4. **Tamanho máximo:** Limitar leitura/escrita de arquivos grandes
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
### 3.5 Validação de Schema (Prioridade: 🟡 Média)
|
|
388
|
+
|
|
389
|
+
**Ação:** Implementar validação AJV para parâmetros de node.invoke
|
|
390
|
+
|
|
391
|
+
**Implementação:**
|
|
392
|
+
```typescript
|
|
393
|
+
// src/gateway/protocol/node-invoke.ts
|
|
394
|
+
import Ajv from "ajv";
|
|
395
|
+
|
|
396
|
+
const ajv = new Ajv();
|
|
397
|
+
|
|
398
|
+
export const FileReadParamsSchema = {
|
|
399
|
+
type: "object",
|
|
400
|
+
properties: {
|
|
401
|
+
path: { type: "string", minLength: 1 },
|
|
402
|
+
encoding: { enum: ["utf8", "base64"] },
|
|
403
|
+
},
|
|
404
|
+
required: ["path"],
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
export const validateFileReadParams = ajv.compile(FileReadParamsSchema);
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## 4. CORREÇÕES IMEDIATAS Necessárias
|
|
413
|
+
|
|
414
|
+
### 4.1 Path Traversal Vulnerability
|
|
415
|
+
|
|
416
|
+
**Problema:** Nossa implementação atual de file operations não valida paths:
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
// src/node-host/runner.ts (atual)
|
|
420
|
+
const filePath = String(params.path ?? "").trim();
|
|
421
|
+
// Pode ser: "../../../etc/passwd"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Fix necessário:**
|
|
425
|
+
```typescript
|
|
426
|
+
function sanitizePath(inputPath: string, allowedBasePath?: string): string {
|
|
427
|
+
const normalized = path.normalize(inputPath);
|
|
428
|
+
|
|
429
|
+
// Bloquear path traversal
|
|
430
|
+
if (normalized.includes("..")) {
|
|
431
|
+
throw new Error("Path traversal not allowed");
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Opcional: restringir a base path
|
|
435
|
+
if (allowedBasePath && !normalized.startsWith(allowedBasePath)) {
|
|
436
|
+
throw new Error("Path outside allowed directory");
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return normalized;
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
### 4.2 Limite de Tamanho de Arquivo
|
|
446
|
+
|
|
447
|
+
**Problema:** Leitura de arquivos grandes pode causar OOM:
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
// Atual: lê arquivo inteiro na memória
|
|
451
|
+
const content = await fsPromises.readFile(filePath, encoding);
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
**Fix necessário:**
|
|
455
|
+
```typescript
|
|
456
|
+
const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
|
|
457
|
+
|
|
458
|
+
const stat = await fsPromises.stat(filePath);
|
|
459
|
+
if (stat.size > MAX_FILE_SIZE) {
|
|
460
|
+
throw new Error(`File too large: ${stat.size} bytes (max ${MAX_FILE_SIZE})`);
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
### 4.3 Erros Específicos do Sistema
|
|
467
|
+
|
|
468
|
+
**Problema:** Não distinguimos entre diferentes tipos de erro:
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
// Atual: código genérico
|
|
472
|
+
const code = (err as NodeJS.ErrnoException)?.code === "ENOENT" ? "NOT_FOUND" : "INVALID_REQUEST";
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**Fix necessário:**
|
|
476
|
+
```typescript
|
|
477
|
+
function mapSystemErrorCode(code: string | undefined): number {
|
|
478
|
+
switch (code) {
|
|
479
|
+
case "ENOENT": return ErrorCodes.NOT_FOUND;
|
|
480
|
+
case "EACCES": return ErrorCodes.UNAUTHORIZED;
|
|
481
|
+
case "EISDIR": return ErrorCodes.INVALID_PARAMS;
|
|
482
|
+
case "ENOTDIR": return ErrorCodes.INVALID_PARAMS;
|
|
483
|
+
default: return ErrorCodes.INTERNAL_ERROR;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
## 5. PLANO DE IMPLEMENTAÇÃO
|
|
491
|
+
|
|
492
|
+
### Fase 1: Segurança (Imediato)
|
|
493
|
+
1. ✅ Implementar file operations (feito)
|
|
494
|
+
2. 🔄 Adicionar path traversal protection
|
|
495
|
+
3. 🔄 Adicionar limits de tamanho
|
|
496
|
+
4. 🔄 Mapear códigos de erro do sistema
|
|
497
|
+
|
|
498
|
+
### Fase 2: Refatoração (Próxima sprint)
|
|
499
|
+
1. Separar handlers em módulos
|
|
500
|
+
2. Criar sistema de erros padronizado
|
|
501
|
+
3. Centralizar constantes de comandos
|
|
502
|
+
|
|
503
|
+
### Fase 3: Qualidade (Futuro)
|
|
504
|
+
1. Implementar schemas AJV
|
|
505
|
+
2. Criar helpers de validação de parâmetros
|
|
506
|
+
3. Adicionar testes unitários para handlers
|
|
507
|
+
4. Melhorar documentação
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## 6. CONCLUSÃO
|
|
512
|
+
|
|
513
|
+
O PoolBot tem uma base sólida, mas carece de:
|
|
514
|
+
1. **Arquitetura mais modular** (aprendizado do OpenClaw)
|
|
515
|
+
2. **Tratamento de erros padronizado**
|
|
516
|
+
3. **Segurança reforçada** em operações de arquivo
|
|
517
|
+
|
|
518
|
+
A implementação do `nodes_file` tool foi um bom começo, mas precisa de hardening de segurança antes de ser usada em produção.
|
|
519
|
+
|
|
520
|
+
**Recomendação:** Priorizar as correções de segurança (Fase 1) antes de continuar com novas features.
|