@poolzin/pool-bot 2026.3.17 → 2026.3.19

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 (89) hide show
  1. package/CHANGELOG.md +63 -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/improvements/OPENCLAW-IMPLEMENTATION.md +45 -0
  41. package/docs/skills/openclaw-integration.md +295 -0
  42. package/docs/testing/TEST-PLAN-2026-03-13.md +338 -0
  43. package/extensions/acpx/package.json +19 -0
  44. package/extensions/acpx/poolbot.plugin.json +9 -0
  45. package/extensions/acpx/src/index.ts +34 -0
  46. package/extensions/bluebubbles/src/runtime.ts +1 -0
  47. package/extensions/dexter/poolbot.plugin.json +10 -6
  48. package/extensions/diffs/package.json +15 -0
  49. package/extensions/diffs/poolbot.plugin.json +10 -0
  50. package/extensions/diffs/src/index.ts +106 -0
  51. package/extensions/discord/src/runtime.ts +1 -0
  52. package/extensions/feishu/src/runtime.ts +1 -0
  53. package/extensions/github-copilot/package.json +28 -0
  54. package/extensions/github-copilot/poolbot.plugin.json +33 -0
  55. package/extensions/github-copilot/src/index.ts +126 -0
  56. package/extensions/github-copilot/tsconfig.json +10 -0
  57. package/extensions/googlechat/src/runtime.ts +1 -0
  58. package/extensions/hackingtool/poolbot.plugin.json +33 -25
  59. package/extensions/hexstrike-ai/poolbot.plugin.json +16 -8
  60. package/extensions/imessage/src/runtime.ts +1 -0
  61. package/extensions/irc/src/runtime.ts +1 -0
  62. package/extensions/line/src/runtime.ts +1 -0
  63. package/extensions/matrix/src/runtime.ts +1 -0
  64. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +10 -1
  65. package/extensions/mattermost/src/runtime.ts +6 -3
  66. package/extensions/msteams/src/runtime.ts +1 -0
  67. package/extensions/nextcloud-talk/src/runtime.ts +1 -0
  68. package/extensions/nostr/src/runtime.ts +5 -2
  69. package/extensions/ollama/package.json +20 -0
  70. package/extensions/ollama/poolbot.plugin.json +18 -0
  71. package/extensions/ollama/src/index.ts +95 -0
  72. package/extensions/sglang/package.json +18 -0
  73. package/extensions/sglang/poolbot.plugin.json +17 -0
  74. package/extensions/sglang/src/index.ts +62 -0
  75. package/extensions/signal/src/runtime.ts +1 -0
  76. package/extensions/slack/src/runtime.ts +1 -0
  77. package/extensions/telegram/src/runtime.ts +1 -0
  78. package/extensions/test-utils/package.json +17 -0
  79. package/extensions/test-utils/poolbot.plugin.json +16 -0
  80. package/extensions/test-utils/src/index.ts +220 -0
  81. package/extensions/tlon/src/runtime.ts +1 -0
  82. package/extensions/twitch/src/runtime.ts +1 -0
  83. package/extensions/vllm/package.json +19 -0
  84. package/extensions/vllm/poolbot.plugin.json +17 -0
  85. package/extensions/vllm/src/index.ts +90 -0
  86. package/extensions/whatsapp/src/runtime.ts +1 -0
  87. package/extensions/zalo/src/runtime.ts +1 -0
  88. package/extensions/zalouser/src/runtime.ts +1 -0
  89. package/package.json +77 -3
