web-agent-bridge 3.0.0 → 3.3.0

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 (202) hide show
  1. package/LICENSE +72 -21
  2. package/README.ar.md +1286 -1073
  3. package/README.md +1764 -1535
  4. package/bin/agent-runner.js +474 -474
  5. package/bin/cli.js +237 -138
  6. package/bin/wab.js +80 -80
  7. package/examples/bidi-agent.js +119 -119
  8. package/examples/cross-site-agent.js +91 -91
  9. package/examples/mcp-agent.js +94 -94
  10. package/examples/next-app-router/README.md +44 -44
  11. package/examples/puppeteer-agent.js +108 -108
  12. package/examples/saas-dashboard/README.md +55 -55
  13. package/examples/shopify-hydrogen/README.md +74 -74
  14. package/examples/vision-agent.js +171 -171
  15. package/examples/wordpress-elementor/README.md +77 -77
  16. package/package.json +17 -3
  17. package/public/.well-known/agent-tools.json +180 -180
  18. package/public/.well-known/ai-assets.json +59 -59
  19. package/public/.well-known/ai-plugin.json +28 -0
  20. package/public/.well-known/security.txt +8 -0
  21. package/public/agent-workspace.html +349 -347
  22. package/public/ai.html +198 -196
  23. package/public/api.html +413 -0
  24. package/public/browser.html +486 -484
  25. package/public/commander-dashboard.html +243 -243
  26. package/public/cookies.html +210 -208
  27. package/public/css/agent-workspace.css +1713 -1713
  28. package/public/css/premium.css +317 -317
  29. package/public/css/styles.css +1235 -1235
  30. package/public/dashboard.html +706 -704
  31. package/public/demo.html +1770 -1
  32. package/public/dns.html +507 -0
  33. package/public/docs.html +587 -585
  34. package/public/feed.xml +89 -89
  35. package/public/growth.html +463 -0
  36. package/public/index.html +341 -9
  37. package/public/integrations.html +556 -0
  38. package/public/js/agent-workspace.js +1740 -1740
  39. package/public/js/auth-nav.js +31 -31
  40. package/public/js/auth-redirect.js +12 -12
  41. package/public/js/cookie-consent.js +56 -56
  42. package/public/js/wab-demo-page.js +721 -721
  43. package/public/js/ws-client.js +74 -74
  44. package/public/llms-full.txt +360 -309
  45. package/public/llms.txt +125 -86
  46. package/public/login.html +85 -83
  47. package/public/mesh-dashboard.html +328 -328
  48. package/public/openapi.json +580 -580
  49. package/public/phone-shield.html +281 -0
  50. package/public/premium-dashboard.html +2489 -2487
  51. package/public/premium.html +793 -791
  52. package/public/privacy.html +297 -295
  53. package/public/register.html +105 -103
  54. package/public/robots.txt +87 -87
  55. package/public/script/wab-consent.d.ts +36 -36
  56. package/public/script/wab-consent.js +104 -104
  57. package/public/script/wab-schema.js +131 -131
  58. package/public/script/wab.d.ts +108 -108
  59. package/public/script/wab.min.js +580 -580
  60. package/public/security.txt +8 -0
  61. package/public/terms.html +256 -254
  62. package/script/ai-agent-bridge.js +1754 -1754
  63. package/sdk/README.md +99 -99
  64. package/sdk/agent-mesh.js +449 -449
  65. package/sdk/commander.js +262 -262
  66. package/sdk/index.d.ts +464 -464
  67. package/sdk/index.js +18 -1
  68. package/sdk/multi-agent.js +318 -318
  69. package/sdk/package.json +12 -1
  70. package/sdk/safety-shield.js +219 -0
  71. package/sdk/schema-discovery.js +83 -83
  72. package/server/adapters/index.js +520 -520
  73. package/server/config/plans.js +367 -367
  74. package/server/config/secrets.js +102 -102
  75. package/server/control-plane/index.js +301 -301
  76. package/server/data-plane/index.js +354 -354
  77. package/server/index.js +175 -19
  78. package/server/llm/index.js +404 -404
  79. package/server/middleware/adminAuth.js +35 -35
  80. package/server/middleware/auth.js +50 -50
  81. package/server/middleware/featureGate.js +88 -88
  82. package/server/middleware/rateLimits.js +100 -100
  83. package/server/middleware/sensitiveAction.js +157 -0
  84. package/server/migrations/001_add_analytics_indexes.sql +7 -7
  85. package/server/migrations/002_premium_features.sql +418 -418
  86. package/server/migrations/003_ads_integer_cents.sql +33 -33
  87. package/server/migrations/004_agent_os.sql +158 -158
  88. package/server/migrations/005_marketplace_metering.sql +126 -126
  89. package/server/models/adapters/index.js +33 -33
  90. package/server/models/adapters/mysql.js +183 -183
  91. package/server/models/adapters/postgresql.js +172 -172
  92. package/server/models/adapters/sqlite.js +7 -7
  93. package/server/models/db.js +681 -681
  94. package/server/observability/failure-analysis.js +337 -337
  95. package/server/observability/index.js +394 -394
  96. package/server/protocol/capabilities.js +223 -223
  97. package/server/protocol/index.js +243 -243
  98. package/server/protocol/schema.js +584 -584
  99. package/server/registry/certification.js +271 -271
  100. package/server/registry/index.js +326 -326
  101. package/server/routes/admin-premium.js +671 -671
  102. package/server/routes/admin.js +261 -261
  103. package/server/routes/ads.js +130 -130
  104. package/server/routes/agent-workspace.js +540 -378
  105. package/server/routes/api.js +150 -150
  106. package/server/routes/auth.js +71 -71
  107. package/server/routes/billing.js +45 -45
  108. package/server/routes/commander.js +316 -316
  109. package/server/routes/demo-showcase.js +332 -0
  110. package/server/routes/demo-store.js +154 -0
  111. package/server/routes/discovery.js +417 -406
  112. package/server/routes/gateway.js +173 -0
  113. package/server/routes/license.js +251 -240
  114. package/server/routes/mesh.js +469 -469
  115. package/server/routes/noscript.js +543 -543
  116. package/server/routes/premium-v2.js +686 -686
  117. package/server/routes/premium.js +724 -724
  118. package/server/routes/runtime.js +2148 -2147
  119. package/server/routes/sovereign.js +465 -385
  120. package/server/routes/universal.js +200 -177
  121. package/server/routes/wab-api.js +850 -491
  122. package/server/runtime/container-worker.js +111 -111
  123. package/server/runtime/container.js +448 -448
  124. package/server/runtime/distributed-worker.js +362 -362
  125. package/server/runtime/event-bus.js +210 -210
  126. package/server/runtime/index.js +253 -253
  127. package/server/runtime/queue.js +599 -599
  128. package/server/runtime/replay.js +666 -666
  129. package/server/runtime/sandbox.js +266 -266
  130. package/server/runtime/scheduler.js +534 -534
  131. package/server/runtime/session-engine.js +293 -293
  132. package/server/runtime/state-manager.js +188 -188
  133. package/server/security/cross-site-redactor.js +196 -0
  134. package/server/security/dry-run.js +180 -0
  135. package/server/security/human-gate-rate-limit.js +147 -0
  136. package/server/security/human-gate-transports.js +178 -0
  137. package/server/security/human-gate.js +281 -0
  138. package/server/security/index.js +368 -368
  139. package/server/security/intent-engine.js +245 -0
  140. package/server/security/reward-guard.js +171 -0
  141. package/server/security/rollback-store.js +239 -0
  142. package/server/security/token-scope.js +404 -0
  143. package/server/security/url-policy.js +139 -0
  144. package/server/services/agent-chat.js +506 -506
  145. package/server/services/agent-learning.js +601 -575
  146. package/server/services/agent-memory.js +625 -625
  147. package/server/services/agent-mesh.js +555 -539
  148. package/server/services/agent-symphony.js +717 -717
  149. package/server/services/agent-tasks.js +1807 -1807
  150. package/server/services/api-key-engine.js +292 -0
  151. package/server/services/cluster.js +894 -894
  152. package/server/services/commander.js +738 -738
  153. package/server/services/edge-compute.js +440 -440
  154. package/server/services/email.js +204 -204
  155. package/server/services/hosted-runtime.js +205 -205
  156. package/server/services/lfd.js +635 -616
  157. package/server/services/local-ai.js +389 -389
  158. package/server/services/marketplace.js +270 -270
  159. package/server/services/metering.js +182 -182
  160. package/server/services/modules/affiliate-intelligence.js +93 -0
  161. package/server/services/modules/agent-firewall.js +90 -0
  162. package/server/services/modules/bounty.js +89 -0
  163. package/server/services/modules/collective-bargaining.js +92 -0
  164. package/server/services/modules/dark-pattern.js +66 -0
  165. package/server/services/modules/gov-intelligence.js +45 -0
  166. package/server/services/modules/neural.js +55 -0
  167. package/server/services/modules/notary.js +49 -0
  168. package/server/services/modules/price-time-machine.js +86 -0
  169. package/server/services/modules/protocol.js +104 -0
  170. package/server/services/negotiation.js +439 -439
  171. package/server/services/plugins.js +771 -771
  172. package/server/services/premium.js +1 -1
  173. package/server/services/price-intelligence.js +566 -565
  174. package/server/services/price-shield.js +1137 -1137
  175. package/server/services/reputation.js +465 -465
  176. package/server/services/search-engine.js +357 -357
  177. package/server/services/security.js +513 -513
  178. package/server/services/self-healing.js +843 -843
  179. package/server/services/sovereign-shield.js +542 -0
  180. package/server/services/stripe.js +192 -192
  181. package/server/services/swarm.js +788 -788
  182. package/server/services/universal-scraper.js +662 -661
  183. package/server/services/verification.js +481 -481
  184. package/server/services/vision.js +1163 -1163
  185. package/server/utils/cache.js +125 -125
  186. package/server/utils/migrate.js +81 -81
  187. package/server/utils/safe-fetch.js +228 -0
  188. package/server/utils/secureFields.js +50 -50
  189. package/server/ws.js +161 -161
  190. package/templates/artisan-marketplace.yaml +104 -104
  191. package/templates/book-price-scout.yaml +98 -98
  192. package/templates/electronics-price-tracker.yaml +108 -108
  193. package/templates/flight-deal-hunter.yaml +113 -113
  194. package/templates/freelancer-direct.yaml +116 -116
  195. package/templates/grocery-price-compare.yaml +93 -93
  196. package/templates/hotel-direct-booking.yaml +113 -113
  197. package/templates/local-services.yaml +98 -98
  198. package/templates/olive-oil-tunisia.yaml +88 -88
  199. package/templates/organic-farm-fresh.yaml +101 -101
  200. package/templates/restaurant-direct.yaml +97 -97
  201. package/server/services/fairness-engine.js +0 -409
  202. package/server/services/fairness.js +0 -420
