@poolzin/pool-bot 2026.3.7 → 2026.3.10

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 (150) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +147 -69
  3. package/dist/.buildstamp +1 -1
  4. package/dist/agents/error-classifier.js +251 -0
  5. package/dist/agents/skills/security.js +211 -0
  6. package/dist/build-info.json +3 -3
  7. package/dist/cli/cron-cli/register.cron-dashboard.js +339 -0
  8. package/dist/cli/cron-cli/register.js +2 -0
  9. package/dist/cli/errors.js +187 -0
  10. package/dist/cli/lazy-commands.example.js +113 -0
  11. package/dist/cli/lazy-commands.js +329 -0
  12. package/dist/cli/program/command-registry.js +26 -0
  13. package/dist/cli/program/register.maintenance.js +21 -0
  14. package/dist/cli/program/register.skills.js +4 -0
  15. package/dist/cli/program/register.subclis.js +9 -0
  16. package/dist/cli/swarm-cli/register.js +8 -0
  17. package/dist/cli/swarm-cli/register.swarm-status.js +488 -0
  18. package/dist/cli/telemetry-cli/register.js +10 -0
  19. package/dist/cli/telemetry-cli/register.telemetry-alerts.js +176 -0
  20. package/dist/cli/telemetry-cli/register.telemetry-metrics.js +323 -0
  21. package/dist/cli/telemetry-cli/register.telemetry-status.js +179 -0
  22. package/dist/commands/doctor-checks.js +498 -0
  23. package/dist/config/config.js +1 -0
  24. package/dist/config/secrets-integration.js +88 -0
  25. package/dist/context-engine/index.js +33 -0
  26. package/dist/context-engine/legacy.js +179 -0
  27. package/dist/context-engine/registry.js +86 -0
  28. package/dist/context-engine/summarizing.js +290 -0
  29. package/dist/context-engine/types.js +7 -0
  30. package/dist/cron/service/timer.js +18 -0
  31. package/dist/gateway/protocol/index.js +5 -2
  32. package/dist/gateway/protocol/schema/error-codes.js +1 -0
  33. package/dist/gateway/protocol/schema/swarm.js +80 -0
  34. package/dist/gateway/protocol/schema.js +1 -0
  35. package/dist/gateway/server-close.js +4 -0
  36. package/dist/gateway/server-constants.js +1 -0
  37. package/dist/gateway/server-cron.js +29 -0
  38. package/dist/gateway/server-maintenance.js +35 -2
  39. package/dist/gateway/server-methods/swarm.js +58 -0
  40. package/dist/gateway/server-methods/telemetry.js +71 -0
  41. package/dist/gateway/server-methods-list.js +8 -0
  42. package/dist/gateway/server-methods.js +9 -2
  43. package/dist/gateway/server.impl.js +33 -16
  44. package/dist/infra/abort-pattern.js +106 -0
  45. package/dist/infra/retry.js +96 -0
  46. package/dist/secrets/index.js +28 -0
  47. package/dist/secrets/resolver.js +185 -0
  48. package/dist/secrets/runtime.js +142 -0
  49. package/dist/secrets/types.js +11 -0
  50. package/dist/security/dangerous-tools.js +80 -0
  51. package/dist/security/types.js +12 -0
  52. package/dist/skills/commands.js +333 -0
  53. package/dist/skills/index.js +164 -0
  54. package/dist/skills/loader.js +282 -0
  55. package/dist/skills/parser.js +446 -0
  56. package/dist/skills/registry.js +394 -0
  57. package/dist/skills/security.js +312 -0
  58. package/dist/skills/types.js +21 -0
  59. package/dist/swarm/service.js +247 -0
  60. package/dist/telemetry/alert-engine.js +258 -0
  61. package/dist/telemetry/cron-instrumentation.js +49 -0
  62. package/dist/telemetry/gateway-instrumentation.js +80 -0
  63. package/dist/telemetry/instrumentation.js +66 -0
  64. package/dist/telemetry/service.js +345 -0
  65. package/dist/test-utils/index.js +219 -0
  66. package/dist/tui/components/assistant-message.js +6 -2
  67. package/dist/tui/components/hyperlink-markdown.js +32 -0
  68. package/dist/tui/components/searchable-select-list.js +12 -1
  69. package/dist/tui/components/user-message.js +6 -2
  70. package/dist/tui/index.js +611 -0
  71. package/dist/tui/theme/theme-detection.js +226 -0
  72. package/dist/tui/tui-command-handlers.js +20 -0
  73. package/dist/tui/tui-formatters.js +4 -3
  74. package/dist/tui/utils/ctrl-c-handler.js +67 -0
  75. package/dist/tui/utils/osc8-hyperlinks.js +208 -0
  76. package/dist/tui/utils/safe-stop.js +180 -0
  77. package/dist/tui/utils/session-key-utils.js +81 -0
  78. package/dist/tui/utils/text-sanitization.js +284 -0
  79. package/dist/utils/lru-cache.js +116 -0
  80. package/dist/utils/performance.js +199 -0
  81. package/dist/utils/retry.js +240 -0
  82. package/docs/INTEGRATION_PLAN.md +475 -0
  83. package/docs/INTEGRATION_SUMMARY.md +215 -0
  84. package/docs/MELHORIAS_IMPLEMENTADAS.md +228 -0
  85. package/docs/MELHORIAS_PROFISSIONAIS.md +282 -0
  86. package/docs/PLANO_ACAO_TUI.md +357 -0
  87. package/docs/PROGRESSO_TUI.md +66 -0
  88. package/docs/RELATORIO_FINAL.md +217 -0
  89. package/docs/diagnostico-shell-completion.md +265 -0
  90. package/docs/features/advanced-memory.md +585 -0
  91. package/docs/features/discord-components-v2.md +277 -0
  92. package/docs/features/swarm.md +100 -0
  93. package/docs/features/telemetry.md +284 -0
  94. package/docs/integrations/HEXSTRIKE_PLAN.md +796 -0
  95. package/docs/integrations/INTEGRATION_PLAN.md +744 -0
  96. package/docs/integrations/PAGE_AGENT_PLAN.md +370 -0
  97. package/docs/integrations/XYOPS_PLAN.md +978 -0
  98. package/docs/models/provider-infrastructure.md +400 -0
  99. package/docs/security/exec-approvals.md +294 -0
  100. package/docs/skills/IMPLEMENTATION_SUMMARY.md +145 -0
  101. package/docs/skills/SKILL.md +524 -0
  102. package/docs/skills.md +405 -0
  103. package/extensions/bluebubbles/package.json +1 -1
  104. package/extensions/copilot-proxy/package.json +1 -1
  105. package/extensions/diagnostics-otel/package.json +1 -1
  106. package/extensions/discord/package.json +1 -1
  107. package/extensions/feishu/package.json +1 -1
  108. package/extensions/google-antigravity-auth/package.json +1 -1
  109. package/extensions/google-gemini-cli-auth/package.json +1 -1
  110. package/extensions/googlechat/package.json +1 -1
  111. package/extensions/hexstrike-bridge/README.md +119 -0
  112. package/extensions/hexstrike-bridge/index.test.ts +247 -0
  113. package/extensions/hexstrike-bridge/index.ts +487 -0
  114. package/extensions/hexstrike-bridge/package.json +17 -0
  115. package/extensions/imessage/package.json +1 -1
  116. package/extensions/irc/package.json +1 -1
  117. package/extensions/line/package.json +1 -1
  118. package/extensions/llm-task/package.json +1 -1
  119. package/extensions/lobster/package.json +1 -1
  120. package/extensions/matrix/CHANGELOG.md +5 -0
  121. package/extensions/matrix/package.json +1 -1
  122. package/extensions/mattermost/package.json +1 -1
  123. package/extensions/mcp-server/index.ts +14 -0
  124. package/extensions/mcp-server/package.json +11 -0
  125. package/extensions/mcp-server/src/service.ts +540 -0
  126. package/extensions/memory-core/package.json +1 -1
  127. package/extensions/memory-lancedb/package.json +1 -1
  128. package/extensions/minimax-portal-auth/package.json +1 -1
  129. package/extensions/msteams/CHANGELOG.md +5 -0
  130. package/extensions/msteams/package.json +1 -1
  131. package/extensions/nextcloud-talk/package.json +1 -1
  132. package/extensions/nostr/CHANGELOG.md +5 -0
  133. package/extensions/nostr/package.json +1 -1
  134. package/extensions/open-prose/package.json +1 -1
  135. package/extensions/openai-codex-auth/package.json +1 -1
  136. package/extensions/signal/package.json +1 -1
  137. package/extensions/slack/package.json +1 -1
  138. package/extensions/telegram/package.json +1 -1
  139. package/extensions/tlon/package.json +1 -1
  140. package/extensions/twitch/CHANGELOG.md +5 -0
  141. package/extensions/twitch/package.json +1 -1
  142. package/extensions/voice-call/CHANGELOG.md +5 -0
  143. package/extensions/voice-call/package.json +1 -1
  144. package/extensions/whatsapp/package.json +1 -1
  145. package/extensions/zalo/CHANGELOG.md +5 -0
  146. package/extensions/zalo/package.json +1 -1
  147. package/extensions/zalouser/CHANGELOG.md +5 -0
  148. package/extensions/zalouser/package.json +1 -1
  149. package/package.json +8 -1
  150. package/skills/example-skill/SKILL.md +195 -0