@@ -0,0 +1,338 @@
1
+ # Plano de Testes - Pool Bot v2026.3.17
2
+
3
+ **Data:** 2026-03-13
4
+ **Status:** Em Progresso
5
+ **Responsável:** Build Agent
6
+
7
+ ---
8
+
9
+ ## 📋 Resumo Executivo
10
+
11
+ Este documento descreve o plano de testes abrangente para a release v2026.3.17 do Pool Bot, focando em validação de integração, segurança e funcionalidade das skills OpenClaw.
12
+
13
+ ---
14
+
15
+ ## ✅ COMPLETO: Testes de Integração Security Audit
16
+
17
+ **Arquivo:** `src/security/audit.integration.test.ts`
18
+ **Status:** ✅ Implementado
19
+ **Cobertura:** 25+ testes de integração
20
+
21
+ ### Testes Implementados
22
+
23
+ #### 1. Gateway Security (4 testes)
24
+ - ✅ Detecção de gateway inseguro (bind: "lan")
25
+ - ✅ Validação de gateway seguro (bind: "loopback")
26
+ - ✅ Deep probe do gateway
27
+ - ✅ Tratamento de gateway offline
28
+
29
+ #### 2. Auth & Secrets (3 testes)
30
+ - ✅ Detecção de API keys no config
31
+ - ✅ Quick security check com issues críticos
32
+ - ✅ Quick security check com config limpo
33
+
34
+ #### 3. Channel Security (2 testes)
35
+ - ✅ Detecção de group policy "open"
36
+ - ✅ Detecção de tokens de bot (Telegram, Discord)
37
+
38
+ #### 4. Environment Variables (2 testes)
39
+ - ✅ Detecção de secrets no env
40
+ - ✅ Detecção de PATH injection
41
+
42
+ #### 5. Report Quality (5 testes)
43
+ - ✅ Timestamp no report
44
+ - ✅ Summary com todos os níveis de severidade
45
+ - ✅ Remediation guidance presente
46
+ - ✅ Consistência entre execuções
47
+ - ✅ Requisições concorrentes
48
+
49
+ #### 6. Cross-Platform (3 testes)
50
+ - ✅ Auditoria Linux
51
+ - ✅ Auditoria macOS
52
+ - ✅ Auditoria Windows
53
+
54
+ #### 7. Edge Cases (3 testes)
55
+ - ✅ Config mínimo
56
+ - ✅ Config com undefined fields
57
+ - ✅ Timeout de deep probe
58
+
59
+ ### Como Executar
60
+
61
+ ```bash
62
+ # Executar testes de integração do Security Audit
63
+ pnpm test -- src/security/audit.integration.test.ts --run
64
+
65
+ # Executar com coverage
66
+ pnpm test:coverage -- src/security/audit.integration.test.ts --run
67
+ ```
68
+
69
+ ---
70
+
71
+ ## ⏳ PENDENTE: Testes de Integração Skills Loader
72
+
73
+ **Arquivo:** `src/skills/openclaw-skill-loader.integration.test.ts`
74
+ **Status:** ⏳ Pendente
75
+ **Estimativa:** 16h
76
+
77
+ ### Testes Planejados
78
+
79
+ ```typescript
80
+ describe("OpenClaw Skills Loader Integration", () => {
81
+ // 1. Validação de Carregamento
82
+ it("should load all 339+ skills", async () => {
83
+ const skills = await loadOpenClawSkills("skills-openclaw");
84
+ expect(skills.length).toBeGreaterThanOrEqual(339);
85
+ });
86
+
87
+ it("should validate skill structure", async () => {
88
+ // Validar campos obrigatórios de cada skill
89
+ });
90
+
91
+ it("should categorize skills correctly", async () => {
92
+ // Validar mapeamento de categorias
93
+ });
94
+
95
+ // 2. Validação de Dependencies
96
+ it("should parse install dependencies", async () => {
97
+ // Validar que dependencies são parseadas corretamente
98
+ });
99
+
100
+ it("should detect missing binaries", async () => {
101
+ // Validar detecção de bins faltantes
102
+ });
103
+
104
+ // 3. Validação de Execução
105
+ it("should execute a sample skill", async () => {
106
+ // Teste de integração com agent system
107
+ });
108
+
109
+ // 4. Validação de CLI
110
+ it("should list skills via CLI", async () => {
111
+ // Testar comando poolbot skills-openclaw list
112
+ });
113
+
114
+ it("should search skills via CLI", async () => {
115
+ // Testar comando poolbot skills-openclaw search
116
+ });
117
+ });
118
+ ```
119
+
120
+ ### Como Executar (quando implementado)
121
+
122
+ ```bash
123
+ pnpm test -- src/skills/openclaw-skill-loader.integration.test.ts --run
124
+ ```
125
+
126
+ ---
127
+
128
+ ## ⏳ PENDENTE: Testes Unitários UI Components
129
+
130
+ **Arquivos:**
131
+ - `ui/src/ui/chat/export.test.ts`
132
+ - `ui/src/ui/chat/pinned-messages.test.ts`
133
+ - `ui/src/ui/chat/search-match.test.ts`
134
+ - `ui/src/ui/chat/slash-commands.test.ts`
135
+
136
+ **Status:** ⏳ Pendente
137
+ **Estimativa:** 8h
138
+
139
+ ### Testes Planejados
140
+
141
+ #### Export Component
142
+ ```typescript
143
+ describe("Chat Export", () => {
144
+ it("should export messages to markdown", () => {});
145
+ it("should export messages to JSON", () => {});
146
+ it("should export messages to HTML", () => {});
147
+ it("should filter by date range", () => {});
148
+ it("should include timestamps when requested", () => {});
149
+ it("should handle attachments", () => {});
150
+ });
151
+ ```
152
+
153
+ #### Pinned Messages
154
+ ```typescript
155
+ describe("Pinned Messages", () => {
156
+ it("should pin a message", () => {});
157
+ it("should unpin a message", () => {});
158
+ it("should list pinned messages", () => {});
159
+ it("should check if message is pinned", () => {});
160
+ it("should update pinned note", () => {});
161
+ });
162
+ ```
163
+
164
+ #### Search Match
165
+ ```typescript
166
+ describe("Search Messages", () => {
167
+ it("should search with exact match", () => {});
168
+ it("should search with fuzzy match", () => {});
169
+ it("should highlight matches", () => {});
170
+ it("should score results", () => {});
171
+ it("should extract context", () => {});
172
+ it("should limit results", () => {});
173
+ });
174
+ ```
175
+
176
+ #### Slash Commands
177
+ ```typescript
178
+ describe("Slash Commands", () => {
179
+ it("should parse command from input", () => {});
180
+ it("should handle flags", () => {});
181
+ it("should handle arguments", () => {});
182
+ it("should register commands", () => {});
183
+ it("should execute commands", () => {});
184
+ it("should handle unknown commands", () => {});
185
+ it("should show help", () => {});
186
+ });
187
+ ```
188
+
189
+ ---
190
+
191
+ ## ⏳ PENDENTE: Validação de Skills Representativas
192
+
193
+ **Status:** ⏳ Pendente
194
+ **Estimativa:** 8h
195
+
196
+ ### 10 Skills para Validação
197
+
198
+ | # | Skill | Categoria | Arquivo | Status |
199
+ |---|-------|-----------|---------|--------|
200
+ | 1 | GitHub | Development | `skills-openclaw/github/` | ⏳ |
201
+ | 2 | Docker | Development | `skills-openclaw/docker/` | ⏳ |
202
+ | 3 | Notion | Productivity | `skills-openclaw/notion/` | ⏳ |
203
+ | 4 | OpenAI | AI & LLM | `skills-openclaw/openai/` | ⏳ |
204
+ | 5 | Slack | Communication | `skills-openclaw/slack/` | ⏳ |
205
+ | 6 | YouTube | Media | `skills-openclaw/youtube/` | ⏳ |
206
+ | 7 | Weather | Data & Analytics | `skills-openclaw/weather/` | ⏳ |
207
+ | 8 | Finance | Finance | `skills-openclaw/finance/` | ⏳ |
208
+ | 9 | Browser | Search & Web | `skills-openclaw/browser/` | ⏳ |
209
+ | 10 | Git | Development | `skills-openclaw/git/` | ⏳ |
210
+
211
+ ### Checklist de Validação por Skill
212
+
213
+ ```markdown
214
+ - [ ] Skill file exists and is readable
215
+ - [ ] Frontmatter is valid YAML
216
+ - [ ] Description is present and meaningful
217
+ - [ ] Category mapping is correct
218
+ - [ ] Dependencies are listed (if any)
219
+ - [ ] Install instructions are present (if needed)
220
+ - [ ] Skill can be loaded by loader
221
+ - [ ] Skill metadata is parsed correctly
222
+ ```
223
+
224
+ ---
225
+
226
+ ## ⏳ PENDENTE: Testes de CLI Commands
227
+
228
+ **Status:** ⏳ Pendente
229
+ **Estimativa:** 4h
230
+
231
+ ### Comandos para Testar
232
+
233
+ ```bash
234
+ # 1. Listar skills
235
+ poolbot skills-openclaw list
236
+
237
+ # 2. Listar por categoria
238
+ poolbot skills-openclaw list --category development
239
+
240
+ # 3. Buscar skills
241
+ poolbot skills-openclaw search github
242
+
243
+ # 4. Mostrar detalhes
244
+ poolbot skills-openclaw show github
245
+
246
+ # 5. Instalar dependencies
247
+ poolbot skills-openclaw install-deps
248
+
249
+ # 6. Validar skills
250
+ poolbot skills-openclaw validate
251
+ ```
252
+
253
+ ### Critérios de Aceite
254
+
255
+ - [ ] Todos os comandos retornam sem erro
256
+ - [ ] Output é formatado corretamente (table/JSON)
257
+ - [ ] Filtros funcionam (--category, --format)
258
+ - [ ] Busca retorna resultados relevantes
259
+ - [ ] Help está disponível (--help)
260
+
261
+ ---
262
+
263
+ ## ⏳ EM PROGRESSO: Documentação de Limitações Conhecidas
264
+
265
+ **Status:** ⏳ Em Progresso
266
+ **Estimativa:** 4h
267
+
268
+ ### Limitações Identificadas
269
+
270
+ #### 1. UI Components
271
+ - **Status:** Library functions completas, UI real faltando
272
+ - **Impacto:** Baixo (funções utilitárias funcionam)
273
+ - **Workaround:** Usar funções de export diretamente
274
+ - **ETA para fix:** v2026.3.18
275
+
276
+ #### 2. Skills Integration
277
+ - **Status:** 339 skills copiadas, validação pendente
278
+ - **Impacto:** Médio (skills podem não funcionar como esperado)
279
+ - **Workaround:** Validar skills individualmente antes de usar
280
+ - **ETA para fix:** v2026.3.18
281
+
282
+ #### 3. Test Coverage
283
+ - **Status:** Testes de integração incompletos
284
+ - **Impacto:** Médio (possíveis regressões não detectadas)
285
+ - **Workaround:** Testar manualmente antes de release
286
+ - **ETA para fix:** v2026.3.18
287
+
288
+ #### 4. Type Hacks
289
+ - **Status:** Workarounds para `FetchLike` e `preconnect`
290
+ - **Impacto:** Baixo (funciona mas não é ideal)
291
+ - **Workaround:** Documentar no código
292
+ - **ETA para fix:** v2026.4.0 (refatoração)
293
+
294
+ ---
295
+
296
+ ## 📊 Cronograma
297
+
298
+ | Semana | Tarefa | Horas | Status |
299
+ |--------|--------|-------|--------|
300
+ | 1 | Security Audit Tests | 8h | ✅ Completo |
301
+ | 1 | Skills Loader Tests | 16h | ⏳ Pendente |
302
+ | 1 | UI Components Tests | 8h | ⏳ Pendente |
303
+ | 2 | Validar 10 Skills | 8h | ⏳ Pendente |
304
+ | 2 | Testar CLI Commands | 4h | ⏳ Pendente |
305
+ | 2 | Documentar Limitações | 4h | ⏳ Em Progresso |
306
+ | **Total** | | **48h** | |
307
+
308
+ ---
309
+
310
+ ## 🎯 Critérios de Release
311
+
312
+ ### Para Release Imediato (v2026.3.17-beta)
313
+ - [x] Build passando
314
+ - [x] Security Audit tests completos
315
+ - [ ] Skills Loader tests implementados
316
+ - [ ] UI Components tests implementados
317
+ - [ ] Documentação de limitações completa
318
+
319
+ ### Para Release Produção (v2026.3.18)
320
+ - [ ] Todos os testes acima passando
321
+ - [ ] 10 skills validadas manualmente
322
+ - [ ] CLI commands testados
323
+ - [ ] Changelog atualizado com limitações
324
+
325
+ ---
326
+
327
+ ## 📝 Notas
328
+
329
+ 1. **Security Audit Integration Tests** foram priorizados por serem críticos para segurança
330
+ 2. **Skills Loader Tests** requerem mais tempo devido à complexidade (339 skills)
331
+ 3. **UI Components Tests** são importantes mas não bloqueiam release beta
332
+ 4. **Validação Manual** de skills é necessária mesmo com testes automatizados
333
+
334
+ ---
335
+
336
+ **Próxima Revisão:** 2026-03-20
337
+ **Responsável:** Build Agent
338
+ **Status Report:** Semanal
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@poolbot/acpx",
3
+ "version": "2026.3.17",
4
+ "description": "Pool Bot ACP (Agent Client Protocol) runtime backend",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "dependencies": {
8
+ "poolbot": "workspace:*",
9
+ "acpx": "0.3.0"
10
+ },
11
+ "poolbot": {
12
+ "extensions": ["./src/index.ts"],
13
+ "provider": {
14
+ "id": "acpx",
15
+ "name": "ACP Runtime",
16
+ "description": "Agent Client Protocol runtime for Pool Bot"
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "acpx",
3
+ "name": "ACP Runtime",
4
+ "version": "2026.3.17",
5
+ "description": "Agent Client Protocol runtime backend",
6
+ "main": "dist/index.js",
7
+ "capabilities": ["runtime", "agent-protocol"],
8
+ "commands": ["acpx.status"]
9
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Pool Bot ACP (Agent Client Protocol) Extension
3
+ *
4
+ * Provides ACP runtime backend for agent communication
5
+ */
6
+
7
+ export default async function createPlugin(ctx: any): Promise<any> {
8
+ ctx.logger.info("ACP Runtime initialized");
9
+
10
+ try {
11
+ // Import acpx dynamically to avoid build issues
12
+ const acpx = await import("acpx");
13
+
14
+ ctx.logger.info("ACP runtime loaded successfully");
15
+
16
+ ctx.cli
17
+ .command("acpx.status")
18
+ .description("Check ACP runtime status")
19
+ .action(async () => {
20
+ console.log("✅ ACP Runtime Status");
21
+ console.log(" Status: Running");
22
+ console.log(" Version: 0.3.0");
23
+ });
24
+ } catch (error) {
25
+ ctx.logger.warn("ACP runtime not available");
26
+ ctx.logger.warn("Install with: npm install acpx@0.3.0");
27
+ }
28
+
29
+ return {
30
+ name: "acpx",
31
+ version: "2026.3.17",
32
+ commands: ["acpx.status"],
33
+ };
34
+ }
@@ -1,5 +1,6 @@
1
1
  import type { PluginRuntime } from "poolbot/plugin-sdk";
2
2
 
3
+ // oxlint-disable-next-line typescript-eslint/no-redundant-type-constituents
3
4
  let runtime: PluginRuntime | null = null;
4
5
 
5
6
  export function setBlueBubblesRuntime(next: PluginRuntime): void {
@@ -19,12 +19,16 @@
19
19
  "finance.queries"
20
20
  ],
21
21
  "hooks": ["onInit"],
22
- "config": {
23
- "model": "gpt-4o",
24
- "maxSteps": 10,
25
- "autoStart": true,
26
- "financialDatasetsApiKey": "",
27
- "exaApiKey": ""
22
+ "configSchema": {
23
+ "type": "object",
24
+ "properties": {
25
+ "model": { "type": "string", "default": "gpt-4o" },
26
+ "maxSteps": { "type": "number", "default": 10 },
27
+ "autoStart": { "type": "boolean", "default": true },
28
+ "financialDatasetsApiKey": { "type": "string" },
29
+ "exaApiKey": { "type": "string" }
30
+ },
31
+ "additionalProperties": false
28
32
  },
29
33
  "permissions": [
30
34
  "gateway.rpc",
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@poolbot/diffs",
3
+ "version": "2026.3.17",
4
+ "description": "Pool Bot diff viewer plugin",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "dependencies": {
8
+ "poolbot": "workspace:*",
9
+ "@pierre/diffs": "1.0.11"
10
+ },
11
+ "poolbot": {
12
+ "extensions": ["./src/index.ts"],
13
+ "tools": ["diff_viewer"]
14
+ }
15
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "diffs",
3
+ "name": "Diff Viewer",
4
+ "version": "2026.3.17",
5
+ "description": "View and analyze code diffs",
6
+ "main": "dist/index.js",
7
+ "capabilities": ["diff", "code-review"],
8
+ "commands": ["diff.view", "diff.stats"],
9
+ "tools": ["diff_viewer"]
10
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Pool Bot Diff Viewer Extension
3
+ *
4
+ * Provides diff viewing capabilities for code reviews
5
+ */
6
+
7
+ import type { Type } from "@sinclair/typebox";
8
+
9
+ export default async function createPlugin(ctx: any): Promise<any> {
10
+ ctx.logger.info("Diff Viewer initialized");
11
+
12
+ ctx.cli
13
+ .command("diff.view")
14
+ .description("View a diff")
15
+ .argument("<old>", "Old content or file path")
16
+ .argument("<new>", "New content or file path")
17
+ .option("-f, --format <format>", "Output format (unified, json, html)", "unified")
18
+ .action(async (oldContent: string, newContent: string, options?: { format?: string }) => {
19
+ const format = options?.format ?? "unified";
20
+
21
+ try {
22
+ const diffResult = await generateDiff(oldContent, newContent, format);
23
+ console.log(diffResult);
24
+ } catch (error) {
25
+ console.error("Failed to generate diff:", error instanceof Error ? error.message : error);
26
+ process.exit(1);
27
+ }
28
+ });
29
+
30
+ ctx.cli
31
+ .command("diff.stats")
32
+ .description("Show diff statistics")
33
+ .argument("<old>", "Old content or file path")
34
+ .argument("<new>", "New content or file path")
35
+ .action(async (oldContent: string, newContent: string) => {
36
+ const stats = await getDiffStats(oldContent, newContent);
37
+ console.log("📊 Diff Statistics");
38
+ console.log(` Additions: ${stats.additions}`);
39
+ console.log(` Deletions: ${stats.deletions}`);
40
+ console.log(` Changes: ${stats.changes}`);
41
+ });
42
+
43
+ return {
44
+ name: "diffs",
45
+ version: "2026.3.17",
46
+ commands: ["diff.view", "diff.stats"],
47
+ tools: ["diff_viewer"],
48
+ };
49
+ }
50
+
51
+ async function generateDiff(oldContent: string, newContent: string, format: string): Promise<string> {
52
+ // Simplified diff implementation
53
+ const oldLines = oldContent.split("\n");
54
+ const newLines = newContent.split("\n");
55
+
56
+ if (format === "json") {
57
+ return JSON.stringify({ old: oldLines, new: newLines }, null, 2);
58
+ }
59
+
60
+ // Unified diff format
61
+ const lines: string[] = [];
62
+ lines.push("--- old");
63
+ lines.push("+++ new");
64
+
65
+ const maxLen = Math.max(oldLines.length, newLines.length);
66
+ for (let i = 0; i < maxLen; i++) {
67
+ const old = oldLines[i];
68
+ const next = newLines[i];
69
+
70
+ if (old !== next) {
71
+ if (old !== undefined) lines.push(`- ${old}`);
72
+ if (next !== undefined) lines.push(`+ ${next}`);
73
+ } else {
74
+ lines.push(` ${old}`);
75
+ }
76
+ }
77
+
78
+ return lines.join("\n");
79
+ }
80
+
81
+ async function getDiffStats(oldContent: string, newContent: string): Promise<{
82
+ additions: number;
83
+ deletions: number;
84
+ changes: number;
85
+ }> {
86
+ const oldLines = oldContent.split("\n");
87
+ const newLines = newContent.split("\n");
88
+
89
+ let additions = 0;
90
+ let deletions = 0;
91
+ let changes = 0;
92
+
93
+ const maxLen = Math.max(oldLines.length, newLines.length);
94
+ for (let i = 0; i < maxLen; i++) {
95
+ const old = oldLines[i];
96
+ const next = newLines[i];
97
+
98
+ if (old !== next) {
99
+ if (old === undefined) additions++;
100
+ else if (next === undefined) deletions++;
101
+ else changes++;
102
+ }
103
+ }
104
+
105
+ return { additions, deletions, changes };
106
+ }
@@ -1,5 +1,6 @@
1
1
  import type { PluginRuntime } from "poolbot/plugin-sdk";
2
2
 
3
+ // oxlint-disable-next-line typescript-eslint/no-redundant-type-constituents
3
4
  let runtime: PluginRuntime | null = null;
4
5
 
5
6
  export function setDiscordRuntime(next: PluginRuntime) {
@@ -1,5 +1,6 @@
1
1
  import type { PluginRuntime } from "poolbot/plugin-sdk";
2
2
 
3
+ // oxlint-disable-next-line typescript-eslint/no-redundant-type-constituents
3
4
  let runtime: PluginRuntime | null = null;
4
5
 
5
6
  export function setFeishuRuntime(next: PluginRuntime) {
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@poolbot/github-copilot",
3
+ "version": "2026.3.17",
4
+ "description": "GitHub Copilot provider for Pool Bot - OAuth authentication and model access",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "dependencies": {
8
+ "poolbot": "workspace:*"
9
+ },
10
+ "poolbot": {
11
+ "extensions": [
12
+ "./src/index.ts"
13
+ ],
14
+ "provider": {
15
+ "id": "github-copilot",
16
+ "name": "GitHub Copilot",
17
+ "description": "Access OpenAI and Anthropic models via GitHub Copilot subscription",
18
+ "authType": "oauth-device",
19
+ "models": [
20
+ "gpt-4o",
21
+ "gpt-4o-mini",
22
+ "gpt-4-turbo",
23
+ "claude-3-5-sonnet",
24
+ "claude-3-opus"
25
+ ]
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "github-copilot",
3
+ "name": "GitHub Copilot Provider",
4
+ "version": "2026.3.17",
5
+ "description": "GitHub Copilot OAuth provider for Pool Bot - access GPT-4, Claude, and more via your Copilot subscription",
6
+ "author": "Pool Bot Team",
7
+ "main": "dist/index.js",
8
+ "capabilities": [
9
+ "provider",
10
+ "oauth-auth",
11
+ "model-access"
12
+ ],
13
+ "commands": [
14
+ "copilot.auth",
15
+ "copilot.status",
16
+ "copilot.models"
17
+ ],
18
+ "hooks": ["onInit"],
19
+ "configSchema": {
20
+ "type": "object",
21
+ "properties": {
22
+ "autoRefresh": { "type": "boolean", "default": true },
23
+ "refreshIntervalHours": { "type": "number", "default": 24 },
24
+ "defaultModel": { "type": "string", "default": "gpt-4o" }
25
+ },
26
+ "additionalProperties": false
27
+ },
28
+ "permissions": [
29
+ "config.read",
30
+ "config.write",
31
+ "auth.profiles"
32
+ ]
33
+ }