web-agent-bridge 3.2.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.
- package/LICENSE +72 -72
- package/README.ar.md +1286 -1152
- package/README.md +1764 -1635
- package/bin/agent-runner.js +474 -474
- package/bin/cli.js +237 -138
- package/bin/wab.js +80 -80
- package/examples/bidi-agent.js +119 -119
- package/examples/cross-site-agent.js +91 -91
- package/examples/mcp-agent.js +94 -94
- package/examples/next-app-router/README.md +44 -44
- package/examples/puppeteer-agent.js +108 -108
- package/examples/saas-dashboard/README.md +55 -55
- package/examples/shopify-hydrogen/README.md +74 -74
- package/examples/vision-agent.js +171 -171
- package/examples/wordpress-elementor/README.md +77 -77
- package/package.json +16 -3
- package/public/.well-known/agent-tools.json +180 -180
- package/public/.well-known/ai-assets.json +59 -59
- package/public/.well-known/security.txt +8 -0
- package/public/agent-workspace.html +349 -349
- package/public/ai.html +198 -198
- package/public/api.html +413 -412
- package/public/browser.html +486 -486
- package/public/commander-dashboard.html +243 -243
- package/public/cookies.html +210 -210
- package/public/css/agent-workspace.css +1713 -1713
- package/public/css/premium.css +317 -317
- package/public/css/styles.css +1235 -1235
- package/public/dashboard.html +706 -706
- package/public/dns.html +507 -0
- package/public/docs.html +587 -587
- package/public/feed.xml +89 -89
- package/public/growth.html +463 -463
- package/public/index.html +1070 -982
- package/public/integrations.html +556 -0
- package/public/js/agent-workspace.js +1740 -1740
- package/public/js/auth-nav.js +31 -31
- package/public/js/auth-redirect.js +12 -12
- package/public/js/cookie-consent.js +56 -56
- package/public/js/wab-demo-page.js +721 -721
- package/public/js/ws-client.js +74 -74
- package/public/llms-full.txt +360 -360
- package/public/llms.txt +125 -125
- package/public/login.html +85 -85
- package/public/mesh-dashboard.html +328 -328
- package/public/openapi.json +580 -580
- package/public/phone-shield.html +281 -0
- package/public/premium-dashboard.html +2489 -2489
- package/public/premium.html +793 -793
- package/public/privacy.html +297 -297
- package/public/register.html +105 -105
- package/public/robots.txt +87 -87
- package/public/script/wab-consent.d.ts +36 -36
- package/public/script/wab-consent.js +104 -104
- package/public/script/wab-schema.js +131 -131
- package/public/script/wab.d.ts +108 -108
- package/public/script/wab.min.js +580 -580
- package/public/security.txt +8 -0
- package/public/terms.html +256 -256
- package/script/ai-agent-bridge.js +1754 -1754
- package/sdk/README.md +99 -99
- package/sdk/agent-mesh.js +449 -449
- package/sdk/commander.js +262 -262
- package/sdk/index.d.ts +464 -464
- package/sdk/index.js +12 -1
- package/sdk/multi-agent.js +318 -318
- package/sdk/package.json +1 -1
- package/sdk/safety-shield.js +219 -0
- package/sdk/schema-discovery.js +83 -83
- package/server/adapters/index.js +520 -520
- package/server/config/plans.js +367 -367
- package/server/config/secrets.js +102 -102
- package/server/control-plane/index.js +301 -301
- package/server/data-plane/index.js +354 -354
- package/server/index.js +531 -427
- package/server/llm/index.js +404 -404
- package/server/middleware/adminAuth.js +35 -35
- package/server/middleware/auth.js +50 -50
- package/server/middleware/featureGate.js +88 -88
- package/server/middleware/rateLimits.js +100 -100
- package/server/middleware/sensitiveAction.js +157 -0
- package/server/migrations/001_add_analytics_indexes.sql +7 -7
- package/server/migrations/002_premium_features.sql +418 -418
- package/server/migrations/003_ads_integer_cents.sql +33 -33
- package/server/migrations/004_agent_os.sql +158 -158
- package/server/migrations/005_marketplace_metering.sql +126 -126
- package/server/models/adapters/index.js +33 -33
- package/server/models/adapters/mysql.js +183 -183
- package/server/models/adapters/postgresql.js +172 -172
- package/server/models/adapters/sqlite.js +7 -7
- package/server/models/db.js +681 -681
- package/server/observability/failure-analysis.js +337 -337
- package/server/observability/index.js +394 -394
- package/server/protocol/capabilities.js +223 -223
- package/server/protocol/index.js +243 -243
- package/server/protocol/schema.js +584 -584
- package/server/registry/certification.js +271 -271
- package/server/registry/index.js +326 -326
- package/server/routes/admin-premium.js +671 -671
- package/server/routes/admin.js +261 -261
- package/server/routes/ads.js +130 -130
- package/server/routes/agent-workspace.js +540 -540
- package/server/routes/api.js +150 -150
- package/server/routes/auth.js +71 -71
- package/server/routes/billing.js +45 -45
- package/server/routes/commander.js +316 -316
- package/server/routes/demo-showcase.js +332 -332
- package/server/routes/demo-store.js +154 -0
- package/server/routes/discovery.js +417 -417
- package/server/routes/gateway.js +173 -157
- package/server/routes/license.js +251 -240
- package/server/routes/mesh.js +469 -469
- package/server/routes/noscript.js +543 -543
- package/server/routes/premium-v2.js +686 -686
- package/server/routes/premium.js +724 -724
- package/server/routes/runtime.js +2148 -2147
- package/server/routes/sovereign.js +465 -385
- package/server/routes/universal.js +200 -185
- package/server/routes/wab-api.js +850 -501
- package/server/runtime/container-worker.js +111 -111
- package/server/runtime/container.js +448 -448
- package/server/runtime/distributed-worker.js +362 -362
- package/server/runtime/event-bus.js +210 -210
- package/server/runtime/index.js +253 -253
- package/server/runtime/queue.js +599 -599
- package/server/runtime/replay.js +666 -666
- package/server/runtime/sandbox.js +266 -266
- package/server/runtime/scheduler.js +534 -534
- package/server/runtime/session-engine.js +293 -293
- package/server/runtime/state-manager.js +188 -188
- package/server/security/cross-site-redactor.js +196 -0
- package/server/security/dry-run.js +180 -0
- package/server/security/human-gate-rate-limit.js +147 -0
- package/server/security/human-gate-transports.js +178 -0
- package/server/security/human-gate.js +281 -0
- package/server/security/index.js +368 -368
- package/server/security/intent-engine.js +245 -0
- package/server/security/reward-guard.js +171 -0
- package/server/security/rollback-store.js +239 -0
- package/server/security/token-scope.js +404 -0
- package/server/security/url-policy.js +139 -0
- package/server/services/agent-chat.js +506 -506
- package/server/services/agent-learning.js +601 -575
- package/server/services/agent-memory.js +625 -625
- package/server/services/agent-mesh.js +555 -539
- package/server/services/agent-symphony.js +717 -717
- package/server/services/agent-tasks.js +1807 -1807
- package/server/services/api-key-engine.js +292 -261
- package/server/services/cluster.js +894 -894
- package/server/services/commander.js +738 -738
- package/server/services/edge-compute.js +440 -440
- package/server/services/email.js +204 -204
- package/server/services/hosted-runtime.js +205 -205
- package/server/services/lfd.js +635 -635
- package/server/services/local-ai.js +389 -389
- package/server/services/marketplace.js +270 -270
- package/server/services/metering.js +182 -182
- package/server/services/modules/affiliate-intelligence.js +93 -93
- package/server/services/modules/agent-firewall.js +90 -90
- package/server/services/modules/bounty.js +89 -89
- package/server/services/modules/collective-bargaining.js +92 -92
- package/server/services/modules/dark-pattern.js +66 -66
- package/server/services/modules/gov-intelligence.js +45 -45
- package/server/services/modules/neural.js +55 -55
- package/server/services/modules/notary.js +49 -49
- package/server/services/modules/price-time-machine.js +86 -86
- package/server/services/modules/protocol.js +104 -104
- package/server/services/negotiation.js +439 -439
- package/server/services/plugins.js +771 -771
- package/server/services/price-intelligence.js +566 -566
- package/server/services/price-shield.js +1137 -1137
- package/server/services/reputation.js +465 -465
- package/server/services/search-engine.js +357 -357
- package/server/services/security.js +513 -513
- package/server/services/self-healing.js +843 -843
- package/server/services/sovereign-shield.js +542 -0
- package/server/services/stripe.js +192 -192
- package/server/services/swarm.js +788 -788
- package/server/services/universal-scraper.js +662 -661
- package/server/services/verification.js +481 -481
- package/server/services/vision.js +1163 -1163
- package/server/utils/cache.js +125 -125
- package/server/utils/migrate.js +81 -81
- package/server/utils/safe-fetch.js +228 -0
- package/server/utils/secureFields.js +50 -50
- package/server/ws.js +161 -161
- package/templates/artisan-marketplace.yaml +104 -104
- package/templates/book-price-scout.yaml +98 -98
- package/templates/electronics-price-tracker.yaml +108 -108
- package/templates/flight-deal-hunter.yaml +113 -113
- package/templates/freelancer-direct.yaml +116 -116
- package/templates/grocery-price-compare.yaml +93 -93
- package/templates/hotel-direct-booking.yaml +113 -113
- package/templates/local-services.yaml +98 -98
- package/templates/olive-oil-tunisia.yaml +88 -88
- package/templates/organic-farm-fresh.yaml +101 -101
- package/templates/restaurant-direct.yaml +97 -97
- package/public/score.html +0 -263
- package/server/migrations/006_growth_suite.sql +0 -138
- package/server/routes/growth.js +0 -962
- package/server/services/fairness-engine.js +0 -409
- package/server/services/fairness.js +0 -420
package/examples/bidi-agent.js
CHANGED
|
@@ -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
|
+
});
|
package/examples/mcp-agent.js
CHANGED
|
@@ -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
|
+
});
|