@poolzin/pool-bot 2026.3.13 → 2026.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/dist/agents/checkpoint-manager.js +291 -0
  3. package/dist/agents/poolbot-tools.js +5 -0
  4. package/dist/agents/subagent-announce-reliability.js +160 -0
  5. package/dist/agents/tool-result-truncation.js +299 -0
  6. package/dist/agents/tools/nodes-file-tool.js +197 -0
  7. package/dist/build-info.json +3 -3
  8. package/dist/cli/config-cli.js +60 -0
  9. package/dist/cron/cron-improvements.js +195 -0
  10. package/dist/discord/discord-improvements.js +167 -0
  11. package/dist/gateway/auth-rate-limit.js +19 -0
  12. package/dist/gateway/auth.js +41 -0
  13. package/dist/gateway/gateway-improvements.js +294 -0
  14. package/dist/gateway/node-command-policy.js +7 -2
  15. package/dist/infra/net/ssrf.js +15 -2
  16. package/dist/infra/shell-security.js +201 -0
  17. package/dist/memory/memory-improvements.js +239 -0
  18. package/dist/node-host/runner.js +146 -79
  19. package/dist/security/prototype-pollution.js +141 -0
  20. package/dist/security/webhook-security.js +253 -0
  21. package/dist/shared/net/ip.js +52 -1
  22. package/dist/slack/slack-improvements.js +225 -0
  23. package/dist/telegram/telegram-improvements.js +220 -0
  24. package/dist/ui-plugins/ui-plugins-improvements.js +191 -0
  25. package/docs/ANALISE_OPENCLAW_PROFISSIONAL.md +520 -0
  26. package/docs/competitive-analysis.md +421 -0
  27. package/docs/implementation-analysis.md +393 -0
  28. package/docs/plans/2026-03-11-file-operations-security-hardening.md +307 -0
  29. package/docs/plans/2026-03-11-integracao-projetos-poolbot.md +666 -0
  30. package/extensions/agency-agents/README.md +301 -0
  31. package/extensions/agency-agents/agents/CONTRIBUTING.md +353 -0
  32. package/extensions/agency-agents/agents/README.md +602 -0
  33. package/extensions/agency-agents/agents/design/design-brand-guardian.md +320 -0
  34. package/extensions/agency-agents/agents/design/design-image-prompt-engineer.md +234 -0
  35. package/extensions/agency-agents/agents/design/design-ui-designer.md +381 -0
  36. package/extensions/agency-agents/agents/design/design-ux-architect.md +467 -0
  37. package/extensions/agency-agents/agents/design/design-ux-researcher.md +327 -0
  38. package/extensions/agency-agents/agents/design/design-visual-storyteller.md +147 -0
  39. package/extensions/agency-agents/agents/design/design-whimsy-injector.md +436 -0
  40. package/extensions/agency-agents/agents/engineering/engineering-ai-engineer.md +144 -0
  41. package/extensions/agency-agents/agents/engineering/engineering-backend-architect.md +233 -0
  42. package/extensions/agency-agents/agents/engineering/engineering-devops-automator.md +374 -0
  43. package/extensions/agency-agents/agents/engineering/engineering-frontend-developer.md +223 -0
  44. package/extensions/agency-agents/agents/engineering/engineering-mobile-app-builder.md +491 -0
  45. package/extensions/agency-agents/agents/engineering/engineering-rapid-prototyper.md +460 -0
  46. package/extensions/agency-agents/agents/engineering/engineering-security-engineer.md +275 -0
  47. package/extensions/agency-agents/agents/engineering/engineering-senior-developer.md +174 -0
  48. package/extensions/agency-agents/agents/examples/README.md +48 -0
  49. package/extensions/agency-agents/agents/examples/nexus-spatial-discovery.md +852 -0
  50. package/extensions/agency-agents/agents/examples/workflow-landing-page.md +119 -0
  51. package/extensions/agency-agents/agents/examples/workflow-startup-mvp.md +155 -0
  52. package/extensions/agency-agents/agents/integrations/README.md +117 -0
  53. package/extensions/agency-agents/agents/integrations/aider/README.md +38 -0
  54. package/extensions/agency-agents/agents/integrations/antigravity/README.md +49 -0
  55. package/extensions/agency-agents/agents/integrations/claude-code/README.md +31 -0
  56. package/extensions/agency-agents/agents/integrations/cursor/README.md +38 -0
  57. package/extensions/agency-agents/agents/integrations/gemini-cli/README.md +36 -0
  58. package/extensions/agency-agents/agents/integrations/opencode/README.md +58 -0
  59. package/extensions/agency-agents/agents/integrations/windsurf/README.md +26 -0
  60. package/extensions/agency-agents/agents/marketing/marketing-app-store-optimizer.md +319 -0
  61. package/extensions/agency-agents/agents/marketing/marketing-content-creator.md +52 -0
  62. package/extensions/agency-agents/agents/marketing/marketing-growth-hacker.md +52 -0
  63. package/extensions/agency-agents/agents/marketing/marketing-instagram-curator.md +111 -0
  64. package/extensions/agency-agents/agents/marketing/marketing-reddit-community-builder.md +121 -0
  65. package/extensions/agency-agents/agents/marketing/marketing-social-media-strategist.md +123 -0
  66. package/extensions/agency-agents/agents/marketing/marketing-tiktok-strategist.md +123 -0
  67. package/extensions/agency-agents/agents/marketing/marketing-twitter-engager.md +124 -0
  68. package/extensions/agency-agents/agents/marketing/marketing-wechat-official-account.md +143 -0
  69. package/extensions/agency-agents/agents/marketing/marketing-xiaohongshu-specialist.md +136 -0
  70. package/extensions/agency-agents/agents/marketing/marketing-zhihu-strategist.md +160 -0
  71. package/extensions/agency-agents/agents/product/product-feedback-synthesizer.md +117 -0
  72. package/extensions/agency-agents/agents/product/product-sprint-prioritizer.md +152 -0
  73. package/extensions/agency-agents/agents/product/product-trend-researcher.md +157 -0
  74. package/extensions/agency-agents/agents/project-management/project-management-experiment-tracker.md +196 -0
  75. package/extensions/agency-agents/agents/project-management/project-management-project-shepherd.md +192 -0
  76. package/extensions/agency-agents/agents/project-management/project-management-studio-operations.md +198 -0
  77. package/extensions/agency-agents/agents/project-management/project-management-studio-producer.md +201 -0
  78. package/extensions/agency-agents/agents/project-management/project-manager-senior.md +133 -0
  79. package/extensions/agency-agents/agents/scripts/convert.sh +362 -0
  80. package/extensions/agency-agents/agents/scripts/install.sh +465 -0
  81. package/extensions/agency-agents/agents/scripts/lint-agents.sh +115 -0
  82. package/extensions/agency-agents/agents/spatial-computing/macos-spatial-metal-engineer.md +335 -0
  83. package/extensions/agency-agents/agents/spatial-computing/terminal-integration-specialist.md +68 -0
  84. package/extensions/agency-agents/agents/spatial-computing/visionos-spatial-engineer.md +52 -0
  85. package/extensions/agency-agents/agents/spatial-computing/xr-cockpit-interaction-specialist.md +30 -0
  86. package/extensions/agency-agents/agents/spatial-computing/xr-immersive-developer.md +30 -0
  87. package/extensions/agency-agents/agents/spatial-computing/xr-interface-architect.md +30 -0
  88. package/extensions/agency-agents/agents/specialized/agentic-identity-trust.md +367 -0
  89. package/extensions/agency-agents/agents/specialized/agents-orchestrator.md +365 -0
  90. package/extensions/agency-agents/agents/specialized/data-analytics-reporter.md +52 -0
  91. package/extensions/agency-agents/agents/specialized/data-consolidation-agent.md +58 -0
  92. package/extensions/agency-agents/agents/specialized/lsp-index-engineer.md +312 -0
  93. package/extensions/agency-agents/agents/specialized/report-distribution-agent.md +63 -0
  94. package/extensions/agency-agents/agents/specialized/sales-data-extraction-agent.md +65 -0
  95. package/extensions/agency-agents/agents/strategy/EXECUTIVE-BRIEF.md +95 -0
  96. package/extensions/agency-agents/agents/strategy/QUICKSTART.md +194 -0
  97. package/extensions/agency-agents/agents/strategy/coordination/agent-activation-prompts.md +401 -0
  98. package/extensions/agency-agents/agents/strategy/coordination/handoff-templates.md +357 -0
  99. package/extensions/agency-agents/agents/strategy/nexus-strategy.md +1110 -0
  100. package/extensions/agency-agents/agents/strategy/playbooks/phase-0-discovery.md +178 -0
  101. package/extensions/agency-agents/agents/strategy/playbooks/phase-1-strategy.md +238 -0
  102. package/extensions/agency-agents/agents/strategy/playbooks/phase-2-foundation.md +278 -0
  103. package/extensions/agency-agents/agents/strategy/playbooks/phase-3-build.md +286 -0
  104. package/extensions/agency-agents/agents/strategy/playbooks/phase-4-hardening.md +332 -0
  105. package/extensions/agency-agents/agents/strategy/playbooks/phase-5-launch.md +277 -0
  106. package/extensions/agency-agents/agents/strategy/playbooks/phase-6-operate.md +318 -0
  107. package/extensions/agency-agents/agents/strategy/runbooks/scenario-enterprise-feature.md +157 -0
  108. package/extensions/agency-agents/agents/strategy/runbooks/scenario-incident-response.md +217 -0
  109. package/extensions/agency-agents/agents/strategy/runbooks/scenario-marketing-campaign.md +187 -0
  110. package/extensions/agency-agents/agents/strategy/runbooks/scenario-startup-mvp.md +154 -0
  111. package/extensions/agency-agents/agents/support/support-analytics-reporter.md +363 -0
  112. package/extensions/agency-agents/agents/support/support-executive-summary-generator.md +210 -0
  113. package/extensions/agency-agents/agents/support/support-finance-tracker.md +440 -0
  114. package/extensions/agency-agents/agents/support/support-infrastructure-maintainer.md +616 -0
  115. package/extensions/agency-agents/agents/support/support-legal-compliance-checker.md +586 -0
  116. package/extensions/agency-agents/agents/support/support-support-responder.md +583 -0
  117. package/extensions/agency-agents/agents/testing/testing-accessibility-auditor.md +313 -0
  118. package/extensions/agency-agents/agents/testing/testing-api-tester.md +304 -0
  119. package/extensions/agency-agents/agents/testing/testing-evidence-collector.md +208 -0
  120. package/extensions/agency-agents/agents/testing/testing-performance-benchmarker.md +266 -0
  121. package/extensions/agency-agents/agents/testing/testing-reality-checker.md +236 -0
  122. package/extensions/agency-agents/agents/testing/testing-test-results-analyzer.md +303 -0
  123. package/extensions/agency-agents/agents/testing/testing-tool-evaluator.md +392 -0
  124. package/extensions/agency-agents/agents/testing/testing-workflow-optimizer.md +448 -0
  125. package/extensions/agency-agents/index.ts +733 -0
  126. package/extensions/agency-agents/node_modules/.bin/jiti +21 -0
  127. package/extensions/agency-agents/node_modules/.bin/tsc +21 -0
  128. package/extensions/agency-agents/node_modules/.bin/tsserver +21 -0
  129. package/extensions/agency-agents/node_modules/.bin/tsx +21 -0
  130. package/extensions/agency-agents/node_modules/.bin/vite +21 -0
  131. package/extensions/agency-agents/node_modules/.bin/vitest +21 -0
  132. package/extensions/agency-agents/node_modules/.bin/yaml +21 -0
  133. package/extensions/agency-agents/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  134. package/extensions/agency-agents/package.json +25 -0
  135. package/extensions/agency-agents/poolbot.plugin.json +11 -0
  136. package/extensions/agency-agents/src/AgencyAgentsService.test.ts +443 -0
  137. package/extensions/agency-agents/src/AgencyAgentsService.ts +288 -0
  138. package/extensions/agency-agents/src/types.ts +147 -0
  139. package/extensions/agency-agents/vitest.config.ts +8 -0
  140. package/extensions/hexstrike-ai/README.md +98 -0
  141. package/extensions/hexstrike-ai/node_modules/.bin/tsc +21 -0
  142. package/extensions/hexstrike-ai/node_modules/.bin/tsserver +21 -0
  143. package/extensions/hexstrike-ai/package.json +29 -0
  144. package/extensions/hexstrike-ai/poolbot.plugin.json +31 -0
  145. package/extensions/hexstrike-ai/src/client.ts +91 -0
  146. package/extensions/hexstrike-ai/src/index.ts +170 -0
  147. package/extensions/hexstrike-ai/src/server/hexstrike_mcp.py +5470 -0
  148. package/extensions/hexstrike-ai/src/server/hexstrike_server.py +17289 -0
  149. package/extensions/hexstrike-ai/src/server/requirements.txt +84 -0
  150. package/extensions/hexstrike-ai/src/server-manager.ts +83 -0
  151. package/extensions/hexstrike-ai/tsconfig.json +20 -0
  152. package/extensions/page-agent/README.md +159 -0
  153. package/extensions/page-agent/index.ts +595 -0
  154. package/extensions/page-agent/node_modules/.bin/jiti +21 -0
  155. package/extensions/page-agent/node_modules/.bin/playwright +21 -0
  156. package/extensions/page-agent/node_modules/.bin/tsc +21 -0
  157. package/extensions/page-agent/node_modules/.bin/tsserver +21 -0
  158. package/extensions/page-agent/node_modules/.bin/tsx +21 -0
  159. package/extensions/page-agent/node_modules/.bin/vitest +21 -0
  160. package/extensions/page-agent/node_modules/.bin/yaml +21 -0
  161. package/extensions/page-agent/package.json +43 -0
  162. package/extensions/page-agent/poolbot.plugin.json +24 -0
  163. package/extensions/page-agent/src/PageAgentService.test.ts +517 -0
  164. package/extensions/page-agent/src/PageAgentService.ts +636 -0
  165. package/extensions/page-agent/src/PoolBotPageController.test.ts +358 -0
  166. package/extensions/page-agent/src/PoolBotPageController.ts +245 -0
  167. package/extensions/page-agent/src/index.ts +20 -0
  168. package/extensions/page-agent/src/tools.test.ts +231 -0
  169. package/extensions/page-agent/src/tools.ts +167 -0
  170. package/extensions/page-agent/src/types.ts +198 -0
  171. package/extensions/xyops/README.md +227 -0
  172. package/extensions/xyops/index.ts +342 -0
  173. package/extensions/xyops/node_modules/.bin/jiti +21 -0
  174. package/extensions/xyops/node_modules/.bin/tsc +21 -0
  175. package/extensions/xyops/node_modules/.bin/tsserver +21 -0
  176. package/extensions/xyops/node_modules/.bin/tsx +21 -0
  177. package/extensions/xyops/node_modules/.bin/vitest +21 -0
  178. package/extensions/xyops/node_modules/.bin/yaml +21 -0
  179. package/extensions/xyops/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  180. package/extensions/xyops/package.json +39 -0
  181. package/extensions/xyops/poolbot.plugin.json +21 -0
  182. package/extensions/xyops/src/client.test.ts +467 -0
  183. package/extensions/xyops/src/client.ts +157 -0
  184. package/extensions/xyops/src/types.ts +147 -0
  185. package/extensions/xyops/vitest.config.ts +8 -0
  186. package/package.json +1 -1