@@ -1,119 +1,119 @@
1
- /**
2
- * Example: AI Agent using WebDriver BiDi Protocol via WAB
3
- *
4
- * This agent connects to a website using the __wab_bidi interface,
5
- * which follows WebDriver BiDi conventions for standardized communication.
6
- *
7
- * Prerequisites:
8
- * npm install puppeteer
9
- *
10
- * Usage:
11
- * node examples/bidi-agent.js <url>
12
- */
13
-
14
- const puppeteer = require('puppeteer');
15
-
16
- const TARGET_URL = process.argv[2] || 'http://localhost:3000';
17
-
18
- let commandId = 0;
19
-
20
- function bidiCommand(method, params = {}) {
21
- return { id: ++commandId, method, params };
22
- }
23
-
24
- async function main() {
25
- console.log(`\n🔗 WAB BiDi Agent`);
26
- console.log(` Target: ${TARGET_URL}\n`);
27
-
28
- const browser = await puppeteer.launch({ headless: true });
29
- const page = await browser.newPage();
30
-
31
- await page.goto(TARGET_URL, { waitUntil: 'networkidle2' });
32
- console.log(`✓ Page loaded: ${await page.title()}`);
33
-
34
- // Check for BiDi interface
35
- const hasBiDi = await page.evaluate(() => {
36
- return typeof window.__wab_bidi !== 'undefined' && typeof window.__wab_bidi.send === 'function';
37
- });
38
-
39
- if (!hasBiDi) {
40
- console.log('✗ WAB BiDi interface not found on this page.');
41
- await browser.close();
42
- return;
43
- }
44
-
45
- console.log('✓ WAB BiDi interface detected\n');
46
-
47
- // Step 1: Get BiDi context
48
- const context = await page.evaluate(() => window.__wab_bidi.getContext());
49
- console.log('📋 BiDi Context:');
50
- console.log(` URL: ${context.context.url}`);
51
- console.log(` Title: ${context.context.title}`);
52
- console.log(` Version: ${context.version}`);
53
- console.log(` Tier: ${context.capabilities.tier}`);
54
- console.log(` Capabilities: ${context.capabilities.actions.length} actions\n`);
55
-
56
- // Step 2: Get actions via BiDi command
57
- const actionsResult = await page.evaluate((cmd) => {
58
- return window.__wab_bidi.send(cmd);
59
- }, bidiCommand('wab.getActions'));
60
-
61
- console.log(`🔍 Actions (via BiDi):`);
62
- if (actionsResult.result) {
63
- actionsResult.result.forEach((action) => {
64
- console.log(` • ${action.name} [${action.trigger}] — ${action.description}`);
65
- });
66
- }
67
-
68
- // Step 3: Get page info via BiDi
69
- const infoResult = await page.evaluate((cmd) => {
70
- return window.__wab_bidi.send(cmd);
71
- }, bidiCommand('wab.getPageInfo'));
72
-
73
- console.log('\n📄 Page Info (via BiDi):');
74
- if (infoResult.result) {
75
- console.log(` Title: ${infoResult.result.title}`);
76
- console.log(` Domain: ${infoResult.result.domain}`);
77
- console.log(` Bridge: v${infoResult.result.bridgeVersion}`);
78
- }
79
-
80
- // Step 4: Read content via BiDi command
81
- const readResult = await page.evaluate((cmd) => {
82
- return window.__wab_bidi.send(cmd);
83
- }, bidiCommand('wab.readContent', { selector: 'h1' }));
84
-
85
- if (readResult.result && readResult.result.success) {
86
- console.log(`\n📖 Content: "${readResult.result.text}"`);
87
- }
88
-
89
- // Step 5: Execute an action via BiDi
90
- const actions = actionsResult.result || [];
91
- const firstAction = actions.find((a) => a.trigger === 'click');
92
- if (firstAction) {
93
- console.log(`\n▶ Executing via BiDi: "${firstAction.name}"`);
94
- const execResult = await page.evaluate((cmd) => {
95
- return window.__wab_bidi.send(cmd);
96
- }, bidiCommand('wab.executeAction', { name: firstAction.name }));
97
-
98
- const r = execResult.result;
99
- console.log(` Result: ${r && r.success ? '✓ Success' : '✗ ' + (r?.error || 'Unknown error')}`);
100
- }
101
-
102
- // Step 6: Test error handling
103
- console.log('\n🧪 Testing error handling:');
104
- const errorResult = await page.evaluate((cmd) => {
105
- return window.__wab_bidi.send(cmd);
106
- }, bidiCommand('wab.unknownMethod'));
107
-
108
- if (errorResult.error) {
109
- console.log(` ✓ Unknown command handled: ${errorResult.error.code} — ${errorResult.error.message}`);
110
- }
111
-
112
- console.log('\n✓ BiDi agent session complete.');
113
- await browser.close();
114
- }
115
-
116
- main().catch((err) => {
117
- console.error('Agent error:', err.message);
118
- process.exit(1);
119
- });
1
+ /**
2
+ * Example: AI Agent using WebDriver BiDi Protocol via WAB
3
+ *
4
+ * This agent connects to a website using the __wab_bidi interface,
5
+ * which follows WebDriver BiDi conventions for standardized communication.
6
+ *
7
+ * Prerequisites:
8
+ * npm install puppeteer
9
+ *
10
+ * Usage:
11
+ * node examples/bidi-agent.js <url>
12
+ */
13
+
14
+ const puppeteer = require('puppeteer');
15
+
16
+ const TARGET_URL = process.argv[2] || 'http://localhost:3000';
17
+
18
+ let commandId = 0;
19
+
20
+ function bidiCommand(method, params = {}) {
21
+ return { id: ++commandId, method, params };
22
+ }
23
+
24
+ async function main() {
25
+ console.log(`\n🔗 WAB BiDi Agent`);
26
+ console.log(` Target: ${TARGET_URL}\n`);
27
+
28
+ const browser = await puppeteer.launch({ headless: true });
29
+ const page = await browser.newPage();
30
+
31
+ await page.goto(TARGET_URL, { waitUntil: 'networkidle2' });
32
+ console.log(`✓ Page loaded: ${await page.title()}`);
33
+
34
+ // Check for BiDi interface
35
+ const hasBiDi = await page.evaluate(() => {
36
+ return typeof window.__wab_bidi !== 'undefined' && typeof window.__wab_bidi.send === 'function';
37
+ });
38
+
39
+ if (!hasBiDi) {
40
+ console.log('✗ WAB BiDi interface not found on this page.');
41
+ await browser.close();
42
+ return;
43
+ }
44
+
45
+ console.log('✓ WAB BiDi interface detected\n');
46
+
47
+ // Step 1: Get BiDi context
48
+ const context = await page.evaluate(() => window.__wab_bidi.getContext());
49
+ console.log('📋 BiDi Context:');
50
+ console.log(` URL: ${context.context.url}`);
51
+ console.log(` Title: ${context.context.title}`);
52
+ console.log(` Version: ${context.version}`);
53
+ console.log(` Tier: ${context.capabilities.tier}`);
54
+ console.log(` Capabilities: ${context.capabilities.actions.length} actions\n`);
55
+
56
+ // Step 2: Get actions via BiDi command
57
+ const actionsResult = await page.evaluate((cmd) => {
58
+ return window.__wab_bidi.send(cmd);
59
+ }, bidiCommand('wab.getActions'));
60
+
61
+ console.log(`🔍 Actions (via BiDi):`);
62
+ if (actionsResult.result) {
63
+ actionsResult.result.forEach((action) => {
64
+ console.log(` • ${action.name} [${action.trigger}] — ${action.description}`);
65
+ });
66
+ }
67
+
68
+ // Step 3: Get page info via BiDi
69
+ const infoResult = await page.evaluate((cmd) => {
70
+ return window.__wab_bidi.send(cmd);
71
+ }, bidiCommand('wab.getPageInfo'));
72
+
73
+ console.log('\n📄 Page Info (via BiDi):');
74
+ if (infoResult.result) {
75
+ console.log(` Title: ${infoResult.result.title}`);
76
+ console.log(` Domain: ${infoResult.result.domain}`);
77
+ console.log(` Bridge: v${infoResult.result.bridgeVersion}`);
78
+ }
79
+
80
+ // Step 4: Read content via BiDi command
81
+ const readResult = await page.evaluate((cmd) => {
82
+ return window.__wab_bidi.send(cmd);
83
+ }, bidiCommand('wab.readContent', { selector: 'h1' }));
84
+
85
+ if (readResult.result && readResult.result.success) {
86
+ console.log(`\n📖 Content: "${readResult.result.text}"`);
87
+ }
88
+
89
+ // Step 5: Execute an action via BiDi
90
+ const actions = actionsResult.result || [];
91
+ const firstAction = actions.find((a) => a.trigger === 'click');
92
+ if (firstAction) {
93
+ console.log(`\n▶ Executing via BiDi: "${firstAction.name}"`);
94
+ const execResult = await page.evaluate((cmd) => {
95
+ return window.__wab_bidi.send(cmd);
96
+ }, bidiCommand('wab.executeAction', { name: firstAction.name }));
97
+
98
+ const r = execResult.result;
99
+ console.log(` Result: ${r && r.success ? '✓ Success' : '✗ ' + (r?.error || 'Unknown error')}`);
100
+ }
101
+
102
+ // Step 6: Test error handling
103
+ console.log('\n🧪 Testing error handling:');
104
+ const errorResult = await page.evaluate((cmd) => {
105
+ return window.__wab_bidi.send(cmd);
106
+ }, bidiCommand('wab.unknownMethod'));
107
+
108
+ if (errorResult.error) {
109
+ console.log(` ✓ Unknown command handled: ${errorResult.error.code} — ${errorResult.error.message}`);
110
+ }
111
+
112
+ console.log('\n✓ BiDi agent session complete.');
113
+ await browser.close();
114
+ }
115
+
116
+ main().catch((err) => {
117
+ console.error('Agent error:', err.message);
118
+ process.exit(1);
119
+ });
@@ -1,91 +1,91 @@
1
- /**
2
- * Example: Cross-Site Agent Orchestration
3
- *
4
- * One agent manages multiple WAB-enabled sites simultaneously.
5
- * Compares prices, aggregates product data, and finds the best deal.
6
- *
7
- * Prerequisites:
8
- * npm install puppeteer web-agent-bridge-sdk
9
- *
10
- * Usage:
11
- * node examples/cross-site-agent.js site1.com site2.com site3.com
12
- */
13
-
14
- const { WABMultiAgent } = require('../sdk');
15
-
16
- const sites = process.argv.slice(2);
17
- if (sites.length < 2) {
18
- console.log('Usage: node cross-site-agent.js <url1> <url2> [url3 ...]');
19
- console.log('Example: node cross-site-agent.js https://shop1.com https://shop2.com');
20
- process.exit(1);
21
- }
22
-
23
- // Ensure URLs have protocol
24
- const urls = sites.map((s) => (s.startsWith('http') ? s : `https://${s}`));
25
-
26
- async function main() {
27
- console.log('\n🌐 WAB Cross-Site Agent Orchestration');
28
- console.log(` Sites: ${urls.length}\n`);
29
-
30
- // 1. Create multi-agent and connect to all sites
31
- const multiAgent = new WABMultiAgent(urls, {
32
- timeout: 20000,
33
- headless: true
34
- });
35
-
36
- console.log('⏳ Launching browsers and connecting...');
37
- const { connected, failed } = await multiAgent.launch();
38
-
39
- for (const site of connected) console.log(` ✓ Connected: ${site}`);
40
- for (const site of failed) console.log(` ✗ Failed: ${site}`);
41
-
42
- if (connected.length === 0) {
43
- console.log('\n✗ No sites connected. Exiting.');
44
- await multiAgent.close();
45
- return;
46
- }
47
-
48
- // 2. Discover all sites
49
- console.log('\n📡 Discovering WAB capabilities...');
50
- const discoveries = await multiAgent.discoverAll();
51
- for (const d of discoveries) {
52
- console.log(` ${d.site}: ${d.actions.length} actions`);
53
- }
54
-
55
- // 3. Compare prices for a product
56
- console.log('\n💰 Comparing prices...');
57
- const comparison = await multiAgent.comparePrices('product-sku');
58
- for (const r of comparison.results) {
59
- if (r.price != null) {
60
- console.log(` ${r.site}: ${r.currency} ${r.price.toFixed(2)} — ${r.product}`);
61
- } else {
62
- console.log(` ${r.site}: ${r.error || 'No price data'}`);
63
- }
64
- }
65
-
66
- if (comparison.cheapest) {
67
- console.log(`\n🏆 Best deal: ${comparison.cheapest.site}`);
68
- console.log(` Price: ${comparison.cheapest.currency} ${comparison.cheapest.price.toFixed(2)}`);
69
- if (comparison.savings != null) {
70
- console.log(` You save: ${comparison.cheapest.currency} ${comparison.savings.toFixed(2)}`);
71
- }
72
- }
73
-
74
- // 4. Execute a common action across all sites
75
- console.log('\n🔄 Executing getPageInfo on all sites...');
76
- const infos = await multiAgent.executeAll('getPageInfo');
77
- for (const info of infos) {
78
- if (info.status === 'fulfilled' && info.value) {
79
- console.log(` ${info.site}: "${info.value.title}" (v${info.value.bridgeVersion})`);
80
- }
81
- }
82
-
83
- // 5. Cleanup
84
- await multiAgent.close();
85
- console.log('\n✓ All sessions closed. Done!\n');
86
- }
87
-
88
- main().catch((err) => {
89
- console.error('Error:', err.message);
90
- process.exit(1);
91
- });
1
+ /**
2
+ * Example: Cross-Site Agent Orchestration
3
+ *
4
+ * One agent manages multiple WAB-enabled sites simultaneously.
5
+ * Compares prices, aggregates product data, and finds the best deal.
6
+ *
7
+ * Prerequisites:
8
+ * npm install puppeteer web-agent-bridge-sdk
9
+ *
10
+ * Usage:
11
+ * node examples/cross-site-agent.js site1.com site2.com site3.com
12
+ */
13
+
14
+ const { WABMultiAgent } = require('../sdk');
15
+
16
+ const sites = process.argv.slice(2);
17
+ if (sites.length < 2) {
18
+ console.log('Usage: node cross-site-agent.js <url1> <url2> [url3 ...]');
19
+ console.log('Example: node cross-site-agent.js https://shop1.com https://shop2.com');
20
+ process.exit(1);
21
+ }
22
+
23
+ // Ensure URLs have protocol
24
+ const urls = sites.map((s) => (s.startsWith('http') ? s : `https://${s}`));
25
+
26
+ async function main() {
27
+ console.log('\n🌐 WAB Cross-Site Agent Orchestration');
28
+ console.log(` Sites: ${urls.length}\n`);
29
+
30
+ // 1. Create multi-agent and connect to all sites
31
+ const multiAgent = new WABMultiAgent(urls, {
32
+ timeout: 20000,
33
+ headless: true
34
+ });
35
+
36
+ console.log('⏳ Launching browsers and connecting...');
37
+ const { connected, failed } = await multiAgent.launch();
38
+
39
+ for (const site of connected) console.log(` ✓ Connected: ${site}`);
40
+ for (const site of failed) console.log(` ✗ Failed: ${site}`);
41
+
42
+ if (connected.length === 0) {
43
+ console.log('\n✗ No sites connected. Exiting.');
44
+ await multiAgent.close();
45
+ return;
46
+ }
47
+
48
+ // 2. Discover all sites
49
+ console.log('\n📡 Discovering WAB capabilities...');
50
+ const discoveries = await multiAgent.discoverAll();
51
+ for (const d of discoveries) {
52
+ console.log(` ${d.site}: ${d.actions.length} actions`);
53
+ }
54
+
55
+ // 3. Compare prices for a product
56
+ console.log('\n💰 Comparing prices...');
57
+ const comparison = await multiAgent.comparePrices('product-sku');
58
+ for (const r of comparison.results) {
59
+ if (r.price != null) {
60
+ console.log(` ${r.site}: ${r.currency} ${r.price.toFixed(2)} — ${r.product}`);
61
+ } else {
62
+ console.log(` ${r.site}: ${r.error || 'No price data'}`);
63
+ }
64
+ }
65
+
66
+ if (comparison.cheapest) {
67
+ console.log(`\n🏆 Best deal: ${comparison.cheapest.site}`);
68
+ console.log(` Price: ${comparison.cheapest.currency} ${comparison.cheapest.price.toFixed(2)}`);
69
+ if (comparison.savings != null) {
70
+ console.log(` You save: ${comparison.cheapest.currency} ${comparison.savings.toFixed(2)}`);
71
+ }
72
+ }
73
+
74
+ // 4. Execute a common action across all sites
75
+ console.log('\n🔄 Executing getPageInfo on all sites...');
76
+ const infos = await multiAgent.executeAll('getPageInfo');
77
+ for (const info of infos) {
78
+ if (info.status === 'fulfilled' && info.value) {
79
+ console.log(` ${info.site}: "${info.value.title}" (v${info.value.bridgeVersion})`);
80
+ }
81
+ }
82
+
83
+ // 5. Cleanup
84
+ await multiAgent.close();
85
+ console.log('\n✓ All sessions closed. Done!\n');
86
+ }
87
+
88
+ main().catch((err) => {
89
+ console.error('Error:', err.message);
90
+ process.exit(1);
91
+ });
@@ -1,94 +1,94 @@
1
- /**
2
- * Example: Using WAB sites via the MCP adapter
3
- *
4
- * The WAB-MCP adapter exposes every WAB site action as an MCP tool,
5
- * so any MCP-compatible AI agent (Claude, GPT, etc.) can interact
6
- * with WAB-enabled websites through a uniform tool interface.
7
- *
8
- * Usage:
9
- * node examples/mcp-agent.js <site-url>
10
- */
11
-
12
- const { WABMCPAdapter } = require('../wab-mcp-adapter');
13
-
14
- const TARGET = process.argv[2] || 'http://localhost:3000';
15
-
16
- async function main() {
17
- console.log('\n WAB → MCP Adapter Demo');
18
- console.log(` Target: ${TARGET}\n`);
19
-
20
- const adapter = new WABMCPAdapter({
21
- siteUrl: TARGET,
22
- transport: 'http'
23
- });
24
-
25
- // Step 1: Discover site capabilities
26
- console.log('1. Discovering WAB capabilities...');
27
- const discovery = await adapter.discover();
28
- if (discovery) {
29
- console.log(` Provider: ${discovery.provider?.name || 'unknown'}`);
30
- console.log(` Domain: ${discovery.provider?.domain || 'unknown'}`);
31
- console.log(` Tier: ${discovery.capabilities?.tier || 'free'}`);
32
- console.log(` Features: ${(discovery.capabilities?.features || []).join(', ')}`);
33
- if (discovery.fairness) {
34
- console.log(` Fairness: score=${discovery.fairness.neutrality_score}, independent=${discovery.fairness.is_independent}`);
35
- }
36
- } else {
37
- console.log(' No discovery document found (site may not have WAB configured)');
38
- }
39
-
40
- // Step 2: List MCP tools
41
- console.log('\n2. Available MCP tools:');
42
- const tools = await adapter.getTools();
43
- tools.forEach(tool => {
44
- const params = tool.input_schema?.properties
45
- ? Object.keys(tool.input_schema.properties).join(', ')
46
- : 'none';
47
- console.log(` - ${tool.name}: ${tool.description} (params: ${params})`);
48
- });
49
-
50
- // Step 3: Execute built-in tools
51
- console.log('\n3. Executing wab_get_page_info...');
52
- try {
53
- const infoResult = await adapter.executeTool('wab_get_page_info', {});
54
- const info = infoResult.content;
55
- if (infoResult.is_error) {
56
- console.log(` Error: ${info.error}`);
57
- } else {
58
- console.log(` Title: ${info.title || 'N/A'}`);
59
- console.log(` Version: ${info.bridgeVersion || 'N/A'}`);
60
- console.log(` Domain: ${info.domain || 'N/A'}`);
61
- }
62
- } catch (err) {
63
- console.log(` Error: ${err.message}`);
64
- }
65
-
66
- // Step 4: Search the fairness registry
67
- console.log('\n4. Fairness-weighted search (demo):');
68
- try {
69
- const searchResult = await adapter.executeTool('wab_fairness_search', {
70
- query: 'e-commerce',
71
- limit: 5
72
- });
73
- const search = searchResult.content;
74
- if (searchResult.is_error) {
75
- console.log(` Error: ${search.error}`);
76
- } else if (search.results?.length) {
77
- search.results.forEach(r => {
78
- console.log(` - ${r.name} (${r.domain}) — score: ${r.final_score}`);
79
- });
80
- } else {
81
- console.log(' No sites registered in directory yet.');
82
- }
83
- } catch (err) {
84
- console.log(` Registry not available: ${err.message}`);
85
- }
86
-
87
- console.log('\nDone. In a real MCP integration, these tools would be');
88
- console.log('exposed to Claude/GPT via the MCP tool-use protocol.\n');
89
- }
90
-
91
- main().catch(err => {
92
- console.error('Error:', err.message);
93
- process.exit(1);
94
- });
1
+ /**
2
+ * Example: Using WAB sites via the MCP adapter
3
+ *
4
+ * The WAB-MCP adapter exposes every WAB site action as an MCP tool,
5
+ * so any MCP-compatible AI agent (Claude, GPT, etc.) can interact
6
+ * with WAB-enabled websites through a uniform tool interface.
7
+ *
8
+ * Usage:
9
+ * node examples/mcp-agent.js <site-url>
10
+ */
11
+
12
+ const { WABMCPAdapter } = require('../wab-mcp-adapter');
13
+
14
+ const TARGET = process.argv[2] || 'http://localhost:3000';
15
+
16
+ async function main() {
17
+ console.log('\n WAB → MCP Adapter Demo');
18
+ console.log(` Target: ${TARGET}\n`);
19
+
20
+ const adapter = new WABMCPAdapter({
21
+ siteUrl: TARGET,
22
+ transport: 'http'
23
+ });
24
+
25
+ // Step 1: Discover site capabilities
26
+ console.log('1. Discovering WAB capabilities...');
27
+ const discovery = await adapter.discover();
28
+ if (discovery) {
29
+ console.log(` Provider: ${discovery.provider?.name || 'unknown'}`);
30
+ console.log(` Domain: ${discovery.provider?.domain || 'unknown'}`);
31
+ console.log(` Tier: ${discovery.capabilities?.tier || 'free'}`);
32
+ console.log(` Features: ${(discovery.capabilities?.features || []).join(', ')}`);
33
+ if (discovery.fairness) {
34
+ console.log(` Fairness: score=${discovery.fairness.neutrality_score}, independent=${discovery.fairness.is_independent}`);
35
+ }
36
+ } else {
37
+ console.log(' No discovery document found (site may not have WAB configured)');
38
+ }
39
+
40
+ // Step 2: List MCP tools
41
+ console.log('\n2. Available MCP tools:');
42
+ const tools = await adapter.getTools();
43
+ tools.forEach(tool => {
44
+ const params = tool.input_schema?.properties
45
+ ? Object.keys(tool.input_schema.properties).join(', ')
46
+ : 'none';
47
+ console.log(` - ${tool.name}: ${tool.description} (params: ${params})`);
48
+ });
49
+
50
+ // Step 3: Execute built-in tools
51
+ console.log('\n3. Executing wab_get_page_info...');
52
+ try {
53
+ const infoResult = await adapter.executeTool('wab_get_page_info', {});
54
+ const info = infoResult.content;
55
+ if (infoResult.is_error) {
56
+ console.log(` Error: ${info.error}`);
57
+ } else {
58
+ console.log(` Title: ${info.title || 'N/A'}`);
59
+ console.log(` Version: ${info.bridgeVersion || 'N/A'}`);
60
+ console.log(` Domain: ${info.domain || 'N/A'}`);
61
+ }
62
+ } catch (err) {
63
+ console.log(` Error: ${err.message}`);
64
+ }
65
+
66
+ // Step 4: Search the fairness registry
67
+ console.log('\n4. Fairness-weighted search (demo):');
68
+ try {
69
+ const searchResult = await adapter.executeTool('wab_fairness_search', {
70
+ query: 'e-commerce',
71
+ limit: 5
72
+ });
73
+ const search = searchResult.content;
74
+ if (searchResult.is_error) {
75
+ console.log(` Error: ${search.error}`);
76
+ } else if (search.results?.length) {
77
+ search.results.forEach(r => {
78
+ console.log(` - ${r.name} (${r.domain}) — score: ${r.final_score}`);
79
+ });
80
+ } else {
81
+ console.log(' No sites registered in directory yet.');
82
+ }
83
+ } catch (err) {
84
+ console.log(` Registry not available: ${err.message}`);
85
+ }
86
+
87
+ console.log('\nDone. In a real MCP integration, these tools would be');
88
+ console.log('exposed to Claude/GPT via the MCP tool-use protocol.\n');
89
+ }
90
+
91
+ main().catch(err => {
92
+ console.error('Error:', err.message);
93
+ process.exit(1);
94
+ });