web-agent-bridge 3.2.0 → 3.4.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 +84 -72
- package/README.ar.md +1304 -1152
- package/README.md +298 -1635
- package/bin/agent-runner.js +474 -474
- package/bin/cli.js +237 -138
- package/bin/wab-init.js +223 -0
- package/bin/wab.js +80 -80
- package/examples/azure-dns-wab.js +83 -0
- package/examples/bidi-agent.js +119 -119
- package/examples/cloudflare-wab-dns.js +121 -0
- package/examples/cpanel-wab-dns.js +114 -0
- package/examples/cross-site-agent.js +91 -91
- package/examples/dns-discovery-agent.js +166 -0
- package/examples/gcp-dns-wab.js +76 -0
- package/examples/governance-agent.js +169 -0
- package/examples/mcp-agent.js +94 -94
- package/examples/next-app-router/README.md +44 -44
- package/examples/plesk-wab-dns.js +103 -0
- package/examples/puppeteer-agent.js +108 -108
- package/examples/route53-wab-dns.js +144 -0
- package/examples/saas-dashboard/README.md +55 -55
- package/examples/safe-mode-agent.js +96 -0
- package/examples/shopify-hydrogen/README.md +74 -74
- package/examples/vision-agent.js +171 -171
- package/examples/wab-sign.js +74 -0
- package/examples/wab-verify.js +60 -0
- package/examples/wordpress-elementor/README.md +77 -77
- package/package.json +19 -6
- 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/.well-known/wab.json +28 -0
- package/public/activate.html +368 -0
- package/public/adoption-metrics.html +188 -0
- package/public/agent-workspace.html +349 -349
- package/public/ai.html +198 -198
- package/public/api.html +413 -412
- package/public/azure-dns-integration.html +289 -0
- package/public/browser.html +486 -486
- package/public/cloudflare-integration.html +380 -0
- package/public/commander-dashboard.html +243 -243
- package/public/cookies.html +210 -210
- package/public/cpanel-integration.html +398 -0
- package/public/css/agent-workspace.css +1713 -1713
- package/public/css/premium.css +317 -317
- package/public/css/styles.css +1263 -1235
- package/public/dashboard.html +707 -706
- package/public/dns.html +436 -0
- package/public/docs.html +588 -587
- package/public/feed.xml +89 -89
- package/public/gcp-dns-integration.html +318 -0
- package/public/growth.html +465 -463
- package/public/index.html +1266 -982
- package/public/integrations.html +556 -0
- package/public/js/activate.js +145 -0
- package/public/js/agent-workspace.js +1740 -1740
- package/public/js/auth-nav.js +65 -31
- package/public/js/auth-redirect.js +12 -12
- package/public/js/cookie-consent.js +56 -56
- package/public/js/dns.js +438 -0
- 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 +669 -580
- package/public/phone-shield.html +281 -0
- package/public/plesk-integration.html +375 -0
- package/public/premium-dashboard.html +2489 -2489
- package/public/premium.html +793 -793
- package/public/privacy.html +297 -297
- package/public/provider-onboarding.html +172 -0
- package/public/provider-sandbox.html +134 -0
- package/public/providers.html +359 -0
- package/public/register.html +105 -105
- package/public/registrar-integrations.html +141 -0
- package/public/robots.txt +99 -87
- package/public/route53-integration.html +531 -0
- 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/shieldqr.html +231 -0
- package/public/sitemap.xml +6 -0
- package/public/terms.html +256 -256
- package/public/wab-trust.html +200 -0
- package/public/wab-vs-protocols.html +210 -0
- package/public/whitepaper.html +449 -0
- package/script/ai-agent-bridge.js +1754 -1754
- package/sdk/README.md +99 -99
- package/sdk/agent-mesh.js +449 -449
- package/sdk/auto-discovery.js +288 -0
- package/sdk/commander.js +262 -262
- package/sdk/governance.js +262 -0
- package/sdk/index.d.ts +464 -464
- package/sdk/index.js +25 -1
- package/sdk/multi-agent.js +318 -318
- package/sdk/package.json +2 -2
- package/sdk/safe-mode.js +221 -0
- 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 +670 -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/migrations/007_governance.sql +106 -0
- package/server/migrations/008_plans.sql +144 -0
- package/server/migrations/009_shieldqr.sql +30 -0
- package/server/migrations/010_extended_trust.sql +33 -0
- 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 +740 -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-plans.js +76 -0
- package/server/routes/admin-premium.js +673 -671
- package/server/routes/admin-shieldqr.js +90 -0
- package/server/routes/admin-trust-monitor.js +83 -0
- package/server/routes/admin.js +549 -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 +57 -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 +2348 -417
- package/server/routes/gateway.js +173 -157
- package/server/routes/governance.js +208 -0
- package/server/routes/license.js +251 -240
- package/server/routes/mesh.js +469 -469
- package/server/routes/noscript.js +543 -543
- package/server/routes/plans.js +33 -0
- package/server/routes/premium-v2.js +686 -686
- package/server/routes/premium.js +724 -724
- package/server/routes/providers.js +650 -0
- package/server/routes/runtime.js +2148 -2147
- package/server/routes/shieldqr.js +88 -0
- 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 +233 -204
- package/server/services/governance.js +466 -0
- 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/plans.js +214 -0
- package/server/services/plugins.js +771 -771
- package/server/services/premium.js +1 -1
- package/server/services/price-intelligence.js +566 -566
- package/server/services/price-shield.js +1137 -1137
- package/server/services/provider-clients.js +740 -0
- 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/shieldqr.js +322 -0
- package/server/services/sovereign-shield.js +542 -0
- package/server/services/ssl-inspector.js +42 -0
- package/server/services/ssl-monitor.js +167 -0
- package/server/services/stripe.js +205 -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/services/wab-crypto.js +178 -0
- 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
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sensitive Action Gate — Human-in-the-Loop confirmation for destructive
|
|
5
|
+
* or financially-impactful agent actions.
|
|
6
|
+
*
|
|
7
|
+
* Threat: prompt-injection or compromised agent issues `purchase`, `transfer`,
|
|
8
|
+
* `delete-account`, etc. without user intent.
|
|
9
|
+
*
|
|
10
|
+
* Defense:
|
|
11
|
+
* 1. Maintain a static list of sensitive action verbs.
|
|
12
|
+
* 2. If a request payload references one of those verbs, require either:
|
|
13
|
+
* - X-WAB-Confirm header containing an HMAC over the request body, OR
|
|
14
|
+
* - explicit `confirmed:true` flag set by an authenticated *user* token
|
|
15
|
+
* (not just an agent token).
|
|
16
|
+
* 3. Otherwise return 412 with a confirmation challenge so the
|
|
17
|
+
* orchestrator can surface the prompt to a human.
|
|
18
|
+
*
|
|
19
|
+
* The HMAC is computed using process.env.HITL_SECRET (falls back to a
|
|
20
|
+
* derived secret on first start) over `${actorId}:${actionKey}:${nonce}`.
|
|
21
|
+
*
|
|
22
|
+
* This is a defense-in-depth gate — site-level policies in
|
|
23
|
+
* control-plane/policy-engine remain authoritative.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const crypto = require('crypto');
|
|
27
|
+
|
|
28
|
+
const SENSITIVE_VERBS = new Set([
|
|
29
|
+
'purchase',
|
|
30
|
+
'checkout',
|
|
31
|
+
'pay',
|
|
32
|
+
'payment',
|
|
33
|
+
'transfer',
|
|
34
|
+
'wire',
|
|
35
|
+
'send-money',
|
|
36
|
+
'withdraw',
|
|
37
|
+
'delete',
|
|
38
|
+
'delete-account',
|
|
39
|
+
'wipe',
|
|
40
|
+
'unsubscribe-all',
|
|
41
|
+
'cancel-subscription',
|
|
42
|
+
'submit-payment',
|
|
43
|
+
'authorize',
|
|
44
|
+
'sign-contract',
|
|
45
|
+
'change-password',
|
|
46
|
+
'change-email',
|
|
47
|
+
'export-data',
|
|
48
|
+
'grant-admin',
|
|
49
|
+
'revoke-access',
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
let _runtimeSecret = process.env.HITL_SECRET;
|
|
53
|
+
function _secret() {
|
|
54
|
+
if (_runtimeSecret) return _runtimeSecret;
|
|
55
|
+
// Derive a stable per-process secret if none configured. Note: this means
|
|
56
|
+
// confirmations don't survive restarts, which is acceptable (HITL tokens
|
|
57
|
+
// are short-lived by design).
|
|
58
|
+
_runtimeSecret = crypto.randomBytes(32).toString('hex');
|
|
59
|
+
return _runtimeSecret;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function _flatten(obj, depth = 0, out = []) {
|
|
63
|
+
if (depth > 4 || obj == null) return out;
|
|
64
|
+
if (typeof obj === 'string') { out.push(obj.toLowerCase()); return out; }
|
|
65
|
+
if (Array.isArray(obj)) { obj.forEach((v) => _flatten(v, depth + 1, out)); return out; }
|
|
66
|
+
if (typeof obj === 'object') { Object.values(obj).forEach((v) => _flatten(v, depth + 1, out)); }
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function detectSensitiveAction(body) {
|
|
71
|
+
const candidates = _flatten(body || {});
|
|
72
|
+
for (const v of candidates) {
|
|
73
|
+
if (typeof v !== 'string') continue;
|
|
74
|
+
// Match verb tokens: "purchase", "checkout.confirm", etc.
|
|
75
|
+
const tokens = v.split(/[\s.\-_/:]+/);
|
|
76
|
+
for (const t of tokens) {
|
|
77
|
+
if (SENSITIVE_VERBS.has(t)) return t;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function makeChallenge(actorId, actionKey) {
|
|
84
|
+
const nonce = crypto.randomBytes(12).toString('hex');
|
|
85
|
+
const ts = Date.now();
|
|
86
|
+
const payload = `${actorId || 'anon'}:${actionKey}:${nonce}:${ts}`;
|
|
87
|
+
const hmac = crypto.createHmac('sha256', _secret()).update(payload).digest('hex');
|
|
88
|
+
return { nonce, ts, signature: hmac, expiresInMs: 5 * 60 * 1000 };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function verifyConfirmation(header, actorId, actionKey) {
|
|
92
|
+
if (!header || typeof header !== 'string') return false;
|
|
93
|
+
const parts = header.split('.');
|
|
94
|
+
if (parts.length !== 3) return false;
|
|
95
|
+
const [nonce, ts, sig] = parts;
|
|
96
|
+
const tsNum = parseInt(ts, 10);
|
|
97
|
+
if (!nonce || !sig || !tsNum) return false;
|
|
98
|
+
if (Date.now() - tsNum > 5 * 60 * 1000) return false; // 5 min window
|
|
99
|
+
const payload = `${actorId || 'anon'}:${actionKey}:${nonce}:${tsNum}`;
|
|
100
|
+
const expected = crypto.createHmac('sha256', _secret()).update(payload).digest('hex');
|
|
101
|
+
try {
|
|
102
|
+
return crypto.timingSafeEqual(Buffer.from(sig, 'hex'), Buffer.from(expected, 'hex'));
|
|
103
|
+
} catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Express middleware. Apply to runtime/execute/policy routes.
|
|
110
|
+
* Bypassed when X-WAB-Confirm verifies, or when an authenticated USER token
|
|
111
|
+
* (req.user) explicitly sets `confirmed:true` in the body.
|
|
112
|
+
*/
|
|
113
|
+
function sensitiveActionGate(req, res, next) {
|
|
114
|
+
const action = detectSensitiveAction(req.body);
|
|
115
|
+
if (!action) return next();
|
|
116
|
+
|
|
117
|
+
const actorId = req.user?.id || req.agentId || req.session?.agentId || req.ip;
|
|
118
|
+
const actionKey = `${req.method}:${req.baseUrl || ''}${req.path}:${action}`;
|
|
119
|
+
|
|
120
|
+
// 1) User-supplied confirmation header (preferred)
|
|
121
|
+
const header = req.headers['x-wab-confirm'];
|
|
122
|
+
if (header && verifyConfirmation(header, actorId, action)) {
|
|
123
|
+
req._hitlConfirmed = action;
|
|
124
|
+
return next();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// 2) Logged-in user explicitly confirmed in body
|
|
128
|
+
if (req.user && req.body && req.body.confirmed === true && req.body.confirmedAction === action) {
|
|
129
|
+
req._hitlConfirmed = action;
|
|
130
|
+
return next();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Otherwise issue a challenge.
|
|
134
|
+
const challenge = makeChallenge(actorId, action);
|
|
135
|
+
return res.status(412).json({
|
|
136
|
+
error: 'Human-in-the-loop confirmation required',
|
|
137
|
+
code: 'HITL_REQUIRED',
|
|
138
|
+
sensitiveAction: action,
|
|
139
|
+
challenge: {
|
|
140
|
+
nonce: challenge.nonce,
|
|
141
|
+
ts: challenge.ts,
|
|
142
|
+
signature: challenge.signature,
|
|
143
|
+
headerName: 'X-WAB-Confirm',
|
|
144
|
+
headerValue: `${challenge.nonce}.${challenge.ts}.${challenge.signature}`,
|
|
145
|
+
expiresInMs: challenge.expiresInMs,
|
|
146
|
+
},
|
|
147
|
+
hint: 'Resubmit the same request with the X-WAB-Confirm header carrying the headerValue above, after a human has approved the action.',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
module.exports = {
|
|
152
|
+
sensitiveActionGate,
|
|
153
|
+
detectSensitiveAction,
|
|
154
|
+
makeChallenge,
|
|
155
|
+
verifyConfirmation,
|
|
156
|
+
SENSITIVE_VERBS,
|
|
157
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
-- Migration 001: Add composite indexes for analytics performance
|
|
2
|
-
-- Created: 2024-12-01
|
|
3
|
-
|
|
4
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_site_action ON analytics(site_id, action_name);
|
|
5
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_site_created ON analytics(site_id, created_at);
|
|
6
|
-
CREATE INDEX IF NOT EXISTS idx_subscriptions_user ON subscriptions(user_id);
|
|
7
|
-
CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status);
|
|
1
|
+
-- Migration 001: Add composite indexes for analytics performance
|
|
2
|
+
-- Created: 2024-12-01
|
|
3
|
+
|
|
4
|
+
CREATE INDEX IF NOT EXISTS idx_analytics_site_action ON analytics(site_id, action_name);
|
|
5
|
+
CREATE INDEX IF NOT EXISTS idx_analytics_site_created ON analytics(site_id, created_at);
|
|
6
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_user ON subscriptions(user_id);
|
|
7
|
+
CREATE INDEX IF NOT EXISTS idx_subscriptions_status ON subscriptions(status);
|