@@ -0,0 +1,595 @@
1
+ /**
2
+ * Page Agent Plugin for PoolBot
3
+ *
4
+ * Professional integration of Page Agent browser automation capabilities
5
+ * into PoolBot's native infrastructure.
6
+ */
7
+
8
+ import { Type } from '@sinclair/typebox'
9
+ import type { PoolBotPluginDefinition, PoolBotPluginApi } from '../../src/plugins/types.js'
10
+ import { PageAgentService } from './src/PageAgentService.js'
11
+ import { PoolBotPageController } from './src/PoolBotPageController.js'
12
+ import type { PageAgentConfig, PageAgentExecutionResult } from './src/types.js'
13
+
14
+ // Tool schemas
15
+ const PageAgentExecuteSchema = Type.Object({
16
+ instruction: Type.String({
17
+ description: 'Natural language instruction for the browser automation task',
18
+ }),
19
+ url: Type.Optional(
20
+ Type.String({ description: 'Starting URL to navigate to' })
21
+ ),
22
+ maxSteps: Type.Optional(
23
+ Type.Number({
24
+ description: 'Maximum number of steps to perform',
25
+ default: 40,
26
+ minimum: 1,
27
+ maximum: 100,
28
+ })
29
+ ),
30
+ headless: Type.Optional(
31
+ Type.Boolean({
32
+ description: 'Run browser in headless mode',
33
+ default: true,
34
+ })
35
+ ),
36
+ })
37
+
38
+ const PageAgentNavigateSchema = Type.Object({
39
+ url: Type.String({ description: 'URL to navigate to' }),
40
+ waitUntil: Type.Optional(
41
+ Type.Union(
42
+ [
43
+ Type.Literal('load'),
44
+ Type.Literal('domcontentloaded'),
45
+ Type.Literal('networkidle'),
46
+ ],
47
+ { description: 'When to consider navigation complete', default: 'load' }
48
+ )
49
+ ),
50
+ })
51
+
52
+ const PageAgentClickSchema = Type.Object({
53
+ ref: Type.String({
54
+ description: 'Element reference ID from page snapshot',
55
+ }),
56
+ })
57
+
58
+ const PageAgentTypeSchema = Type.Object({
59
+ ref: Type.String({ description: 'Element reference ID' }),
60
+ text: Type.String({ description: 'Text to type' }),
61
+ submit: Type.Optional(
62
+ Type.Boolean({
63
+ description: 'Press Enter after typing',
64
+ default: false,
65
+ })
66
+ ),
67
+ })
68
+
69
+ const PageAgentScrollSchema = Type.Object({
70
+ direction: Type.Union([Type.Literal('up'), Type.Literal('down')], {
71
+ description: 'Scroll direction',
72
+ }),
73
+ amount: Type.Optional(
74
+ Type.Number({
75
+ description: 'Pixels to scroll (default: 500)',
76
+ default: 500,
77
+ minimum: 100,
78
+ maximum: 5000,
79
+ })
80
+ ),
81
+ })
82
+
83
+ const PageAgentScreenshotSchema = Type.Object({
84
+ fullPage: Type.Optional(
85
+ Type.Boolean({
86
+ description: 'Capture full page or just viewport',
87
+ default: false,
88
+ })
89
+ ),
90
+ })
91
+
92
+ const plugin: PoolBotPluginDefinition = {
93
+ id: 'page-agent',
94
+ name: 'Page Agent',
95
+ description:
96
+ 'AI-powered browser automation for complex web interactions using natural language',
97
+
98
+ async register(api: PoolBotPluginApi) {
99
+ api.logger.info('[page-agent] Registering Page Agent plugin...')
100
+
101
+ // Get configuration from PoolBot config system
102
+ const pluginCfg = (api.pluginConfig ?? {}) as Partial<PageAgentConfig>
103
+ const config: PageAgentConfig = {
104
+ maxSteps: pluginCfg.maxSteps ?? 40,
105
+ language: pluginCfg.language ?? 'en-US',
106
+ llm: pluginCfg.llm ?? {
107
+ provider: 'openai',
108
+ model: 'gpt-4o',
109
+ apiKey: process.env.OPENAI_API_KEY || '',
110
+ baseURL: 'https://api.openai.com/v1',
111
+ temperature: 0.7,
112
+ },
113
+ browserBaseUrl: pluginCfg.browserBaseUrl ?? 'http://localhost:3000',
114
+ profile: pluginCfg.profile,
115
+ }
116
+
117
+ // Track active agents
118
+ const activeAgents = new Map<string, PageAgentService>()
119
+ const activeControllers = new Map<string, PoolBotPageController>()
120
+
121
+ /**
122
+ * Main Page Agent execution tool
123
+ * Uses the ReAct agent loop to complete complex browser tasks
124
+ */
125
+ api.registerTool({
126
+ name: 'page_agent_execute',
127
+ label: 'Page Agent Execute',
128
+ description:
129
+ 'Execute complex browser automation tasks using natural language. The AI agent can navigate, interact with forms, extract data, and perform multi-step workflows autonomously.',
130
+ parameters: PageAgentExecuteSchema,
131
+ async execute(_toolCallId, args) {
132
+ const agentId = `pageagent_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`
133
+
134
+ try {
135
+ // Create controller using PoolBot's browser client
136
+ const controller = new PoolBotPageController({
137
+ browserBaseUrl: config.browserBaseUrl,
138
+ profile: config.profile,
139
+ })
140
+ activeControllers.set(agentId, controller)
141
+
142
+ // Navigate to starting URL if provided
143
+ if (args.url) {
144
+ await controller.navigate(args.url as string)
145
+ }
146
+
147
+ // Create and configure the agent service
148
+ const agentConfig: PageAgentConfig = {
149
+ ...config,
150
+ maxSteps: (args.maxSteps as number) ?? config.maxSteps,
151
+ }
152
+
153
+ const agent = new PageAgentService(agentConfig, controller)
154
+ activeAgents.set(agentId, agent)
155
+
156
+ // Set up event listeners for monitoring
157
+ agent.addEventListener('statuschange', () => {
158
+ api.logger.debug?.(`[page-agent:${agentId}] Status: ${agent.status}`)
159
+ })
160
+
161
+ agent.addEventListener('activity', ((e: CustomEvent) => {
162
+ const activity = e.detail
163
+ api.logger.debug?.(`[page-agent:${agentId}] Activity: ${JSON.stringify(activity)}`)
164
+ }) as EventListener)
165
+
166
+ // Execute the task
167
+ const result: PageAgentExecutionResult = await agent.execute(
168
+ args.instruction as string
169
+ )
170
+
171
+ // Cleanup
172
+ agent.dispose()
173
+ activeAgents.delete(agentId)
174
+ activeControllers.delete(agentId)
175
+
176
+ return {
177
+ content: [
178
+ {
179
+ type: 'text',
180
+ text: JSON.stringify(
181
+ {
182
+ success: result.success,
183
+ agentId,
184
+ task: args.instruction,
185
+ totalSteps: result.totalSteps,
186
+ duration: result.duration,
187
+ result: result.data,
188
+ history: result.history.map((h) => ({
189
+ type: h.type,
190
+ ...(h.type === 'step'
191
+ ? {
192
+ step: h.step?.stepNumber,
193
+ action: h.step?.action?.name,
194
+ output: h.step?.action?.output,
195
+ }
196
+ : {}),
197
+ })),
198
+ },
199
+ null,
200
+ 2
201
+ ),
202
+ },
203
+ ],
204
+ details: {
205
+ success: result.success,
206
+ agentId,
207
+ totalSteps: result.totalSteps,
208
+ duration: result.duration,
209
+ result: result.data,
210
+ },
211
+ }
212
+ } catch (error) {
213
+ // Cleanup on error
214
+ const agent = activeAgents.get(agentId)
215
+ if (agent) {
216
+ agent.dispose()
217
+ activeAgents.delete(agentId)
218
+ }
219
+ activeControllers.delete(agentId)
220
+
221
+ const errorMessage =
222
+ error instanceof Error ? error.message : String(error)
223
+ api.logger.error(`[page-agent:${agentId}] Error: ${errorMessage}`)
224
+
225
+ return {
226
+ content: [
227
+ {
228
+ type: 'text',
229
+ text: JSON.stringify(
230
+ {
231
+ success: false,
232
+ agentId,
233
+ error: errorMessage,
234
+ },
235
+ null,
236
+ 2
237
+ ),
238
+ },
239
+ ],
240
+ details: {
241
+ success: false,
242
+ error: errorMessage,
243
+ },
244
+ }
245
+ }
246
+ },
247
+ })
248
+
249
+ /**
250
+ * Direct browser control tools for simpler operations
251
+ */
252
+ api.registerTool({
253
+ name: 'page_agent_navigate',
254
+ label: 'Page Agent Navigate',
255
+ description: 'Navigate to a URL and get the page state',
256
+ parameters: PageAgentNavigateSchema,
257
+ async execute(_toolCallId, args) {
258
+ try {
259
+ const controller = new PoolBotPageController({
260
+ browserBaseUrl: config.browserBaseUrl,
261
+ profile: config.profile,
262
+ })
263
+
264
+ const result = await controller.navigate(args.url as string)
265
+ const state = await controller.getBrowserState()
266
+
267
+ return {
268
+ content: [
269
+ {
270
+ type: 'text',
271
+ text: JSON.stringify(
272
+ {
273
+ success: result.success,
274
+ url: state.url,
275
+ title: state.title,
276
+ message: result.message,
277
+ },
278
+ null,
279
+ 2
280
+ ),
281
+ },
282
+ ],
283
+ details: {
284
+ success: result.success,
285
+ state,
286
+ },
287
+ }
288
+ } catch (error) {
289
+ const errorMessage =
290
+ error instanceof Error ? error.message : String(error)
291
+ return {
292
+ content: [
293
+ {
294
+ type: 'text',
295
+ text: JSON.stringify(
296
+ { success: false, error: errorMessage },
297
+ null,
298
+ 2
299
+ ),
300
+ },
301
+ ],
302
+ details: { success: false, error: errorMessage },
303
+ }
304
+ }
305
+ },
306
+ })
307
+
308
+ api.registerTool({
309
+ name: 'page_agent_click',
310
+ label: 'Page Agent Click',
311
+ description: 'Click on an element by its reference ID',
312
+ parameters: PageAgentClickSchema,
313
+ async execute(_toolCallId, args) {
314
+ try {
315
+ const controller = new PoolBotPageController({
316
+ browserBaseUrl: config.browserBaseUrl,
317
+ profile: config.profile,
318
+ })
319
+
320
+ const result = await controller.clickElement(args.ref as string)
321
+
322
+ return {
323
+ content: [
324
+ {
325
+ type: 'text',
326
+ text: JSON.stringify(
327
+ {
328
+ success: result.success,
329
+ ref: args.ref,
330
+ message: result.message,
331
+ },
332
+ null,
333
+ 2
334
+ ),
335
+ },
336
+ ],
337
+ details: result,
338
+ }
339
+ } catch (error) {
340
+ const errorMessage =
341
+ error instanceof Error ? error.message : String(error)
342
+ return {
343
+ content: [
344
+ {
345
+ type: 'text',
346
+ text: JSON.stringify(
347
+ { success: false, error: errorMessage },
348
+ null,
349
+ 2
350
+ ),
351
+ },
352
+ ],
353
+ details: { success: false, error: errorMessage },
354
+ }
355
+ }
356
+ },
357
+ })
358
+
359
+ api.registerTool({
360
+ name: 'page_agent_type',
361
+ label: 'Page Agent Type',
362
+ description: 'Type text into an input element',
363
+ parameters: PageAgentTypeSchema,
364
+ async execute(_toolCallId, args) {
365
+ try {
366
+ const controller = new PoolBotPageController({
367
+ browserBaseUrl: config.browserBaseUrl,
368
+ profile: config.profile,
369
+ })
370
+
371
+ const result = await controller.inputText(
372
+ args.ref as string,
373
+ args.text as string
374
+ )
375
+
376
+ return {
377
+ content: [
378
+ {
379
+ type: 'text',
380
+ text: JSON.stringify(
381
+ {
382
+ success: result.success,
383
+ ref: args.ref,
384
+ text: args.text,
385
+ message: result.message,
386
+ },
387
+ null,
388
+ 2
389
+ ),
390
+ },
391
+ ],
392
+ details: result,
393
+ }
394
+ } catch (error) {
395
+ const errorMessage =
396
+ error instanceof Error ? error.message : String(error)
397
+ return {
398
+ content: [
399
+ {
400
+ type: 'text',
401
+ text: JSON.stringify(
402
+ { success: false, error: errorMessage },
403
+ null,
404
+ 2
405
+ ),
406
+ },
407
+ ],
408
+ details: { success: false, error: errorMessage },
409
+ }
410
+ }
411
+ },
412
+ })
413
+
414
+ api.registerTool({
415
+ name: 'page_agent_scroll',
416
+ label: 'Page Agent Scroll',
417
+ description: 'Scroll the page up or down',
418
+ parameters: PageAgentScrollSchema,
419
+ async execute(_toolCallId, args) {
420
+ try {
421
+ const controller = new PoolBotPageController({
422
+ browserBaseUrl: config.browserBaseUrl,
423
+ profile: config.profile,
424
+ })
425
+
426
+ const result = await controller.scroll({
427
+ down: args.direction === 'down',
428
+ amount: args.amount as number | undefined,
429
+ })
430
+
431
+ return {
432
+ content: [
433
+ {
434
+ type: 'text',
435
+ text: JSON.stringify(
436
+ {
437
+ success: result.success,
438
+ direction: args.direction,
439
+ amount: args.amount,
440
+ message: result.message,
441
+ },
442
+ null,
443
+ 2
444
+ ),
445
+ },
446
+ ],
447
+ details: result,
448
+ }
449
+ } catch (error) {
450
+ const errorMessage =
451
+ error instanceof Error ? error.message : String(error)
452
+ return {
453
+ content: [
454
+ {
455
+ type: 'text',
456
+ text: JSON.stringify(
457
+ { success: false, error: errorMessage },
458
+ null,
459
+ 2
460
+ ),
461
+ },
462
+ ],
463
+ details: { success: false, error: errorMessage },
464
+ }
465
+ }
466
+ },
467
+ })
468
+
469
+ api.registerTool({
470
+ name: 'page_agent_screenshot',
471
+ label: 'Page Agent Screenshot',
472
+ description: 'Take a screenshot of the current page',
473
+ parameters: PageAgentScreenshotSchema,
474
+ async execute(_toolCallId, args) {
475
+ try {
476
+ const controller = new PoolBotPageController({
477
+ browserBaseUrl: config.browserBaseUrl,
478
+ profile: config.profile,
479
+ })
480
+
481
+ const result = await controller.screenshot({
482
+ fullPage: args.fullPage as boolean | undefined,
483
+ })
484
+
485
+ return {
486
+ content: [
487
+ {
488
+ type: 'text',
489
+ text: JSON.stringify(
490
+ {
491
+ success: result.success,
492
+ fullPage: args.fullPage,
493
+ base64Length: result.base64?.length,
494
+ message: result.message,
495
+ },
496
+ null,
497
+ 2
498
+ ),
499
+ },
500
+ ...(result.base64
501
+ ? [
502
+ {
503
+ type: 'image' as const,
504
+ data: result.base64,
505
+ mimeType: 'image/png' as const,
506
+ },
507
+ ]
508
+ : []),
509
+ ],
510
+ details: {
511
+ success: result.success,
512
+ hasImage: !!result.base64,
513
+ },
514
+ }
515
+ } catch (error) {
516
+ const errorMessage =
517
+ error instanceof Error ? error.message : String(error)
518
+ return {
519
+ content: [
520
+ {
521
+ type: 'text',
522
+ text: JSON.stringify(
523
+ { success: false, error: errorMessage },
524
+ null,
525
+ 2
526
+ ),
527
+ },
528
+ ],
529
+ details: { success: false, error: errorMessage },
530
+ }
531
+ }
532
+ },
533
+ })
534
+
535
+ /**
536
+ * Gateway methods for external control
537
+ */
538
+ api.registerGatewayMethod('pageagent.status', async ({ respond }) => {
539
+ respond(true, {
540
+ activeAgents: activeAgents.size,
541
+ agentIds: Array.from(activeAgents.keys()),
542
+ config: {
543
+ browserBaseUrl: config.browserBaseUrl,
544
+ profile: config.profile,
545
+ maxSteps: config.maxSteps,
546
+ },
547
+ })
548
+ })
549
+
550
+ api.registerGatewayMethod(
551
+ 'pageagent.terminate',
552
+ async ({ params, respond }) => {
553
+ const agentId = (params as { agentId?: string })?.agentId
554
+
555
+ if (!agentId) {
556
+ respond(false, { error: 'agentId is required' })
557
+ return
558
+ }
559
+
560
+ const agent = activeAgents.get(agentId)
561
+
562
+ if (!agent) {
563
+ respond(false, { error: 'Agent not found' })
564
+ return
565
+ }
566
+
567
+ agent.stop()
568
+ agent.dispose()
569
+ activeAgents.delete(agentId)
570
+ activeControllers.delete(agentId)
571
+
572
+ respond(true, { terminated: true })
573
+ }
574
+ )
575
+
576
+ api.registerGatewayMethod('pageagent.list', async ({ respond }) => {
577
+ respond(
578
+ true,
579
+ Array.from(activeAgents.entries()).map(([id, agent]) => ({
580
+ id,
581
+ status: agent.status,
582
+ task: agent.task,
583
+ currentStep: agent.history.filter((h) => h.type === 'step').length,
584
+ }))
585
+ )
586
+ })
587
+
588
+ api.logger.info('[page-agent] Page Agent plugin registered successfully')
589
+ api.logger.info(
590
+ `[page-agent] Available tools: page_agent_execute, page_agent_navigate, page_agent_click, page_agent_type, page_agent_scroll, page_agent_screenshot`
591
+ )
592
+ },
593
+ }
594
+
595
+ export default plugin
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/jiti@2.6.1/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/jiti@2.6.1/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/jiti-cli.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../../../../node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/jiti-cli.mjs" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/playwright@1.58.0/node_modules/playwright/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/playwright@1.58.0/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/playwright@1.58.0/node_modules/playwright/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/playwright@1.58.0/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../playwright/cli.js" "$@"
19
+ else
20
+ exec node "$basedir/../playwright/cli.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsc" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
21
+ fi