@poolzin/pool-bot 2026.3.11 → 2026.3.14

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 (195) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/dist/.buildstamp +1 -1
  3. package/dist/agents/checkpoint-manager.js +291 -0
  4. package/dist/agents/poolbot-tools.js +5 -0
  5. package/dist/agents/subagent-announce-reliability.js +160 -0
  6. package/dist/agents/tool-result-truncation.js +299 -0
  7. package/dist/agents/tools/nodes-file-tool.js +197 -0
  8. package/dist/build-info.json +3 -3
  9. package/dist/cli/config-cli.js +60 -0
  10. package/dist/cron/cron-improvements.js +195 -0
  11. package/dist/discord/discord-improvements.js +167 -0
  12. package/dist/gateway/auth-rate-limit.js +19 -0
  13. package/dist/gateway/auth.js +41 -0
  14. package/dist/gateway/gateway-improvements.js +294 -0
  15. package/dist/gateway/node-command-policy.js +7 -2
  16. package/dist/infra/net/ssrf.js +15 -2
  17. package/dist/infra/shell-security.js +201 -0
  18. package/dist/memory/memory-improvements.js +239 -0
  19. package/dist/node-host/runner.js +146 -79
  20. package/dist/security/prototype-pollution.js +141 -0
  21. package/dist/security/webhook-security.js +253 -0
  22. package/dist/shared/net/ip.js +52 -1
  23. package/dist/slack/slack-improvements.js +225 -0
  24. package/dist/telegram/telegram-improvements.js +220 -0
  25. package/dist/ui-plugins/ui-plugins-improvements.js +191 -0
  26. package/docs/ANALISE_OPENCLAW_PROFISSIONAL.md +520 -0
  27. package/docs/competitive-analysis.md +421 -0
  28. package/docs/implementation-analysis.md +393 -0
  29. package/docs/plans/2026-03-11-file-operations-security-hardening.md +307 -0
  30. package/docs/plans/2026-03-11-integracao-projetos-poolbot.md +666 -0
  31. package/docs/refactor/plugin-development-guide.md +281 -0
  32. package/extensions/agency-agents/README.md +301 -0
  33. package/extensions/agency-agents/agents/CONTRIBUTING.md +353 -0
  34. package/extensions/agency-agents/agents/README.md +602 -0
  35. package/extensions/agency-agents/agents/design/design-brand-guardian.md +320 -0
  36. package/extensions/agency-agents/agents/design/design-image-prompt-engineer.md +234 -0
  37. package/extensions/agency-agents/agents/design/design-ui-designer.md +381 -0
  38. package/extensions/agency-agents/agents/design/design-ux-architect.md +467 -0
  39. package/extensions/agency-agents/agents/design/design-ux-researcher.md +327 -0
  40. package/extensions/agency-agents/agents/design/design-visual-storyteller.md +147 -0
  41. package/extensions/agency-agents/agents/design/design-whimsy-injector.md +436 -0
  42. package/extensions/agency-agents/agents/engineering/engineering-ai-engineer.md +144 -0
  43. package/extensions/agency-agents/agents/engineering/engineering-backend-architect.md +233 -0
  44. package/extensions/agency-agents/agents/engineering/engineering-devops-automator.md +374 -0
  45. package/extensions/agency-agents/agents/engineering/engineering-frontend-developer.md +223 -0
  46. package/extensions/agency-agents/agents/engineering/engineering-mobile-app-builder.md +491 -0
  47. package/extensions/agency-agents/agents/engineering/engineering-rapid-prototyper.md +460 -0
  48. package/extensions/agency-agents/agents/engineering/engineering-security-engineer.md +275 -0
  49. package/extensions/agency-agents/agents/engineering/engineering-senior-developer.md +174 -0
  50. package/extensions/agency-agents/agents/examples/README.md +48 -0
  51. package/extensions/agency-agents/agents/examples/nexus-spatial-discovery.md +852 -0
  52. package/extensions/agency-agents/agents/examples/workflow-landing-page.md +119 -0
  53. package/extensions/agency-agents/agents/examples/workflow-startup-mvp.md +155 -0
  54. package/extensions/agency-agents/agents/integrations/README.md +117 -0
  55. package/extensions/agency-agents/agents/integrations/aider/README.md +38 -0
  56. package/extensions/agency-agents/agents/integrations/antigravity/README.md +49 -0
  57. package/extensions/agency-agents/agents/integrations/claude-code/README.md +31 -0
  58. package/extensions/agency-agents/agents/integrations/cursor/README.md +38 -0
  59. package/extensions/agency-agents/agents/integrations/gemini-cli/README.md +36 -0
  60. package/extensions/agency-agents/agents/integrations/opencode/README.md +58 -0
  61. package/extensions/agency-agents/agents/integrations/windsurf/README.md +26 -0
  62. package/extensions/agency-agents/agents/marketing/marketing-app-store-optimizer.md +319 -0
  63. package/extensions/agency-agents/agents/marketing/marketing-content-creator.md +52 -0
  64. package/extensions/agency-agents/agents/marketing/marketing-growth-hacker.md +52 -0
  65. package/extensions/agency-agents/agents/marketing/marketing-instagram-curator.md +111 -0
  66. package/extensions/agency-agents/agents/marketing/marketing-reddit-community-builder.md +121 -0
  67. package/extensions/agency-agents/agents/marketing/marketing-social-media-strategist.md +123 -0
  68. package/extensions/agency-agents/agents/marketing/marketing-tiktok-strategist.md +123 -0
  69. package/extensions/agency-agents/agents/marketing/marketing-twitter-engager.md +124 -0
  70. package/extensions/agency-agents/agents/marketing/marketing-wechat-official-account.md +143 -0
  71. package/extensions/agency-agents/agents/marketing/marketing-xiaohongshu-specialist.md +136 -0
  72. package/extensions/agency-agents/agents/marketing/marketing-zhihu-strategist.md +160 -0
  73. package/extensions/agency-agents/agents/product/product-feedback-synthesizer.md +117 -0
  74. package/extensions/agency-agents/agents/product/product-sprint-prioritizer.md +152 -0
  75. package/extensions/agency-agents/agents/product/product-trend-researcher.md +157 -0
  76. package/extensions/agency-agents/agents/project-management/project-management-experiment-tracker.md +196 -0
  77. package/extensions/agency-agents/agents/project-management/project-management-project-shepherd.md +192 -0
  78. package/extensions/agency-agents/agents/project-management/project-management-studio-operations.md +198 -0
  79. package/extensions/agency-agents/agents/project-management/project-management-studio-producer.md +201 -0
  80. package/extensions/agency-agents/agents/project-management/project-manager-senior.md +133 -0
  81. package/extensions/agency-agents/agents/scripts/convert.sh +362 -0
  82. package/extensions/agency-agents/agents/scripts/install.sh +465 -0
  83. package/extensions/agency-agents/agents/scripts/lint-agents.sh +115 -0
  84. package/extensions/agency-agents/agents/spatial-computing/macos-spatial-metal-engineer.md +335 -0
  85. package/extensions/agency-agents/agents/spatial-computing/terminal-integration-specialist.md +68 -0
  86. package/extensions/agency-agents/agents/spatial-computing/visionos-spatial-engineer.md +52 -0
  87. package/extensions/agency-agents/agents/spatial-computing/xr-cockpit-interaction-specialist.md +30 -0
  88. package/extensions/agency-agents/agents/spatial-computing/xr-immersive-developer.md +30 -0
  89. package/extensions/agency-agents/agents/spatial-computing/xr-interface-architect.md +30 -0
  90. package/extensions/agency-agents/agents/specialized/agentic-identity-trust.md +367 -0
  91. package/extensions/agency-agents/agents/specialized/agents-orchestrator.md +365 -0
  92. package/extensions/agency-agents/agents/specialized/data-analytics-reporter.md +52 -0
  93. package/extensions/agency-agents/agents/specialized/data-consolidation-agent.md +58 -0
  94. package/extensions/agency-agents/agents/specialized/lsp-index-engineer.md +312 -0
  95. package/extensions/agency-agents/agents/specialized/report-distribution-agent.md +63 -0
  96. package/extensions/agency-agents/agents/specialized/sales-data-extraction-agent.md +65 -0
  97. package/extensions/agency-agents/agents/strategy/EXECUTIVE-BRIEF.md +95 -0
  98. package/extensions/agency-agents/agents/strategy/QUICKSTART.md +194 -0
  99. package/extensions/agency-agents/agents/strategy/coordination/agent-activation-prompts.md +401 -0
  100. package/extensions/agency-agents/agents/strategy/coordination/handoff-templates.md +357 -0
  101. package/extensions/agency-agents/agents/strategy/nexus-strategy.md +1110 -0
  102. package/extensions/agency-agents/agents/strategy/playbooks/phase-0-discovery.md +178 -0
  103. package/extensions/agency-agents/agents/strategy/playbooks/phase-1-strategy.md +238 -0
  104. package/extensions/agency-agents/agents/strategy/playbooks/phase-2-foundation.md +278 -0
  105. package/extensions/agency-agents/agents/strategy/playbooks/phase-3-build.md +286 -0
  106. package/extensions/agency-agents/agents/strategy/playbooks/phase-4-hardening.md +332 -0
  107. package/extensions/agency-agents/agents/strategy/playbooks/phase-5-launch.md +277 -0
  108. package/extensions/agency-agents/agents/strategy/playbooks/phase-6-operate.md +318 -0
  109. package/extensions/agency-agents/agents/strategy/runbooks/scenario-enterprise-feature.md +157 -0
  110. package/extensions/agency-agents/agents/strategy/runbooks/scenario-incident-response.md +217 -0
  111. package/extensions/agency-agents/agents/strategy/runbooks/scenario-marketing-campaign.md +187 -0
  112. package/extensions/agency-agents/agents/strategy/runbooks/scenario-startup-mvp.md +154 -0
  113. package/extensions/agency-agents/agents/support/support-analytics-reporter.md +363 -0
  114. package/extensions/agency-agents/agents/support/support-executive-summary-generator.md +210 -0
  115. package/extensions/agency-agents/agents/support/support-finance-tracker.md +440 -0
  116. package/extensions/agency-agents/agents/support/support-infrastructure-maintainer.md +616 -0
  117. package/extensions/agency-agents/agents/support/support-legal-compliance-checker.md +586 -0
  118. package/extensions/agency-agents/agents/support/support-support-responder.md +583 -0
  119. package/extensions/agency-agents/agents/testing/testing-accessibility-auditor.md +313 -0
  120. package/extensions/agency-agents/agents/testing/testing-api-tester.md +304 -0
  121. package/extensions/agency-agents/agents/testing/testing-evidence-collector.md +208 -0
  122. package/extensions/agency-agents/agents/testing/testing-performance-benchmarker.md +266 -0
  123. package/extensions/agency-agents/agents/testing/testing-reality-checker.md +236 -0
  124. package/extensions/agency-agents/agents/testing/testing-test-results-analyzer.md +303 -0
  125. package/extensions/agency-agents/agents/testing/testing-tool-evaluator.md +392 -0
  126. package/extensions/agency-agents/agents/testing/testing-workflow-optimizer.md +448 -0
  127. package/extensions/agency-agents/index.ts +733 -0
  128. package/extensions/agency-agents/node_modules/.bin/jiti +21 -0
  129. package/extensions/agency-agents/node_modules/.bin/tsc +21 -0
  130. package/extensions/agency-agents/node_modules/.bin/tsserver +21 -0
  131. package/extensions/agency-agents/node_modules/.bin/tsx +21 -0
  132. package/extensions/agency-agents/node_modules/.bin/vite +21 -0
  133. package/extensions/agency-agents/node_modules/.bin/vitest +21 -0
  134. package/extensions/agency-agents/node_modules/.bin/yaml +21 -0
  135. package/extensions/agency-agents/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  136. package/extensions/agency-agents/package.json +25 -0
  137. package/extensions/agency-agents/src/AgencyAgentsService.test.ts +443 -0
  138. package/extensions/agency-agents/src/AgencyAgentsService.ts +288 -0
  139. package/extensions/agency-agents/src/types.ts +147 -0
  140. package/extensions/agency-agents/vitest.config.ts +8 -0
  141. package/extensions/hexstrike-ai/README.md +98 -0
  142. package/extensions/hexstrike-ai/node_modules/.bin/tsc +21 -0
  143. package/extensions/hexstrike-ai/node_modules/.bin/tsserver +21 -0
  144. package/extensions/hexstrike-ai/package.json +29 -0
  145. package/extensions/hexstrike-ai/poolbot.plugin.json +31 -0
  146. package/extensions/hexstrike-ai/src/client.ts +91 -0
  147. package/extensions/hexstrike-ai/src/index.ts +170 -0
  148. package/extensions/hexstrike-ai/src/server/hexstrike_mcp.py +5470 -0
  149. package/extensions/hexstrike-ai/src/server/hexstrike_server.py +17289 -0
  150. package/extensions/hexstrike-ai/src/server/requirements.txt +84 -0
  151. package/extensions/hexstrike-ai/src/server-manager.ts +83 -0
  152. package/extensions/hexstrike-ai/tsconfig.json +20 -0
  153. package/extensions/hexstrike-bridge/package.json +1 -1
  154. package/extensions/hexstrike-bridge/poolbot.plugin.json +23 -0
  155. package/extensions/mcp-server/poolbot.plugin.json +10 -0
  156. package/extensions/page-agent/README.md +159 -0
  157. package/extensions/page-agent/index.ts +595 -0
  158. package/extensions/page-agent/node_modules/.bin/jiti +21 -0
  159. package/extensions/page-agent/node_modules/.bin/playwright +21 -0
  160. package/extensions/page-agent/node_modules/.bin/tsc +21 -0
  161. package/extensions/page-agent/node_modules/.bin/tsserver +21 -0
  162. package/extensions/page-agent/node_modules/.bin/tsx +21 -0
  163. package/extensions/page-agent/node_modules/.bin/vitest +21 -0
  164. package/extensions/page-agent/node_modules/.bin/yaml +21 -0
  165. package/extensions/page-agent/package.json +43 -0
  166. package/extensions/page-agent/src/PageAgentService.test.ts +517 -0
  167. package/extensions/page-agent/src/PageAgentService.ts +636 -0
  168. package/extensions/page-agent/src/PoolBotPageController.test.ts +358 -0
  169. package/extensions/page-agent/src/PoolBotPageController.ts +245 -0
  170. package/extensions/page-agent/src/index.ts +20 -0
  171. package/extensions/page-agent/src/tools.test.ts +231 -0
  172. package/extensions/page-agent/src/tools.ts +167 -0
  173. package/extensions/page-agent/src/types.ts +198 -0
  174. package/extensions/template/README.md +101 -0
  175. package/extensions/template/index.ts +38 -0
  176. package/extensions/template/package.json +15 -0
  177. package/extensions/template/poolbot.plugin.json +10 -0
  178. package/extensions/xyops/README.md +227 -0
  179. package/extensions/xyops/index.ts +342 -0
  180. package/extensions/xyops/node_modules/.bin/jiti +21 -0
  181. package/extensions/xyops/node_modules/.bin/tsc +21 -0
  182. package/extensions/xyops/node_modules/.bin/tsserver +21 -0
  183. package/extensions/xyops/node_modules/.bin/tsx +21 -0
  184. package/extensions/xyops/node_modules/.bin/vitest +21 -0
  185. package/extensions/xyops/node_modules/.bin/yaml +21 -0
  186. package/extensions/xyops/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  187. package/extensions/xyops/package.json +39 -0
  188. package/extensions/xyops/src/client.test.ts +467 -0
  189. package/extensions/xyops/src/client.ts +157 -0
  190. package/extensions/xyops/src/types.ts +147 -0
  191. package/extensions/xyops/vitest.config.ts +8 -0
  192. package/package.json +1 -1
  193. package/extensions/mavalie/README.md +0 -97
  194. package/extensions/mavalie/package.json +0 -15
  195. package/extensions/mavalie/src/index.ts +0 -62
