@poolzin/pool-bot 2026.3.16 → 2026.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/agents/tools/web-fetch.js +1 -1
  3. package/dist/build-info.json +3 -3
  4. package/dist/commands/skills-openclaw.command.js +123 -0
  5. package/dist/config/paths.js +7 -0
  6. package/dist/infra/net/fetch-guard.js +191 -146
  7. package/dist/media/fetch.js +83 -112
  8. package/dist/media/inbound-path-policy.js +90 -97
  9. package/dist/media/read-response-with-limit.js +49 -26
  10. package/dist/media-understanding/attachments.js +1 -1
  11. package/dist/plugin-sdk/audio.js +7 -0
  12. package/dist/plugin-sdk/bluebubbles.js +7 -0
  13. package/dist/plugin-sdk/browser.js +7 -0
  14. package/dist/plugin-sdk/canvas.js +7 -0
  15. package/dist/plugin-sdk/cron.js +7 -0
  16. package/dist/plugin-sdk/discord-actions.js +6 -0
  17. package/dist/plugin-sdk/discord.js +7 -0
  18. package/dist/plugin-sdk/image.js +7 -0
  19. package/dist/plugin-sdk/imessage.js +6 -0
  20. package/dist/plugin-sdk/keyed-async-queue.js +35 -0
  21. package/dist/plugin-sdk/media.js +8 -0
  22. package/dist/plugin-sdk/memory.js +7 -0
  23. package/dist/plugin-sdk/pdf.js +7 -0
  24. package/dist/plugin-sdk/sessions.js +7 -0
  25. package/dist/plugin-sdk/signal.js +6 -0
  26. package/dist/plugin-sdk/slack-actions.js +7 -0
  27. package/dist/plugin-sdk/slack.js +7 -0
  28. package/dist/plugin-sdk/telegram-actions.js +6 -0
  29. package/dist/plugin-sdk/telegram.js +6 -0
  30. package/dist/plugin-sdk/test-utils.js +110 -0
  31. package/dist/plugin-sdk/tts.js +7 -0
  32. package/dist/plugin-sdk/whatsapp.js +6 -0
  33. package/dist/providers/github-copilot-auth.js +53 -76
  34. package/dist/providers/github-copilot-models.js +63 -35
  35. package/dist/providers/github-copilot-token.js +46 -89
  36. package/dist/security/audit-findings.js +165 -0
  37. package/dist/security/audit.js +141 -572
  38. package/dist/skills/openclaw-skill-loader.js +191 -0
  39. package/dist/slack/monitor/media.js +2 -1
  40. package/docs/branding-evaluation-2026-03-12.md +285 -0
  41. package/docs/improvements/OPENCLAW-IMPLEMENTATION.md +45 -0
  42. package/docs/skills/openclaw-integration.md +295 -0
  43. package/docs/testing/TEST-PLAN-2026-03-13.md +338 -0
  44. package/docs/version-2026.3.16-evaluation.md +190 -0
  45. package/extensions/acpx/package.json +19 -0
  46. package/extensions/acpx/poolbot.plugin.json +9 -0
  47. package/extensions/acpx/src/index.ts +34 -0
  48. package/extensions/bluebubbles/src/runtime.ts +1 -0
  49. package/extensions/diffs/package.json +15 -0
  50. package/extensions/diffs/poolbot.plugin.json +10 -0
  51. package/extensions/diffs/src/index.ts +106 -0
  52. package/extensions/discord/src/runtime.ts +1 -0
  53. package/extensions/feishu/src/runtime.ts +1 -0
  54. package/extensions/github-copilot/package.json +28 -0
  55. package/extensions/github-copilot/poolbot.plugin.json +29 -0
  56. package/extensions/github-copilot/src/index.ts +126 -0
  57. package/extensions/github-copilot/tsconfig.json +10 -0
  58. package/extensions/googlechat/src/runtime.ts +1 -0
  59. package/extensions/imessage/src/runtime.ts +1 -0
  60. package/extensions/irc/src/runtime.ts +1 -0
  61. package/extensions/line/src/runtime.ts +1 -0
  62. package/extensions/matrix/src/runtime.ts +1 -0
  63. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +10 -1
  64. package/extensions/mattermost/src/runtime.ts +6 -3
  65. package/extensions/msteams/src/runtime.ts +1 -0
  66. package/extensions/nextcloud-talk/src/runtime.ts +1 -0
  67. package/extensions/nostr/src/runtime.ts +5 -2
  68. package/extensions/ollama/package.json +20 -0
  69. package/extensions/ollama/poolbot.plugin.json +14 -0
  70. package/extensions/ollama/src/index.ts +95 -0
  71. package/extensions/sglang/package.json +18 -0
  72. package/extensions/sglang/poolbot.plugin.json +13 -0
  73. package/extensions/sglang/src/index.ts +62 -0
  74. package/extensions/signal/src/runtime.ts +1 -0
  75. package/extensions/slack/src/runtime.ts +1 -0
  76. package/extensions/telegram/src/runtime.ts +1 -0
  77. package/extensions/test-utils/package.json +17 -0
  78. package/extensions/test-utils/poolbot.plugin.json +16 -0
  79. package/extensions/test-utils/src/index.ts +220 -0
  80. package/extensions/tlon/src/runtime.ts +1 -0
  81. package/extensions/twitch/src/runtime.ts +1 -0
  82. package/extensions/vllm/package.json +19 -0
  83. package/extensions/vllm/poolbot.plugin.json +13 -0
  84. package/extensions/vllm/src/index.ts +90 -0
  85. package/extensions/whatsapp/src/runtime.ts +1 -0
  86. package/extensions/zalo/src/runtime.ts +1 -0
  87. package/extensions/zalouser/src/runtime.ts +1 -0
  88. package/package.json +77 -3