@@ -0,0 +1,247 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import type { PoolBotPluginApi } from "../../src/plugins/types.js";
3
+ import type { GatewayRequestHandlerOptions } from "../../src/gateway/server-methods/types.js";
4
+
5
+ // Mock fetch globally
6
+ const mockFetch = vi.fn();
7
+ global.fetch = mockFetch as unknown as typeof fetch;
8
+
9
+ // Import the plugin after mocking
10
+ const definition = (await import("./index.js")).default;
11
+
12
+ describe("hexstrike-bridge", () => {
13
+ let mockApi: PoolBotPluginApi;
14
+ let registeredMethods: Map<string, Function>;
15
+
16
+ beforeEach(() => {
17
+ vi.clearAllMocks();
18
+ registeredMethods = new Map();
19
+
20
+ mockApi = {
21
+ pluginConfig: {},
22
+ logger: {
23
+ info: vi.fn(),
24
+ warn: vi.fn(),
25
+ error: vi.fn(),
26
+ debug: vi.fn(),
27
+ },
28
+ registerGatewayMethod: vi.fn((name: string, handler: Function) => {
29
+ registeredMethods.set(name, handler);
30
+ }),
31
+ registerCli: vi.fn(),
32
+ } as unknown as PoolBotPluginApi;
33
+ });
34
+
35
+ describe("plugin registration", () => {
36
+ it("should register all gateway methods", async () => {
37
+ await definition.register!(mockApi);
38
+
39
+ expect(mockApi.registerGatewayMethod).toHaveBeenCalledTimes(5);
40
+ expect(registeredMethods.has("security.status")).toBe(true);
41
+ expect(registeredMethods.has("security.tools.list")).toBe(true);
42
+ expect(registeredMethods.has("security.scan.start")).toBe(true);
43
+ expect(registeredMethods.has("security.scan.status")).toBe(true);
44
+ expect(registeredMethods.has("security.scan.list")).toBe(true);
45
+ });
46
+
47
+ it("should register CLI commands", async () => {
48
+ await definition.register!(mockApi);
49
+ expect(mockApi.registerCli).toHaveBeenCalledTimes(1);
50
+ });
51
+ });
52
+
53
+ describe("security.status", () => {
54
+ it("should return healthy status when HexStrike is online", async () => {
55
+ mockFetch.mockResolvedValueOnce({
56
+ ok: true,
57
+ json: async () => ({ version: "1.0.0" }),
58
+ });
59
+
60
+ await definition.register!(mockApi);
61
+ const handler = registeredMethods.get("security.status")!;
62
+
63
+ const mockRespond = vi.fn();
64
+ await handler({ respond: mockRespond } as unknown as GatewayRequestHandlerOptions);
65
+
66
+ expect(mockRespond).toHaveBeenCalledWith(true, {
67
+ connected: true,
68
+ version: "1.0.0",
69
+ maxConcurrent: 3,
70
+ activeScans: 0,
71
+ });
72
+ });
73
+
74
+ it("should return offline status when HexStrike is down", async () => {
75
+ mockFetch.mockRejectedValueOnce(new Error("Connection refused"));
76
+
77
+ await definition.register!(mockApi);
78
+ const handler = registeredMethods.get("security.status")!;
79
+
80
+ const mockRespond = vi.fn();
81
+ await handler({ respond: mockRespond } as unknown as GatewayRequestHandlerOptions);
82
+
83
+ expect(mockRespond).toHaveBeenCalledWith(true, {
84
+ connected: false,
85
+ version: undefined,
86
+ maxConcurrent: 3,
87
+ activeScans: 0,
88
+ });
89
+ });
90
+ });
91
+
92
+ describe("security.tools.list", () => {
93
+ it("should return list of tools", async () => {
94
+ const mockTools = [
95
+ { name: "nmap", description: "Port scanner", category: "recon", params: [] },
96
+ { name: "nikto", description: "Web scanner", category: "web", params: [] },
97
+ ];
98
+
99
+ mockFetch.mockResolvedValueOnce({
100
+ ok: true,
101
+ json: async () => ({ tools: mockTools }),
102
+ });
103
+
104
+ await definition.register!(mockApi);
105
+ const handler = registeredMethods.get("security.tools.list")!;
106
+
107
+ const mockRespond = vi.fn();
108
+ await handler({ respond: mockRespond } as unknown as GatewayRequestHandlerOptions);
109
+
110
+ expect(mockRespond).toHaveBeenCalledWith(true, { tools: mockTools });
111
+ });
112
+
113
+ it("should handle API errors", async () => {
114
+ mockFetch.mockResolvedValueOnce({
115
+ ok: false,
116
+ status: 500,
117
+ });
118
+
119
+ await definition.register!(mockApi);
120
+ const handler = registeredMethods.get("security.tools.list")!;
121
+
122
+ await expect(
123
+ handler({ respond: vi.fn() } as unknown as GatewayRequestHandlerOptions)
124
+ ).rejects.toThrow("HexStrike API error: 500");
125
+ });
126
+ });
127
+
128
+ describe("security.scan.start", () => {
129
+ it("should start a scan and return job ID", async () => {
130
+ mockFetch.mockResolvedValueOnce({
131
+ ok: true,
132
+ json: async () => ({ result: "scan completed" }),
133
+ });
134
+
135
+ await definition.register!(mockApi);
136
+ const handler = registeredMethods.get("security.scan.start")!;
137
+
138
+ const mockRespond = vi.fn();
139
+ await handler({
140
+ params: { tool: "nmap", target: "example.com" },
141
+ respond: mockRespond,
142
+ } as unknown as GatewayRequestHandlerOptions);
143
+
144
+ expect(mockRespond).toHaveBeenCalledWith(true, {
145
+ jobId: expect.stringMatching(/^scan-\d+-[a-z0-9]+$/),
146
+ status: "completed",
147
+ });
148
+ });
149
+ });
150
+
151
+ describe("security.scan.status", () => {
152
+ it("should return job status for existing job", async () => {
153
+ mockFetch.mockResolvedValueOnce({
154
+ ok: true,
155
+ json: async () => ({ result: "done" }),
156
+ });
157
+
158
+ await definition.register!(mockApi);
159
+ const startHandler = registeredMethods.get("security.scan.start")!;
160
+ const statusHandler = registeredMethods.get("security.scan.status")!;
161
+
162
+ // Start a scan first
163
+ const mockRespond = vi.fn();
164
+ await startHandler({
165
+ params: { tool: "nmap", target: "example.com" },
166
+ respond: mockRespond,
167
+ } as unknown as GatewayRequestHandlerOptions);
168
+
169
+ const jobId = mockRespond.mock.calls[0][1].jobId;
170
+
171
+ // Check status
172
+ const statusRespond = vi.fn();
173
+ await statusHandler({
174
+ params: { jobId },
175
+ respond: statusRespond,
176
+ } as unknown as GatewayRequestHandlerOptions);
177
+
178
+ expect(statusRespond).toHaveBeenCalledWith(true, {
179
+ jobId,
180
+ status: "completed",
181
+ progress: 100,
182
+ result: { result: "done" },
183
+ error: undefined,
184
+ startedAt: expect.any(Date),
185
+ completedAt: expect.any(Date),
186
+ });
187
+ });
188
+
189
+ it("should return error for non-existent job", async () => {
190
+ await definition.register!(mockApi);
191
+ const handler = registeredMethods.get("security.scan.status")!;
192
+
193
+ const mockRespond = vi.fn();
194
+ await handler({
195
+ params: { jobId: "non-existent" },
196
+ respond: mockRespond,
197
+ } as unknown as GatewayRequestHandlerOptions);
198
+
199
+ expect(mockRespond).toHaveBeenCalledWith(
200
+ false,
201
+ undefined,
202
+ expect.objectContaining({
203
+ code: "INVALID_REQUEST",
204
+ message: "Job not found: non-existent",
205
+ })
206
+ );
207
+ });
208
+ });
209
+
210
+ describe("security.scan.list", () => {
211
+ it("should return all jobs", async () => {
212
+ mockFetch.mockResolvedValueOnce({
213
+ ok: true,
214
+ json: async () => ({ result: "done" }),
215
+ });
216
+
217
+ await definition.register!(mockApi);
218
+ const startHandler = registeredMethods.get("security.scan.start")!;
219
+ const listHandler = registeredMethods.get("security.scan.list")!;
220
+
221
+ // Start a scan
222
+ await startHandler({
223
+ params: { tool: "nmap", target: "example.com" },
224
+ respond: vi.fn(),
225
+ } as unknown as GatewayRequestHandlerOptions);
226
+
227
+ // List jobs
228
+ const mockRespond = vi.fn();
229
+ await listHandler({ respond: mockRespond } as unknown as GatewayRequestHandlerOptions);
230
+
231
+ expect(mockRespond).toHaveBeenCalledWith(
232
+ true,
233
+ expect.objectContaining({
234
+ jobs: expect.arrayContaining([
235
+ expect.objectContaining({
236
+ jobId: expect.stringMatching(/^scan-\d+-[a-z0-9]+$/),
237
+ tool: "nmap",
238
+ target: "example.com",
239
+ status: "completed",
240
+ progress: 100,
241
+ }),
242
+ ]),
243
+ })
244
+ );
245
+ });
246
+ });
247
+ });