@@ -0,0 +1,231 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest'
2
+ import {
3
+ NavigateTool,
4
+ ClickTool,
5
+ TypeTool,
6
+ SelectTool,
7
+ ScrollTool,
8
+ WaitTool,
9
+ ExecuteScriptTool,
10
+ DoneTool,
11
+ createPageAgentTools,
12
+ PageAgentTools,
13
+ } from './tools.js'
14
+ import type { PoolBotPageController } from './PoolBotPageController.js'
15
+
16
+ describe('Page Agent Tools', () => {
17
+ const mockController = {
18
+ navigate: vi.fn(),
19
+ clickElement: vi.fn(),
20
+ inputText: vi.fn(),
21
+ selectOption: vi.fn(),
22
+ scroll: vi.fn(),
23
+ wait: vi.fn(),
24
+ executeJavaScript: vi.fn(),
25
+ } as unknown as PoolBotPageController
26
+
27
+ beforeEach(() => {
28
+ vi.clearAllMocks()
29
+ })
30
+
31
+ describe('NavigateTool', () => {
32
+ it('should have correct name and description', () => {
33
+ expect(NavigateTool.name).toBe('navigate')
34
+ expect(NavigateTool.description).toBe('Navigate to a specific URL')
35
+ })
36
+
37
+ it('should execute navigate action', async () => {
38
+ vi.mocked(mockController.navigate).mockResolvedValue({
39
+ success: true,
40
+ message: 'Navigated to http://example.com',
41
+ })
42
+
43
+ const result = await NavigateTool.execute(mockController, { url: 'http://example.com' })
44
+
45
+ expect(mockController.navigate).toHaveBeenCalledWith('http://example.com')
46
+ expect(result).toBe('Navigated to http://example.com')
47
+ })
48
+ })
49
+
50
+ describe('ClickTool', () => {
51
+ it('should have correct name and description', () => {
52
+ expect(ClickTool.name).toBe('click')
53
+ expect(ClickTool.description).toBe('Click on an element by its reference ID')
54
+ })
55
+
56
+ it('should execute click action', async () => {
57
+ vi.mocked(mockController.clickElement).mockResolvedValue({
58
+ success: true,
59
+ message: 'Clicked element',
60
+ })
61
+
62
+ const result = await ClickTool.execute(mockController, { ref: 'element-1' })
63
+
64
+ expect(mockController.clickElement).toHaveBeenCalledWith('element-1')
65
+ expect(result).toBe('Clicked element')
66
+ })
67
+ })
68
+
69
+ describe('TypeTool', () => {
70
+ it('should have correct name and description', () => {
71
+ expect(TypeTool.name).toBe('type')
72
+ expect(TypeTool.description).toBe('Type text into an input element')
73
+ })
74
+
75
+ it('should execute type action', async () => {
76
+ vi.mocked(mockController.inputText).mockResolvedValue({
77
+ success: true,
78
+ message: 'Text entered',
79
+ })
80
+
81
+ const result = await TypeTool.execute(mockController, { ref: 'input-1', text: 'hello world' })
82
+
83
+ expect(mockController.inputText).toHaveBeenCalledWith('input-1', 'hello world')
84
+ expect(result).toBe('Text entered')
85
+ })
86
+ })
87
+
88
+ describe('SelectTool', () => {
89
+ it('should have correct name and description', () => {
90
+ expect(SelectTool.name).toBe('select')
91
+ expect(SelectTool.description).toBe('Select an option from a dropdown')
92
+ })
93
+
94
+ it('should execute select action', async () => {
95
+ vi.mocked(mockController.selectOption).mockResolvedValue({
96
+ success: true,
97
+ message: 'Option selected',
98
+ })
99
+
100
+ const result = await SelectTool.execute(mockController, { ref: 'select-1', value: 'option-1' })
101
+
102
+ expect(mockController.selectOption).toHaveBeenCalledWith('select-1', 'option-1')
103
+ expect(result).toBe('Option selected')
104
+ })
105
+ })
106
+
107
+ describe('ScrollTool', () => {
108
+ it('should have correct name and description', () => {
109
+ expect(ScrollTool.name).toBe('scroll')
110
+ expect(ScrollTool.description).toBe('Scroll the page up or down')
111
+ })
112
+
113
+ it('should scroll down', async () => {
114
+ vi.mocked(mockController.scroll).mockResolvedValue({
115
+ success: true,
116
+ message: 'Scrolled down',
117
+ })
118
+
119
+ const result = await ScrollTool.execute(mockController, { direction: 'down' })
120
+
121
+ expect(mockController.scroll).toHaveBeenCalledWith({ down: true, amount: undefined })
122
+ expect(result).toBe('Scrolled down')
123
+ })
124
+
125
+ it('should scroll up with custom amount', async () => {
126
+ vi.mocked(mockController.scroll).mockResolvedValue({
127
+ success: true,
128
+ message: 'Scrolled up',
129
+ })
130
+
131
+ const result = await ScrollTool.execute(mockController, { direction: 'up', amount: 1000 })
132
+
133
+ expect(mockController.scroll).toHaveBeenCalledWith({ down: false, amount: 1000 })
134
+ expect(result).toBe('Scrolled up')
135
+ })
136
+ })
137
+
138
+ describe('WaitTool', () => {
139
+ it('should have correct name and description', () => {
140
+ expect(WaitTool.name).toBe('wait')
141
+ expect(WaitTool.description).toBe('Wait for a specified number of seconds')
142
+ })
143
+
144
+ it('should execute wait action', async () => {
145
+ vi.mocked(mockController.wait).mockResolvedValue({
146
+ success: true,
147
+ message: 'Waited 5 seconds',
148
+ })
149
+
150
+ const result = await WaitTool.execute(mockController, { seconds: 5 })
151
+
152
+ expect(mockController.wait).toHaveBeenCalledWith(5)
153
+ expect(result).toBe('Waited 5 seconds')
154
+ })
155
+ })
156
+
157
+ describe('ExecuteScriptTool', () => {
158
+ it('should have correct name and description', () => {
159
+ expect(ExecuteScriptTool.name).toBe('execute_script')
160
+ expect(ExecuteScriptTool.description).toBe('Execute JavaScript code on the page')
161
+ })
162
+
163
+ it('should execute script', async () => {
164
+ vi.mocked(mockController.executeJavaScript).mockResolvedValue({
165
+ success: true,
166
+ message: 'Script executed',
167
+ })
168
+
169
+ const result = await ExecuteScriptTool.execute(mockController, { script: 'document.title' })
170
+
171
+ expect(mockController.executeJavaScript).toHaveBeenCalledWith('document.title')
172
+ expect(result).toBe('Script executed')
173
+ })
174
+ })
175
+
176
+ describe('DoneTool', () => {
177
+ it('should have correct name and description', () => {
178
+ expect(DoneTool.name).toBe('done')
179
+ expect(DoneTool.description).toContain('Complete the task')
180
+ })
181
+
182
+ it('should return success message', async () => {
183
+ const result = await DoneTool.execute(mockController, {
184
+ success: true,
185
+ answer: 'Task completed successfully',
186
+ })
187
+
188
+ expect(result).toBe('Task completed: Task completed successfully')
189
+ })
190
+
191
+ it('should return failure message', async () => {
192
+ const result = await DoneTool.execute(mockController, {
193
+ success: false,
194
+ answer: 'Could not complete',
195
+ })
196
+
197
+ expect(result).toBe('Task failed: Could not complete')
198
+ })
199
+ })
200
+
201
+ describe('createPageAgentTools', () => {
202
+ it('should return all tools', () => {
203
+ const tools = createPageAgentTools()
204
+
205
+ expect(tools).toHaveLength(8)
206
+ expect(tools.map((t) => t.name)).toEqual([
207
+ 'navigate',
208
+ 'click',
209
+ 'type',
210
+ 'select',
211
+ 'scroll',
212
+ 'wait',
213
+ 'execute_script',
214
+ 'done',
215
+ ])
216
+ })
217
+ })
218
+
219
+ describe('PageAgentTools', () => {
220
+ it('should contain all tools by name', () => {
221
+ expect(PageAgentTools.navigate).toBe(NavigateTool)
222
+ expect(PageAgentTools.click).toBe(ClickTool)
223
+ expect(PageAgentTools.type).toBe(TypeTool)
224
+ expect(PageAgentTools.select).toBe(SelectTool)
225
+ expect(PageAgentTools.scroll).toBe(ScrollTool)
226
+ expect(PageAgentTools.wait).toBe(WaitTool)
227
+ expect(PageAgentTools.execute_script).toBe(ExecuteScriptTool)
228
+ expect(PageAgentTools.done).toBe(DoneTool)
229
+ })
230
+ })
231
+ })
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Page Agent Tools
3
+ *
4
+ * Tool definitions for the Page Agent using TypeBox schemas.
5
+ * These tools wrap PoolBot's native browser actions.
6
+ */
7
+
8
+ import { Type } from '@sinclair/typebox';
9
+ import type { PoolBotPageController } from './PoolBotPageController.js';
10
+
11
+ export interface PageAgentTool {
12
+ name: string;
13
+ description: string;
14
+ inputSchema: ReturnType<typeof Type.Object>;
15
+ execute: (controller: unknown, input: unknown) => Promise<string>;
16
+ }
17
+
18
+ export const NavigateTool: PageAgentTool = {
19
+ name: 'navigate',
20
+ description: 'Navigate to a specific URL',
21
+ inputSchema: Type.Object({
22
+ url: Type.String({ description: 'URL to navigate to' }),
23
+ }),
24
+ execute: async (controller, input) => {
25
+ const { url } = input as { url: string };
26
+ const result = await (controller as PoolBotPageController).navigate(url);
27
+ return result.message;
28
+ },
29
+ };
30
+
31
+ export const ClickTool: PageAgentTool = {
32
+ name: 'click',
33
+ description: 'Click on an element by its reference ID',
34
+ inputSchema: Type.Object({
35
+ ref: Type.String({ description: 'Element reference ID from snapshot' }),
36
+ }),
37
+ execute: async (controller, input) => {
38
+ const { ref } = input as { ref: string };
39
+ const result = await (controller as PoolBotPageController).clickElement(ref);
40
+ return result.message;
41
+ },
42
+ };
43
+
44
+ export const TypeTool: PageAgentTool = {
45
+ name: 'type',
46
+ description: 'Type text into an input element',
47
+ inputSchema: Type.Object({
48
+ ref: Type.String({ description: 'Element reference ID' }),
49
+ text: Type.String({ description: 'Text to type' }),
50
+ }),
51
+ execute: async (controller, input) => {
52
+ const { ref, text } = input as { ref: string; text: string };
53
+ const result = await (controller as PoolBotPageController).inputText(ref, text);
54
+ return result.message;
55
+ },
56
+ };
57
+
58
+ export const SelectTool: PageAgentTool = {
59
+ name: 'select',
60
+ description: 'Select an option from a dropdown',
61
+ inputSchema: Type.Object({
62
+ ref: Type.String({ description: 'Element reference ID' }),
63
+ value: Type.String({ description: 'Option value to select' }),
64
+ }),
65
+ execute: async (controller, input) => {
66
+ const { ref, value } = input as { ref: string; value: string };
67
+ const result = await (controller as PoolBotPageController).selectOption(ref, value);
68
+ return result.message;
69
+ },
70
+ };
71
+
72
+ export const ScrollTool: PageAgentTool = {
73
+ name: 'scroll',
74
+ description: 'Scroll the page up or down',
75
+ inputSchema: Type.Object({
76
+ direction: Type.Union([Type.Literal('up'), Type.Literal('down')], {
77
+ description: 'Scroll direction',
78
+ }),
79
+ amount: Type.Optional(Type.Number({
80
+ description: 'Pixels to scroll (default: 500)',
81
+ default: 500,
82
+ })),
83
+ }),
84
+ execute: async (controller, input) => {
85
+ const { direction, amount } = input as { direction: 'up' | 'down'; amount?: number };
86
+ const result = await (controller as PoolBotPageController).scroll({
87
+ down: direction === 'down',
88
+ amount,
89
+ });
90
+ return result.message;
91
+ },
92
+ };
93
+
94
+ export const WaitTool: PageAgentTool = {
95
+ name: 'wait',
96
+ description: 'Wait for a specified number of seconds',
97
+ inputSchema: Type.Object({
98
+ seconds: Type.Number({
99
+ description: 'Seconds to wait',
100
+ minimum: 1,
101
+ maximum: 60,
102
+ }),
103
+ }),
104
+ execute: async (controller, input) => {
105
+ const { seconds } = input as { seconds: number };
106
+ const result = await (controller as PoolBotPageController).wait(seconds);
107
+ return result.message;
108
+ },
109
+ };
110
+
111
+ export const ExecuteScriptTool: PageAgentTool = {
112
+ name: 'execute_script',
113
+ description: 'Execute JavaScript code on the page',
114
+ inputSchema: Type.Object({
115
+ script: Type.String({ description: 'JavaScript code to execute' }),
116
+ }),
117
+ execute: async (controller, input) => {
118
+ const { script } = input as { script: string };
119
+ const result = await (controller as PoolBotPageController).executeJavaScript(script);
120
+ return result.message;
121
+ },
122
+ };
123
+
124
+ export const DoneTool: PageAgentTool = {
125
+ name: 'done',
126
+ description: 'Complete the task with a success status and final answer',
127
+ inputSchema: Type.Object({
128
+ success: Type.Boolean({ description: 'Whether the task was successful' }),
129
+ answer: Type.String({ description: 'Final answer or summary' }),
130
+ }),
131
+ execute: async (_controller, input) => {
132
+ const { success, answer } = input as { success: boolean; answer: string };
133
+ return `Task ${success ? 'completed' : 'failed'}: ${answer}`;
134
+ },
135
+ };
136
+
137
+ export function createPageAgentTools(): PageAgentTool[] {
138
+ return [
139
+ NavigateTool,
140
+ ClickTool,
141
+ TypeTool,
142
+ SelectTool,
143
+ ScrollTool,
144
+ WaitTool,
145
+ ExecuteScriptTool,
146
+ DoneTool,
147
+ ];
148
+ }
149
+
150
+ // Export tools as a map for the service
151
+ export const PageAgentTools: Record<string, PageAgentTool> = {
152
+ navigate: NavigateTool,
153
+ click: ClickTool,
154
+ type: TypeTool,
155
+ select: SelectTool,
156
+ scroll: ScrollTool,
157
+ wait: WaitTool,
158
+ execute_script: ExecuteScriptTool,
159
+ done: DoneTool,
160
+ };
161
+
162
+ // Tool definition type for service
163
+ export interface ToolDefinition {
164
+ description: string;
165
+ inputSchema: ReturnType<typeof Type.Object>;
166
+ execute: (this: PoolBotPageController, input: unknown) => Promise<unknown>;
167
+ }
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Type definitions for Page Agent integration
3
+ */
4
+
5
+ export type PageAgentStatus = 'idle' | 'running' | 'completed' | 'error' | 'stopped';
6
+
7
+ export interface PageAgentLLMConfig {
8
+ /** LLM provider */
9
+ provider: 'openai' | 'anthropic';
10
+
11
+ /** Model name */
12
+ model: string;
13
+
14
+ /** API key */
15
+ apiKey: string;
16
+
17
+ /** Base URL for API */
18
+ baseURL: string;
19
+
20
+ /** Temperature for generation */
21
+ temperature?: number;
22
+
23
+ /** Maximum retries */
24
+ maxRetries?: number;
25
+ }
26
+
27
+ export interface PageAgentTool {
28
+ name: string;
29
+ description: string;
30
+ inputSchema: unknown;
31
+ execute: (controller: unknown, input: unknown) => Promise<string>;
32
+ }
33
+
34
+ export interface PageAgentConfig {
35
+ /** Maximum number of steps per task */
36
+ maxSteps?: number;
37
+
38
+ /** LLM configuration */
39
+ llm: PageAgentLLMConfig;
40
+
41
+ /** Language for responses */
42
+ language?: 'en-US' | 'zh-CN';
43
+
44
+ /** Custom system prompt */
45
+ customSystemPrompt?: string;
46
+
47
+ /** Instructions for the agent */
48
+ instructions?: {
49
+ system?: string;
50
+ getPageInstructions?: (url: string) => string | undefined | null;
51
+ };
52
+
53
+ /** Custom tools to add/override */
54
+ customTools?: Record<string, PageAgentTool | null>;
55
+
56
+ /** Enable experimental script execution tool */
57
+ experimentalScriptExecutionTool?: boolean;
58
+
59
+ /** Enable fetching llms.txt */
60
+ experimentalLlmsTxt?: boolean;
61
+
62
+ /** Transform page content before sending to LLM */
63
+ transformPageContent?: (content: string) => Promise<string> | string;
64
+
65
+ /** Lifecycle hooks */
66
+ onBeforeStep?: (agent: unknown, stepCount: number) => Promise<void> | void;
67
+ onAfterStep?: (agent: unknown, history: unknown[]) => Promise<void> | void;
68
+ onBeforeTask?: (agent: unknown) => Promise<void> | void;
69
+ onAfterTask?: (agent: unknown, result: PageAgentExecutionResult) => Promise<void> | void;
70
+ onDispose?: (agent: unknown, reason?: string) => void;
71
+
72
+ /** Browser profile to use */
73
+ profile?: string;
74
+
75
+ /** Base URL for browser service */
76
+ browserBaseUrl?: string;
77
+ }
78
+
79
+ export interface PageAgentStep {
80
+ stepNumber: number;
81
+ reflection: {
82
+ evaluation?: string;
83
+ memory?: string;
84
+ nextGoal?: string;
85
+ };
86
+ action: {
87
+ name: string;
88
+ input: unknown;
89
+ output: string;
90
+ };
91
+ timestamp: number;
92
+ usage?: {
93
+ promptTokens: number;
94
+ completionTokens: number;
95
+ totalTokens: number;
96
+ };
97
+ }
98
+
99
+ export interface PageAgentExecutionResult {
100
+ success: boolean;
101
+ data: string;
102
+ history: AgentHistoryEvent[];
103
+ steps?: PageAgentStep[];
104
+ totalSteps?: number;
105
+ duration?: number;
106
+ error?: string;
107
+ }
108
+
109
+ export interface AgentHistoryEvent {
110
+ type: 'step' | 'observation' | 'error';
111
+ content?: string;
112
+ step?: PageAgentStep;
113
+ error?: string;
114
+ }
115
+
116
+ export interface BrowserState {
117
+ url: string;
118
+ title: string;
119
+ content: string;
120
+ snapshot?: string;
121
+ }
122
+
123
+ export interface ToolContext {
124
+ browserBaseUrl?: string;
125
+ profile?: string;
126
+ targetId?: string;
127
+ }
128
+
129
+ export interface AgentActivity {
130
+ type: 'thinking' | 'executing' | 'executed' | 'retrying' | 'error';
131
+ tool?: string;
132
+ input?: unknown;
133
+ output?: unknown;
134
+ duration?: number;
135
+ attempt?: number;
136
+ maxAttempts?: number;
137
+ message?: string;
138
+ }
139
+
140
+ // Additional types needed for PageAgentService
141
+ export type AgentStatus = 'idle' | 'running' | 'completed' | 'error';
142
+
143
+ export interface AgentReflection {
144
+ evaluation_previous_goal?: string;
145
+ memory?: string;
146
+ next_goal?: string;
147
+ }
148
+
149
+ export interface AgentAction {
150
+ name: string;
151
+ input: unknown;
152
+ output: unknown;
153
+ }
154
+
155
+ export interface AgentStepEvent {
156
+ type: 'step';
157
+ stepIndex: number;
158
+ reflection: Partial<AgentReflection>;
159
+ action: AgentAction;
160
+ usage?: {
161
+ promptTokens: number;
162
+ completionTokens: number;
163
+ totalTokens: number;
164
+ };
165
+ rawResponse?: string;
166
+ rawRequest?: string;
167
+ }
168
+
169
+ export interface ObservationEvent {
170
+ type: 'observation';
171
+ content: string;
172
+ }
173
+
174
+ export interface ErrorEvent {
175
+ type: 'error';
176
+ message: string;
177
+ rawResponse?: unknown;
178
+ }
179
+
180
+ export type HistoricalEvent = AgentStepEvent | ObservationEvent | ErrorEvent;
181
+
182
+ export interface ExecutionResult {
183
+ success: boolean;
184
+ data: string;
185
+ history: HistoricalEvent[];
186
+ }
187
+
188
+ export interface MacroToolInput {
189
+ evaluation_previous_goal?: string;
190
+ memory?: string;
191
+ next_goal?: string;
192
+ action: Record<string, unknown>;
193
+ }
194
+
195
+ export interface MacroToolResult {
196
+ input: MacroToolInput;
197
+ output: unknown;
198
+ }
@@ -0,0 +1,101 @@
1
+ # Template Plugin for PoolBot
2
+
3
+ Starter template for creating custom PoolBot plugins.
4
+
5
+ ## Structure
6
+
7
+ ```
8
+ extensions/template/
9
+ ├── package.json # npm manifest
10
+ ├── poolbot.plugin.json # Plugin manifest (required)
11
+ ├── index.ts # Entry point (root level)
12
+ └── README.md # Documentation
13
+ ```
14
+
15
+ ## Installation
16
+
17
+ The plugin loads automatically when:
18
+ - Directory is in `extensions/template/`
19
+ - `package.json` has `poolbot.extensions` configured
20
+ - `poolbot.plugin.json` exists in plugin root
21
+
22
+ ## Configuration
23
+
24
+ The plugin uses an empty schema (`configSchema` with `additionalProperties: false`), meaning no initial configuration is required.
25
+
26
+ To add settings, update `poolbot.plugin.json`:
27
+
28
+ ```json
29
+ {
30
+ "id": "template",
31
+ "name": "Template",
32
+ "description": "My custom PoolBot plugin.",
33
+ "configSchema": {
34
+ "type": "object",
35
+ "properties": {
36
+ "apiKey": { "type": "string" },
37
+ "endpoint": { "type": "string", "default": "https://api.example.com" }
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ## Development
44
+
45
+ ### Extension Types
46
+
47
+ PoolBot supports 4 extension types via `PoolBotPluginApi`:
48
+
49
+ 1. **Tool** - Add agent tools (`api.registerTool()`)
50
+ 2. **Provider** - Add custom LLM models (`api.registerProvider()`)
51
+ 3. **Channel** - Add messaging channels (`api.registerChannel()`)
52
+ 4. **Hook** - Intercept lifecycle events (`api.registerHook()`)
53
+
54
+ ### Example: Registering a Tool
55
+
56
+ ```typescript
57
+ import type { PoolBotPluginApi } from "../../src/plugins/types.js";
58
+ import type { AgentToolResult } from "@mariozechner/pi-agent-core";
59
+
60
+ export default function register(api: PoolBotPluginApi) {
61
+ api.registerTool({
62
+ label: "My Search", // Display name for the tool
63
+ name: "my_search", // Tool identifier (snake_case)
64
+ description: "Search using custom API",
65
+ parameters: {
66
+ type: "object",
67
+ properties: {
68
+ query: { type: "string" }
69
+ },
70
+ required: ["query"]
71
+ },
72
+ async execute(_toolCallId, params): Promise<AgentToolResult<unknown>> {
73
+ const { query } = params as { query: string };
74
+ // Implementation here
75
+ return {
76
+ content: [{ type: "text", text: JSON.stringify({ results: [] }) }],
77
+ details: { query }
78
+ };
79
+ }
80
+ });
81
+ }
82
+ ```
83
+
84
+ ## Troubleshooting
85
+
86
+ ### "plugin manifest not found"
87
+ - Check if `poolbot.plugin.json` exists in plugin root
88
+ - Verify JSON is valid
89
+
90
+ ### "extension entry escapes package directory"
91
+ - Entry point in `package.json` must use relative path: `"./index.ts"`
92
+ - File must be inside plugin directory
93
+
94
+ ### TypeScript Errors
95
+ - Use `import type { PoolBotPluginApi } from "../../src/plugins/types.js"`
96
+ - Note the capital `B` in `PoolBotPluginApi`
97
+
98
+ ## References
99
+
100
+ - [Plugin SDK Documentation](../../docs/refactor/plugin-sdk.md)
101
+ - [Example Plugins](../lobster/, ../llm-task/, etc.)