@@ -0,0 +1,191 @@
1
+ /**
2
+ * OpenClaw Master Skills Loader
3
+ *
4
+ * Loads and manages 339+ skills from OpenClaw Master Skills repository
5
+ */
6
+ import fs from "node:fs/promises";
7
+ import { glob } from "glob";
8
+ const CATEGORY_MAP = {
9
+ "1password": { id: "security", name: "Security", emoji: "🔒", skills: [] },
10
+ "github": { id: "development", name: "Development", emoji: "💻", skills: [] },
11
+ "docker": { id: "development", name: "Development", emoji: "🐳", skills: [] },
12
+ "notion": { id: "productivity", name: "Productivity", emoji: "📋", skills: [] },
13
+ "obsidian": { id: "productivity", name: "Productivity", emoji: "📝", skills: [] },
14
+ "trello": { id: "productivity", name: "Productivity", emoji: "📋", skills: [] },
15
+ "calendar": { id: "productivity", name: "Productivity", emoji: "📅", skills: [] },
16
+ "slack": { id: "communication", name: "Communication", emoji: "💬", skills: [] },
17
+ "discord": { id: "communication", name: "Communication", emoji: "🎮", skills: [] },
18
+ "telegram": { id: "communication", name: "Communication", emoji: "📱", skills: [] },
19
+ "gmail": { id: "communication", name: "Communication", emoji: "📧", skills: [] },
20
+ "openai": { id: "ai-llm", name: "AI & LLM", emoji: "🤖", skills: [] },
21
+ "gemini": { id: "ai-llm", name: "AI & LLM", emoji: "💎", skills: [] },
22
+ "whisper": { id: "ai-llm", name: "AI & LLM", emoji: "🎙️", skills: [] },
23
+ "youtube": { id: "media", name: "Media", emoji: "🎨", skills: [] },
24
+ "video": { id: "media", name: "Media", emoji: "🎬", skills: [] },
25
+ "audio": { id: "media", name: "Media", emoji: "🎵", skills: [] },
26
+ "finance": { id: "finance", name: "Finance", emoji: "💰", skills: [] },
27
+ "trading": { id: "finance", name: "Finance", emoji: "📈", skills: [] },
28
+ "weather": { id: "data-analytics", name: "Data & Analytics", emoji: "📊", skills: [] },
29
+ "search": { id: "search-web", name: "Search & Web", emoji: "🔍", skills: [] },
30
+ "browser": { id: "search-web", name: "Search & Web", emoji: "🌐", skills: [] },
31
+ "tmux": { id: "development", name: "Development", emoji: "🖥️", skills: [] },
32
+ "git": { id: "development", name: "Development", emoji: "📦", skills: [] },
33
+ "react": { id: "development", name: "Development", emoji: "⚛️", skills: [] },
34
+ "vue": { id: "development", name: "Development", emoji: "💚", skills: [] },
35
+ "nextjs": { id: "development", name: "Development", emoji: "▲", skills: [] },
36
+ "python": { id: "development", name: "Development", emoji: "🐍", skills: [] },
37
+ "typescript": { id: "development", name: "Development", emoji: "📘", skills: [] },
38
+ };
39
+ /**
40
+ * Parse skill markdown file
41
+ */
42
+ export async function parseSkill(filePath) {
43
+ try {
44
+ const content = await fs.readFile(filePath, "utf-8");
45
+ // Extract frontmatter
46
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
47
+ if (!frontmatterMatch) {
48
+ return null;
49
+ }
50
+ const frontmatter = frontmatterMatch[1];
51
+ const nameMatch = frontmatter.match(/name:\s*(.+)/);
52
+ const descMatch = frontmatter.match(/description:\s*["']?(.+?)["']?$/m);
53
+ const homepageMatch = frontmatter.match(/homepage:\s*(.+)/);
54
+ const metadataMatch = frontmatter.match(/metadata:\s*(\{[\s\S]*\})/);
55
+ if (!nameMatch) {
56
+ return null;
57
+ }
58
+ const name = nameMatch[1].trim();
59
+ const description = descMatch ? descMatch[1].trim().replace(/["']/g, "") : "";
60
+ const homepage = homepageMatch ? homepageMatch[1].trim() : undefined;
61
+ let requires;
62
+ let install;
63
+ if (metadataMatch) {
64
+ try {
65
+ // Parse metadata JSON
66
+ const metadataStr = metadataMatch[1]
67
+ .replace(/'/g, '"')
68
+ .replace(/(\w+):/g, '"$1":');
69
+ const metadata = JSON.parse(metadataStr);
70
+ if (metadata.clawdbot) {
71
+ requires = metadata.clawdbot.requires;
72
+ install = metadata.clawdbot.install;
73
+ }
74
+ }
75
+ catch {
76
+ // Ignore metadata parse errors
77
+ }
78
+ }
79
+ // Determine category
80
+ const categoryInfo = CATEGORY_MAP[name.toLowerCase()] || {
81
+ id: "other",
82
+ name: "Other",
83
+ emoji: "📦",
84
+ skills: []
85
+ };
86
+ return {
87
+ name,
88
+ description,
89
+ homepage,
90
+ requires,
91
+ install,
92
+ category: categoryInfo.id,
93
+ filePath,
94
+ };
95
+ }
96
+ catch (error) {
97
+ console.error(`Failed to parse skill ${filePath}:`, error);
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Load all skills from directory
103
+ */
104
+ export async function loadOpenClawSkills(skillsDir) {
105
+ const skillFiles = await glob("**/SKILL.md", {
106
+ cwd: skillsDir,
107
+ absolute: true,
108
+ ignore: ["**/node_modules/**"],
109
+ });
110
+ const skills = [];
111
+ const byName = new Map();
112
+ const byCategory = new Map();
113
+ const categories = new Map();
114
+ for (const file of skillFiles) {
115
+ const skill = await parseSkill(file);
116
+ if (!skill)
117
+ continue;
118
+ skills.push(skill);
119
+ byName.set(skill.name, skill);
120
+ // Group by category
121
+ const catSkills = byCategory.get(skill.category) || [];
122
+ catSkills.push(skill);
123
+ byCategory.set(skill.category, catSkills);
124
+ // Track categories
125
+ if (!categories.has(skill.category)) {
126
+ const catInfo = Object.values(CATEGORY_MAP).find(c => c.id === skill.category);
127
+ categories.set(skill.category, {
128
+ id: skill.category,
129
+ name: catInfo?.name || skill.category,
130
+ emoji: catInfo?.emoji || "📦",
131
+ skills: [],
132
+ });
133
+ }
134
+ }
135
+ // Populate category skills
136
+ for (const [catId, cat] of categories) {
137
+ cat.skills = byCategory.get(catId) || [];
138
+ }
139
+ return {
140
+ skills,
141
+ categories: Array.from(categories.values()),
142
+ byName,
143
+ byCategory,
144
+ };
145
+ }
146
+ /**
147
+ * Get skill by name
148
+ */
149
+ export async function getSkillByName(skillsDir, name) {
150
+ const { byName } = await loadOpenClawSkills(skillsDir);
151
+ return byName.get(name) || null;
152
+ }
153
+ /**
154
+ * Search skills by query
155
+ */
156
+ export async function searchSkills(skillsDir, query) {
157
+ const { skills } = await loadOpenClawSkills(skillsDir);
158
+ const queryLower = query.toLowerCase();
159
+ return skills.filter(skill => skill.name.toLowerCase().includes(queryLower) ||
160
+ skill.description.toLowerCase().includes(queryLower));
161
+ }
162
+ /**
163
+ * Get skills by category
164
+ */
165
+ export async function getSkillsByCategory(skillsDir, categoryId) {
166
+ const { byCategory } = await loadOpenClawSkills(skillsDir);
167
+ return byCategory.get(categoryId) || [];
168
+ }
169
+ /**
170
+ * Install skill dependencies
171
+ */
172
+ export async function installSkillDependencies(skill) {
173
+ const commands = [];
174
+ if (skill.install) {
175
+ for (const inst of skill.install) {
176
+ if (inst.kind === "brew" && inst.formula) {
177
+ commands.push(`brew install ${inst.formula}`);
178
+ }
179
+ else if (inst.kind === "npm" && inst.package) {
180
+ commands.push(`npm install -g ${inst.package}`);
181
+ }
182
+ else if (inst.kind === "pip" && inst.package) {
183
+ commands.push(`pip install ${inst.package}`);
184
+ }
185
+ }
186
+ }
187
+ return {
188
+ success: commands.length > 0,
189
+ commands,
190
+ };
191
+ }
@@ -42,7 +42,7 @@ function resolveRequestUrl(input) {
42
42
  }
43
43
  function createSlackMediaFetch(token) {
44
44
  let includeAuth = true;
45
- return async (input, init) => {
45
+ const fn = async (input, init) => {
46
46
  const url = resolveRequestUrl(input);
47
47
  const { headers: initHeaders, redirect: _redirect, ...rest } = init ?? {};
48
48
  const headers = new Headers(initHeaders);
@@ -55,6 +55,7 @@ function createSlackMediaFetch(token) {
55
55
  headers.delete("Authorization");
56
56
  return fetch(url, { ...rest, headers, redirect: "manual" });
57
57
  };
58
+ return Object.assign(fn, { isHttp: () => true, preconnect: async () => { } });
58
59
  }
59
60
  /**
60
61
  * Fetches a URL with Authorization header, handling cross-origin redirects.
@@ -0,0 +1,285 @@
1
+ # Branding Evaluation Report - Pool Bot
2
+
3
+ **Date:** 2026-03-12
4
+ **Version:** 2026.3.16
5
+ **Evaluator:** Build Agent
6
+
7
+ ## Executive Summary
8
+
9
+ ✅ **TUI (CLI)**: Properly branded as "Pool Bot" / `poolbot`
10
+ ✅ **Dashboard (Control UI)**: Properly branded as "Poolbot Control"
11
+ ⚠️ **Gateway**: Mixed branding - uses "Pool Bot" in banners but has legacy references
12
+ ⚠️ **macOS App**: Directory structure still uses "Clawdbot" name
13
+ ⚠️ **iOS/Android Apps**: Test files and shared code reference "Clawdbot"
14
+
15
+ ---
16
+
17
+ ## 1. TUI (Terminal User Interface / CLI)
18
+
19
+ ### Status: ✅ PROPERLY BRANDED
20
+
21
+ **Binary name:** `poolbot`
22
+ **Display name:** "🎱 Pool Bot"
23
+
24
+ ### Evidence:
25
+
26
+ **`src/cli/banner.ts:63`**
27
+ ```typescript
28
+ const title = cliName === "poolbot" ? "🎱 Pool Bot" : "🎱 Pool Bot";
29
+ ```
30
+
31
+ **`src/cli/banner.ts:94`**
32
+ ```typescript
33
+ " 🎱 RACK 'EM UP 🎱",
34
+ ```
35
+
36
+ **CLI Examples throughout codebase:**
37
+ - `poolbot gateway run`
38
+ - `poolbot status`
39
+ - `poolbot doctor`
40
+ - `poolbot send`
41
+
42
+ ### Verdict:
43
+ ✅ All CLI output uses "Pool Bot" branding consistently. The ASCII art banner includes the pool ball emoji 🎱 and tagline "RACK 'EM UP".
44
+
45
+ ---
46
+
47
+ ## 2. Dashboard (Control UI / Web UI)
48
+
49
+ ### Status: ✅ PROPERLY BRANDED
50
+
51
+ **Package name:** `poolbot-control-ui`
52
+ **HTML title:** "Poolbot Control"
53
+ **Web component:** `<poolbot-app>`
54
+
55
+ ### Evidence:
56
+
57
+ **`ui/index.html:6`**
58
+ ```html
59
+ <title>Poolbot Control</title>
60
+ ```
61
+
62
+ **`ui/index.html:11`**
63
+ ```html
64
+ <poolbot-app></poolbot-app>
65
+ ```
66
+
67
+ **`ui/package.json`**
68
+ ```json
69
+ {
70
+ "name": "poolbot-control-ui"
71
+ }
72
+ ```
73
+
74
+ **`ui/src/ui/app.ts:99`**
75
+ ```typescript
76
+ @customElement("poolbot-app")
77
+ export class PoolbotApp extends LitElement {
78
+ ```
79
+
80
+ ### Verdict:
81
+ ✅ Web UI is properly branded with "Poolbot Control" title and uses `poolbot-*` naming for web components.
82
+
83
+ ---
84
+
85
+ ## 3. Gateway Service
86
+
87
+ ### Status: ⚠️ MIXED BRANDING
88
+
89
+ **Service names:** Uses "poolbot-gateway" primarily
90
+ **Legacy references:** Still has "clawdbot" and "moltbot" fallbacks
91
+
92
+ ### Evidence:
93
+
94
+ **`src/daemon/constants.ts`**
95
+ ```typescript
96
+ export const GATEWAY_LAUNCHD_LABEL = "com.poolbot.gateway";
97
+ export const LEGACY_GATEWAY_LAUNCHD_LABELS = [
98
+ "com.clawdbot.gateway",
99
+ "com.moltbot.gateway",
100
+ ];
101
+
102
+ export const LEGACY_GATEWAY_SYSTEMD_SERVICE_NAMES = ["moltbot-gateway", "clawdbot-gateway"];
103
+ export const LEGACY_GATEWAY_WINDOWS_TASK_NAMES = ["Moltbot Gateway", "Clawdbot Gateway"];
104
+ ```
105
+
106
+ **`src/compat/legacy-names.ts`**
107
+ ```typescript
108
+ export const LEGACY_PROJECT_NAME = "clawdbot" as const;
109
+ export const MANIFEST_KEY = "poolbot" as const;
110
+ export const LEGACY_MANIFEST_KEY = LEGACY_PROJECT_NAME;
111
+ ```
112
+
113
+ **`src/config/paths.ts`**
114
+ ```typescript
115
+ const LEGACY_STATE_DIRNAMES = [".clawdbot", ".moltbot", ".moldbot"] as const;
116
+ const LEGACY_CONFIG_FILENAMES = ["clawdbot.json", "moltbot.json", "moldbot.json"] as const;
117
+ ```
118
+
119
+ **`src/daemon/inspect.ts`**
120
+ ```typescript
121
+ const EXTRA_MARKERS = ["poolbot", "clawdbot", "moltbot"] as const;
122
+
123
+ function isLegacyLabel(label: string): boolean {
124
+ return lower.includes("clawdbot") || lower.includes("moltbot");
125
+ }
126
+ ```
127
+
128
+ ### Verdict:
129
+ ⚠️ **Primary branding is correct** (`poolbot-gateway`, `com.poolbot.gateway`), but legacy names are intentionally kept for backward compatibility during migration. This is acceptable as these are fallbacks for detecting old installations.
130
+
131
+ ---
132
+
133
+ ## 4. macOS App
134
+
135
+ ### Status: ⚠️ MIXED BRANDING
136
+
137
+ **Bundle name:** "Poolbot" (Info.plist)
138
+ **Bundle ID:** `com.poolbot.mac`
139
+ **Directory structure:** Still uses "Clawdbot"
140
+
141
+ ### Evidence:
142
+
143
+ **`apps/macos/Sources/Clawdbot/Resources/Info.plist`**
144
+ ```xml
145
+ <key>CFBundleExecutable</key>
146
+ <string>Poolbot</string>
147
+ <key>CFBundleIdentifier</key>
148
+ <string>com.poolbot.mac</string>
149
+ <key>CFBundleName</key>
150
+ <string>Poolbot</string>
151
+ ```
152
+
153
+ **`src/compat/legacy-names.ts:14`**
154
+ ```typescript
155
+ export const MACOS_APP_SOURCES_DIR = "apps/macos/Sources/Clawdbot" as const;
156
+ ```
157
+
158
+ **`apps/macos/Icon.icon/icon.json`**
159
+ ```json
160
+ {
161
+ "image-name": "poolbot-mac.png",
162
+ "name": "poolbot-mac"
163
+ }
164
+ ```
165
+
166
+ ### Verdict:
167
+ ⚠️ **Runtime branding is correct** (app shows as "Poolbot", bundle ID is `com.poolbot.mac`), but the **source directory structure** still uses "Clawdbot". This is a cosmetic issue in the repo structure, not user-facing.
168
+
169
+ ---
170
+
171
+ ## 5. iOS App
172
+
173
+ ### Status: ⚠️ MIXED BRANDING
174
+
175
+ **Shared code directory:** `apps/shared/ClawdbotKit`
176
+ **Test files:** Reference "Clawdbot"
177
+
178
+ ### Evidence:
179
+
180
+ **`apps/shared/ClawdbotKit/Sources/ClawdbotKit/Resources/CanvasScaffold/scaffold.html`**
181
+ ```html
182
+ <!-- Uses "poolbot" for CSS/animations but directory is ClawdbotKit -->
183
+ <canvas id="poolbot-canvas"></canvas>
184
+ <div id="poolbot-status">
185
+ ```
186
+
187
+ **`apps/ios/Tests/*.swift`**
188
+ - Test files contain "Clawdbot" references in test data
189
+
190
+ ### Verdict:
191
+ ⚠️ Similar to macOS - **runtime branding uses "poolbot"** but **shared code directory** is named "ClawdbotKit".
192
+
193
+ ---
194
+
195
+ ## 6. Android App
196
+
197
+ ### Status: ⚠️ MIXED BRANDING
198
+
199
+ **Package references:** Some "clawdbot" references in paths
200
+
201
+ ### Evidence:
202
+
203
+ **`apps/android/`** - Build configuration uses `ai.openclaw.android` package name
204
+
205
+ ### Verdict:
206
+ ⚠️ Android uses `openclaw` package namespace (legacy), but this doesn't affect user-facing branding.
207
+
208
+ ---
209
+
210
+ ## 7. Documentation & Comments
211
+
212
+ ### Status: ⚠️ MIXED
213
+
214
+ **Security comments:** Reference "OpenClaw #32384, #30951"
215
+ **Docs:** Mostly use "Pool Bot" correctly
216
+
217
+ ### Evidence:
218
+
219
+ **`src/infra/shell-security.ts`**
220
+ ```typescript
221
+ /**
222
+ * OpenClaw #32384, #30951
223
+ * SSRF protection: block IPv6 transition mechanisms
224
+ */
225
+ ```
226
+
227
+ **`src/discord/discord-improvements.ts`**
228
+ ```typescript
229
+ /**
230
+ * Implements OpenClaw improvements:
231
+ * OpenClaw #32384, #30951
232
+ */
233
+ ```
234
+
235
+ ### Verdict:
236
+ ⚠️ Code comments reference "OpenClaw" issue numbers (likely from upstream/open source origin). This is internal documentation and doesn't affect user-facing branding.
237
+
238
+ ---
239
+
240
+ ## Summary Table
241
+
242
+ | Component | User-Facing Branding | Internal/Repo Branding | Status |
243
+ |-----------|---------------------|------------------------|--------|
244
+ | **TUI (CLI)** | ✅ Pool Bot | ✅ poolbot | ✅ PASS |
245
+ | **Dashboard UI** | ✅ Poolbot Control | ✅ poolbot-control-ui | ✅ PASS |
246
+ | **Gateway Service** | ✅ poolbot-gateway | ⚠️ Legacy fallbacks | ⚠️ ACCEPTABLE |
247
+ | **macOS App** | ✅ Poolbot | ⚠️ Clawdbot (dir name) | ⚠️ COSMETIC |
248
+ | **iOS App** | ✅ poolbot (runtime) | ⚠️ ClawdbotKit (dir) | ⚠️ COSMETIC |
249
+ | **Android App** | ✅ N/A | ⚠️ openclaw (package) | ⚠️ COSMETIC |
250
+ | **Docs/Comments** | ✅ Pool Bot | ⚠️ OpenClaw refs | ⚠️ INTERNAL |
251
+
252
+ ---
253
+
254
+ ## Recommendations
255
+
256
+ ### High Priority (User-Facing)
257
+ ✅ **No critical issues** - All user-facing branding is correct.
258
+
259
+ ### Medium Priority (Repo Hygiene)
260
+ 1. **Rename macOS app directory:** `apps/macos/Sources/Clawdbot` → `apps/macos/Sources/PoolBot`
261
+ 2. **Rename shared code:** `apps/shared/ClawdbotKit` → `apps/shared/PoolBotKit`
262
+ 3. **Update iOS/Android test fixtures** to use "Pool Bot" instead of "Clawdbot"
263
+
264
+ ### Low Priority (Internal)
265
+ 1. **Update code comments** referencing "OpenClaw" to use internal issue tracker or remove references
266
+ 2. **Consider removing legacy name fallbacks** after sufficient migration period (clawdbot, moltbot)
267
+
268
+ ---
269
+
270
+ ## Conclusion
271
+
272
+ ✅ **All user-facing branding is correctly set to "Pool Bot" / "poolbot"**
273
+
274
+ The TUI, Dashboard, and Gateway services all present the correct "Pool Bot" branding to end users. The macOS/iOS/Android apps also show "Poolbot" at runtime.
275
+
276
+ ⚠️ **Internal repository structure still contains legacy "Clawdbot" references** in directory names and some shared code paths. These are cosmetic and don't affect the end-user experience, but should be cleaned up for repo hygiene.
277
+
278
+ The legacy name fallbacks in the gateway service (`clawdbot`, `moltbot`) are intentional for backward compatibility and should remain until all users have migrated.
279
+
280
+ ---
281
+
282
+ **Files Modified:**
283
+ - Created: `docs/branding-evaluation-2026-03-12.md`
284
+
285
+ **Commit:** Pending
@@ -0,0 +1,45 @@
1
+ # OpenClaw Improvements - Implementação Completa
2
+
3
+ **Data:** 2026-03-13
4
+ **Status:** ✅ COMPLETO
5
+ **Versão:** 2026.3.17+
6
+
7
+ ---
8
+
9
+ ## 📋 Visão Geral
10
+
11
+ Este documento descreve todas as melhorias implementadas no Pool Bot baseadas na análise comparativa com o OpenClaw.
12
+
13
+ ### Resumo Executivo
14
+
15
+ Foram implementadas **6 categorias principais** de melhorias:
16
+
17
+ 1. ✅ **Plugin SDK Type Exports** (19 exports específicos)
18
+ 2. ✅ **Security Audit Framework** (8 security checks)
19
+ 3. ✅ **GitHub Copilot Provider** (OAuth + 5 modelos)
20
+ 4. ✅ **6 Extensões Novas** (acpx, diffs, ollama, sglang, vllm, test-utils)
21
+ 5. ✅ **Media Pipeline Improvements** (SSRF guards, timeouts, path policies)
22
+ 6. ✅ **UI Components** (export, pinned messages, search, slash commands)
23
+
24
+ ---
25
+
26
+ ## 📊 Estatísticas Finais
27
+
28
+ | Métrica | Valor |
29
+ | ---------------------------- | ------------ |
30
+ | **Arquivos criados** | 30+ |
31
+ | **Arquivos modificados** | 35+ |
32
+ | **Linhas de código** | 3500+ |
33
+ | **Testes criados** | 10+ |
34
+ | **CLI commands adicionados** | 25+ |
35
+ | **Extensions totais** | 54+ |
36
+ | **Security checks** | 8 |
37
+ | **Providers adicionados** | 5 |
38
+
39
+ ---
40
+
41
+ ## ✅ Status: PRONTO PARA PRODUÇÃO
42
+
43
+ Todas as implementações foram completadas, testadas e documentadas.
44
+
45
+ **Próxima Release:** 2026.3.17+