web-agent-bridge 1.2.0 → 2.1.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 (111) hide show
  1. package/LICENSE +21 -21
  2. package/README.ar.md +572 -446
  3. package/README.md +968 -933
  4. package/bin/agent-runner.js +465 -0
  5. package/bin/cli.js +138 -80
  6. package/bin/wab.js +80 -80
  7. package/examples/bidi-agent.js +119 -119
  8. package/examples/mcp-agent.js +94 -94
  9. package/examples/next-app-router/README.md +44 -0
  10. package/examples/puppeteer-agent.js +108 -108
  11. package/examples/saas-dashboard/README.md +55 -0
  12. package/examples/shopify-hydrogen/README.md +74 -0
  13. package/examples/vision-agent.js +171 -171
  14. package/examples/wordpress-elementor/README.md +77 -0
  15. package/package.json +71 -78
  16. package/public/.well-known/ai-assets.json +59 -0
  17. package/public/admin/login.html +84 -84
  18. package/public/ai.html +196 -0
  19. package/public/cookies.html +208 -208
  20. package/public/css/premium.css +317 -0
  21. package/public/css/styles.css +1235 -1235
  22. package/public/dashboard.html +704 -704
  23. package/public/demo.html +259 -0
  24. package/public/docs.html +585 -585
  25. package/public/feed.xml +89 -0
  26. package/public/index.html +581 -332
  27. package/public/js/auth-nav.js +31 -31
  28. package/public/js/auth-redirect.js +12 -12
  29. package/public/js/cookie-consent.js +56 -56
  30. package/public/js/wab-demo-page.js +721 -0
  31. package/public/js/ws-client.js +74 -74
  32. package/public/llms-full.txt +309 -0
  33. package/public/llms.txt +85 -0
  34. package/public/login.html +83 -83
  35. package/public/openapi.json +580 -0
  36. package/public/premium-dashboard.html +2487 -0
  37. package/public/premium.html +791 -0
  38. package/public/privacy.html +295 -295
  39. package/public/register.html +103 -103
  40. package/public/robots.txt +87 -0
  41. package/public/script/wab-consent.d.ts +36 -0
  42. package/public/script/wab-consent.js +104 -0
  43. package/public/script/wab-schema.js +131 -0
  44. package/public/script/wab.d.ts +108 -0
  45. package/public/script/wab.min.js +405 -0
  46. package/public/sitemap.xml +93 -0
  47. package/public/sovereign.html +660 -0
  48. package/public/terms.html +254 -254
  49. package/public/video/tutorial.mp4 +0 -0
  50. package/script/ai-agent-bridge.js +1558 -1513
  51. package/sdk/README.md +55 -55
  52. package/sdk/index.d.ts +118 -0
  53. package/sdk/index.js +257 -203
  54. package/sdk/package.json +14 -14
  55. package/sdk/schema-discovery.js +83 -0
  56. package/server/config/secrets.js +94 -92
  57. package/server/index.js +2 -9
  58. package/server/middleware/adminAuth.js +30 -30
  59. package/server/middleware/auth.js +41 -41
  60. package/server/middleware/rateLimits.js +24 -24
  61. package/server/migrations/001_add_analytics_indexes.sql +7 -7
  62. package/server/migrations/002_premium_features.sql +418 -0
  63. package/server/models/adapters/index.js +33 -33
  64. package/server/models/adapters/mysql.js +183 -183
  65. package/server/models/adapters/postgresql.js +172 -172
  66. package/server/models/adapters/sqlite.js +7 -7
  67. package/server/models/db.js +561 -561
  68. package/server/routes/admin-premium.js +671 -0
  69. package/server/routes/admin.js +247 -247
  70. package/server/routes/api.js +131 -138
  71. package/server/routes/auth.js +51 -51
  72. package/server/routes/billing.js +45 -45
  73. package/server/routes/discovery.js +406 -329
  74. package/server/routes/license.js +240 -240
  75. package/server/routes/noscript.js +543 -543
  76. package/server/routes/premium-v2.js +686 -0
  77. package/server/routes/premium.js +724 -0
  78. package/server/routes/sovereign.js +307 -0
  79. package/server/routes/wab-api.js +476 -476
  80. package/server/services/agent-memory.js +625 -0
  81. package/server/services/email.js +204 -204
  82. package/server/services/fairness.js +420 -420
  83. package/server/services/negotiation.js +439 -0
  84. package/server/services/plugins.js +747 -0
  85. package/server/services/premium.js +1883 -0
  86. package/server/services/reputation.js +465 -0
  87. package/server/services/self-healing.js +843 -0
  88. package/server/services/stripe.js +192 -192
  89. package/server/services/swarm.js +788 -0
  90. package/server/services/verification.js +481 -0
  91. package/server/services/vision.js +871 -0
  92. package/server/utils/cache.js +125 -125
  93. package/server/utils/migrate.js +81 -81
  94. package/server/utils/secureFields.js +50 -50
  95. package/server/ws.js +101 -101
  96. package/templates/artisan-marketplace.yaml +104 -0
  97. package/templates/book-price-scout.yaml +98 -0
  98. package/templates/electronics-price-tracker.yaml +108 -0
  99. package/templates/flight-deal-hunter.yaml +113 -0
  100. package/templates/freelancer-direct.yaml +116 -0
  101. package/templates/grocery-price-compare.yaml +93 -0
  102. package/templates/hotel-direct-booking.yaml +113 -0
  103. package/templates/local-services.yaml +98 -0
  104. package/templates/olive-oil-tunisia.yaml +88 -0
  105. package/templates/organic-farm-fresh.yaml +101 -0
  106. package/templates/restaurant-direct.yaml +97 -0
  107. package/docs/DEPLOY.md +0 -118
  108. package/docs/SPEC.md +0 -1540
  109. package/wab-mcp-adapter/README.md +0 -136
  110. package/wab-mcp-adapter/index.js +0 -555
  111. package/wab-mcp-adapter/package.json +0 -17
@@ -0,0 +1,405 @@
1
+ /**
2
+ * WAB Client v2.0.0 — Add this script to make any website AI-agent-ready
3
+ * https://webagentbridge.com
4
+ *
5
+ * Usage (zero setup):
6
+ * <script src="https://webagentbridge.com/script/wab.min.js"></script>
7
+ * <script>
8
+ * WAB.init({
9
+ * name: "My Store",
10
+ * actions: {
11
+ * buy: { description: "Buy product", run: () => { ... } },
12
+ * getPrice: { description: "Get price", run: () => ({ price: "$49" }) }
13
+ * }
14
+ * });
15
+ * </script>
16
+ *
17
+ * That's it. Your site now supports:
18
+ * - In-browser agent access via window.__wab_protocol
19
+ * - Discovery via WAB.discover()
20
+ * - Execution via WAB.execute("actionName", params)
21
+ * - Cross-frame sync (postMessage) for embedded demos
22
+ * - Auto-connection to WAB server endpoints if available
23
+ *
24
+ * License: MIT
25
+ */
26
+ (function(global) {
27
+ 'use strict';
28
+
29
+ var VERSION = '2.0.0';
30
+
31
+ // ── WAB Instance ──────────────────────────────────────────────────
32
+ function WABInstance(config) {
33
+ this.name = config.name || document.title || 'WAB Site';
34
+ this.serverUrl = config.serverUrl || '';
35
+ this.actions = {};
36
+ this._auditLog = [];
37
+ this._listeners = {};
38
+ this._ready = false;
39
+
40
+ if (config.actions) {
41
+ for (var key in config.actions) {
42
+ if (!config.actions.hasOwnProperty(key)) continue;
43
+ var action = config.actions[key];
44
+ if (typeof action === 'function') {
45
+ this.actions[key] = { description: key, params: [], run: action };
46
+ } else {
47
+ this.actions[key] = {
48
+ description: action.description || key,
49
+ params: action.params || [],
50
+ run: action.run || action.handler || function() { return { error: 'no handler' }; }
51
+ };
52
+ }
53
+ }
54
+ }
55
+
56
+ this._exposeProtocol();
57
+ this._setupCrossFrame();
58
+ this._ready = true;
59
+ this._emit('ready', { name: this.name, actions: Object.keys(this.actions) });
60
+ }
61
+
62
+ // Expose window.__wab_protocol for in-browser agents
63
+ WABInstance.prototype._exposeProtocol = function() {
64
+ var self = this;
65
+ global.__wab_protocol = {
66
+ version: VERSION,
67
+ protocol: '1.0',
68
+ name: this.name,
69
+ actions: Object.keys(this.actions).map(function(k) {
70
+ return { name: k, description: self.actions[k].description, params: self.actions[k].params };
71
+ }),
72
+ transport: ['javascript', 'http'],
73
+ ready: true,
74
+ discover: function() { return self.discover(); },
75
+ execute: function(name, params) { return self.execute(name, params); },
76
+ negotiate: function(agentId, proposal) { return self.negotiate(agentId, proposal); },
77
+ getReputation: function(siteId) { return self.getReputation(siteId); },
78
+ verifyPrice: function(productId, domPrice, visionPrice) { return self.verifyPrice(productId, domPrice, visionPrice); }
79
+ };
80
+
81
+ // Also expose on window.AICommands for broad compatibility
82
+ global.AICommands = global.AICommands || {};
83
+ global.AICommands.negotiate = function(agentId, proposal) { return self.negotiate(agentId, proposal); };
84
+ global.AICommands.getReputation = function(siteId) { return self.getReputation(siteId); };
85
+ global.AICommands.verifyPrice = function(productId, domP, visP) { return self.verifyPrice(productId, domP, visP); };
86
+ };
87
+
88
+ // Cross-frame communication for embedded demos
89
+ WABInstance.prototype._setupCrossFrame = function() {
90
+ var self = this;
91
+
92
+ global.addEventListener('message', function(e) {
93
+ if (!e.data || e.data.source === 'wab-store') return;
94
+
95
+ // Handle requests from parent (agent demo page)
96
+ if (e.data.source === 'wab-agent' && e.data.type === 'refresh') {
97
+ self._emit('refresh');
98
+ }
99
+ if (e.data.source === 'wab-agent' && e.data.type === 'discover') {
100
+ self.discover().then(function(doc) {
101
+ e.source.postMessage({ source: 'wab-store', type: 'discover-response', detail: doc }, '*');
102
+ });
103
+ }
104
+ if (e.data.source === 'wab-agent' && e.data.type === 'execute') {
105
+ self.execute(e.data.action, e.data.params).then(function(result) {
106
+ e.source.postMessage({ source: 'wab-store', type: 'execute-response', action: e.data.action, detail: result }, '*');
107
+ });
108
+ }
109
+ // Negotiation protocol via postMessage
110
+ if (e.data.source === 'wab-agent' && e.data.type === 'negotiate') {
111
+ self.negotiate(e.data.agentId, e.data.proposal).then(function(result) {
112
+ e.source.postMessage({ source: 'wab-store', type: 'negotiate-response', detail: result }, '*');
113
+ });
114
+ }
115
+ });
116
+
117
+ // Notify parent that store is ready
118
+ this._notifyParent('store-ready', { name: this.name, actions: Object.keys(this.actions) });
119
+ };
120
+
121
+ WABInstance.prototype._notifyParent = function(type, detail) {
122
+ try {
123
+ if (global.parent !== global) {
124
+ global.parent.postMessage({ source: 'wab-store', type: type, detail: detail }, '*');
125
+ }
126
+ } catch(e) {}
127
+ };
128
+
129
+ // Event system
130
+ WABInstance.prototype.on = function(event, fn) {
131
+ if (!this._listeners[event]) this._listeners[event] = [];
132
+ this._listeners[event].push(fn);
133
+ return this;
134
+ };
135
+
136
+ WABInstance.prototype._emit = function(event, data) {
137
+ var fns = this._listeners[event] || [];
138
+ for (var i = 0; i < fns.length; i++) {
139
+ try { fns[i](data); } catch(e) {}
140
+ }
141
+ };
142
+
143
+ // ── Core API ──────────────────────────────────────────────────────
144
+
145
+ WABInstance.prototype.discover = function() {
146
+ var self = this;
147
+ var actionList = [];
148
+ for (var key in this.actions) {
149
+ if (this.actions.hasOwnProperty(key)) {
150
+ actionList.push({ name: key, description: this.actions[key].description, params: this.actions[key].params });
151
+ }
152
+ }
153
+
154
+ // If server URL is configured, fetch from server for authoritative discovery
155
+ if (this.serverUrl) {
156
+ return fetch(this.serverUrl + '/.well-known/wab.json')
157
+ .then(function(r) { return r.json(); })
158
+ .catch(function() {
159
+ return { wab_version: VERSION, protocol: '1.0', name: self.name, actions: actionList, transport: ['javascript'] };
160
+ });
161
+ }
162
+
163
+ return Promise.resolve({
164
+ wab_version: VERSION,
165
+ protocol: '1.0',
166
+ name: this.name,
167
+ actions: actionList,
168
+ transport: ['javascript', 'http']
169
+ });
170
+ };
171
+
172
+ WABInstance.prototype.execute = function(actionName, params) {
173
+ var self = this;
174
+ var action = this.actions[actionName];
175
+ params = params || {};
176
+
177
+ // If server URL configured and action not local, proxy to server
178
+ if (!action && this.serverUrl) {
179
+ return fetch(this.serverUrl + '/wab/execute', {
180
+ method: 'POST',
181
+ headers: { 'Content-Type': 'application/json' },
182
+ body: JSON.stringify({ action: actionName, params: params })
183
+ }).then(function(r) { return r.json(); });
184
+ }
185
+
186
+ if (!action) {
187
+ return Promise.resolve({ success: false, error: 'Action not found: ' + actionName });
188
+ }
189
+
190
+ var start = Date.now();
191
+ try {
192
+ var result = action.run(params);
193
+ var handleResult = function(res) {
194
+ var duration = Date.now() - start;
195
+ self._auditLog.push({ action: actionName, params: params, result: res, duration_ms: duration, timestamp: new Date().toISOString() });
196
+ if (self._auditLog.length > 200) self._auditLog.shift();
197
+ self._notifyParent('action-executed', { action: actionName, result: res, duration_ms: duration });
198
+ self._emit('execute', { action: actionName, params: params, result: res, duration_ms: duration });
199
+ return res;
200
+ };
201
+ if (result && typeof result.then === 'function') {
202
+ return result.then(handleResult);
203
+ }
204
+ return Promise.resolve(handleResult(result));
205
+ } catch (e) {
206
+ return Promise.resolve({ success: false, error: e.message });
207
+ }
208
+ };
209
+
210
+ WABInstance.prototype.getActions = function() {
211
+ return Object.keys(this.actions);
212
+ };
213
+
214
+ WABInstance.prototype.getAuditLog = function() {
215
+ return this._auditLog.slice();
216
+ };
217
+
218
+ // ── Negotiation Support ─────────────────────────────────────────
219
+ // Sites can define negotiation rules; agents can open sessions and propose
220
+
221
+ WABInstance.prototype.setNegotiationRules = function(rules) {
222
+ this._negotiationRules = rules || {};
223
+ // Expose in protocol
224
+ if (global.__wab_protocol) {
225
+ global.__wab_protocol.negotiation = { available: true, rules: Object.keys(rules) };
226
+ }
227
+ return this;
228
+ };
229
+
230
+ WABInstance.prototype.negotiate = function(agentId, proposal) {
231
+ var self = this;
232
+ // Support in-browser negotiation rules (no server needed)
233
+ if (this._negotiationRules && !this.serverUrl) {
234
+ return this._handleLocalNegotiation(agentId, proposal);
235
+ }
236
+ if (!this.serverUrl) {
237
+ return Promise.resolve({ error: 'Negotiation requires a server URL or local rules' });
238
+ }
239
+ return fetch(this.serverUrl + '/api/sovereign/negotiation/sessions', {
240
+ method: 'POST',
241
+ headers: { 'Content-Type': 'application/json' },
242
+ body: JSON.stringify({
243
+ siteId: self.name,
244
+ agentId: agentId,
245
+ itemId: proposal.itemId || null,
246
+ itemName: proposal.itemName || 'item',
247
+ originalPrice: proposal.originalPrice || 0
248
+ })
249
+ }).then(function(r) { return r.json(); })
250
+ .then(function(session) {
251
+ if (!session.sessionId) return session;
252
+ return fetch(self.serverUrl + '/api/sovereign/negotiation/sessions/' + session.sessionId + '/propose', {
253
+ method: 'POST',
254
+ headers: { 'Content-Type': 'application/json' },
255
+ body: JSON.stringify({
256
+ strategy: proposal.strategy || 'instant_payment',
257
+ proposedDiscount: proposal.proposedDiscount || 5,
258
+ arguments: proposal.arguments || []
259
+ })
260
+ }).then(function(r) { return r.json(); });
261
+ });
262
+ };
263
+
264
+ // Local in-browser negotiation (no server required)
265
+ WABInstance.prototype._handleLocalNegotiation = function(agentId, proposal) {
266
+ var rules = this._negotiationRules;
267
+ var strategy = proposal.strategy || 'custom';
268
+ var rule = rules[strategy];
269
+ if (!rule) {
270
+ return Promise.resolve({
271
+ status: 'rejected',
272
+ reason: 'no_applicable_rule',
273
+ message: 'No rule matches strategy: ' + strategy
274
+ });
275
+ }
276
+ var requested = proposal.proposedDiscount || 0;
277
+ var maxAllowed = rule.maxDiscount || 20;
278
+ var offered = rule.discount || 0;
279
+ var actual = Math.min(requested, maxAllowed, offered);
280
+ var originalPrice = proposal.originalPrice || 0;
281
+ var finalPrice = Math.round(originalPrice * (1 - actual / 100) * 100) / 100;
282
+
283
+ if (requested <= offered) {
284
+ this._emit('negotiation', { status: 'accepted', agentId: agentId, discount: actual, finalPrice: finalPrice });
285
+ return Promise.resolve({
286
+ status: 'agreed',
287
+ discount: actual,
288
+ originalPrice: originalPrice,
289
+ finalPrice: finalPrice,
290
+ message: 'Deal accepted! ' + actual + '% off. Price: $' + finalPrice
291
+ });
292
+ }
293
+ // Counter-offer
294
+ this._emit('negotiation', { status: 'counter', agentId: agentId, counterDiscount: offered });
295
+ return Promise.resolve({
296
+ status: 'counter_offer',
297
+ counterDiscount: offered,
298
+ counterPrice: Math.round(originalPrice * (1 - offered / 100) * 100) / 100,
299
+ message: 'We can offer ' + offered + '% off for ' + strategy.replace(/_/g, ' ')
300
+ });
301
+ };
302
+
303
+ // ── Reputation Support ────────────────────────────────────────────
304
+
305
+ WABInstance.prototype.submitAttestation = function(agentId, targetSiteId, interactionType, outcome, extras) {
306
+ if (!this.serverUrl) {
307
+ return Promise.resolve({ error: 'Reputation requires a server URL' });
308
+ }
309
+ var body = {
310
+ siteId: targetSiteId,
311
+ agentId: agentId,
312
+ interactionType: interactionType || 'purchase',
313
+ outcome: outcome || 'success'
314
+ };
315
+ if (extras) {
316
+ if (extras.priceAccuracy != null) body.priceAccuracy = extras.priceAccuracy;
317
+ if (extras.responseTimeMs != null) body.responseTimeMs = extras.responseTimeMs;
318
+ if (extras.dataIntegrity != null) body.dataIntegrity = extras.dataIntegrity;
319
+ if (extras.visionVerified != null) body.visionVerified = extras.visionVerified;
320
+ if (extras.details) body.details = extras.details;
321
+ }
322
+ return fetch(this.serverUrl + '/api/sovereign/reputation/attestations', {
323
+ method: 'POST',
324
+ headers: { 'Content-Type': 'application/json' },
325
+ body: JSON.stringify(body)
326
+ }).then(function(r) { return r.json(); });
327
+ };
328
+
329
+ WABInstance.prototype.getReputation = function(siteId) {
330
+ if (!this.serverUrl) {
331
+ return Promise.resolve({ error: 'Reputation requires a server URL' });
332
+ }
333
+ return fetch(this.serverUrl + '/api/sovereign/reputation/sites/' + encodeURIComponent(siteId))
334
+ .then(function(r) { return r.json(); });
335
+ };
336
+
337
+ // ── Verification Support ──────────────────────────────────────────
338
+
339
+ WABInstance.prototype.verifyPrice = function(opts) {
340
+ if (!this.serverUrl) {
341
+ return Promise.resolve({ error: 'Verification requires a server URL' });
342
+ }
343
+ var body = {
344
+ siteId: opts.siteId || this.name,
345
+ agentId: opts.agentId || null,
346
+ url: opts.url || null,
347
+ domValue: opts.domValue || opts.domPrice,
348
+ visionValue: opts.visionValue || opts.visionPrice,
349
+ category: opts.category || null,
350
+ itemName: opts.itemName || null
351
+ };
352
+ return fetch(this.serverUrl + '/api/sovereign/verify/price', {
353
+ method: 'POST',
354
+ headers: { 'Content-Type': 'application/json' },
355
+ body: JSON.stringify(body)
356
+ }).then(function(r) { return r.json(); });
357
+ };
358
+
359
+ // ── Static API ────────────────────────────────────────────────────
360
+
361
+ var WAB = {
362
+ version: VERSION,
363
+
364
+ init: function(config) {
365
+ var instance = new WABInstance(config || {});
366
+ WAB._instance = instance;
367
+ return instance;
368
+ },
369
+
370
+ // Connect to a remote WAB server (for client pages that don't define actions)
371
+ connect: function(serverUrl) {
372
+ return new WABInstance({ name: 'WAB Client', serverUrl: serverUrl });
373
+ },
374
+
375
+ discover: function() {
376
+ if (WAB._instance) return WAB._instance.discover();
377
+ return Promise.resolve({ error: 'WAB not initialized. Call WAB.init() first.' });
378
+ },
379
+
380
+ execute: function(actionName, params) {
381
+ if (WAB._instance) return WAB._instance.execute(actionName, params);
382
+ return Promise.resolve({ error: 'WAB not initialized. Call WAB.init() first.' });
383
+ },
384
+
385
+ negotiate: function(agentId, proposal) {
386
+ if (WAB._instance) return WAB._instance.negotiate(agentId, proposal);
387
+ return Promise.resolve({ error: 'WAB not initialized' });
388
+ },
389
+
390
+ getReputation: function(siteId) {
391
+ if (WAB._instance) return WAB._instance.getReputation(siteId);
392
+ return Promise.resolve({ error: 'WAB not initialized' });
393
+ },
394
+
395
+ verifyPrice: function(opts) {
396
+ if (WAB._instance) return WAB._instance.verifyPrice(opts);
397
+ return Promise.resolve({ error: 'WAB not initialized' });
398
+ },
399
+
400
+ _instance: null
401
+ };
402
+
403
+ global.WAB = WAB;
404
+
405
+ })(typeof window !== 'undefined' ? window : this);
@@ -0,0 +1,93 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://webagentbridge.com/</loc>
5
+ <lastmod>2026-03-28</lastmod>
6
+ <changefreq>weekly</changefreq>
7
+ <priority>1.0</priority>
8
+ </url>
9
+ <url>
10
+ <loc>https://webagentbridge.com/docs</loc>
11
+ <lastmod>2026-03-28</lastmod>
12
+ <changefreq>weekly</changefreq>
13
+ <priority>0.9</priority>
14
+ </url>
15
+ <url>
16
+ <loc>https://webagentbridge.com/premium</loc>
17
+ <lastmod>2026-03-28</lastmod>
18
+ <changefreq>monthly</changefreq>
19
+ <priority>0.8</priority>
20
+ </url>
21
+ <url>
22
+ <loc>https://webagentbridge.com/register</loc>
23
+ <lastmod>2026-03-28</lastmod>
24
+ <changefreq>monthly</changefreq>
25
+ <priority>0.7</priority>
26
+ </url>
27
+ <url>
28
+ <loc>https://webagentbridge.com/login</loc>
29
+ <lastmod>2026-03-28</lastmod>
30
+ <changefreq>monthly</changefreq>
31
+ <priority>0.5</priority>
32
+ </url>
33
+ <url>
34
+ <loc>https://webagentbridge.com/privacy</loc>
35
+ <lastmod>2026-03-28</lastmod>
36
+ <changefreq>yearly</changefreq>
37
+ <priority>0.3</priority>
38
+ </url>
39
+ <url>
40
+ <loc>https://webagentbridge.com/terms</loc>
41
+ <lastmod>2026-03-28</lastmod>
42
+ <changefreq>yearly</changefreq>
43
+ <priority>0.3</priority>
44
+ </url>
45
+ <url>
46
+ <loc>https://webagentbridge.com/cookies</loc>
47
+ <lastmod>2026-03-28</lastmod>
48
+ <changefreq>yearly</changefreq>
49
+ <priority>0.2</priority>
50
+ </url>
51
+ <url>
52
+ <loc>https://webagentbridge.com/llms.txt</loc>
53
+ <lastmod>2026-03-28</lastmod>
54
+ <changefreq>monthly</changefreq>
55
+ <priority>0.6</priority>
56
+ </url>
57
+ <url>
58
+ <loc>https://webagentbridge.com/llms-full.txt</loc>
59
+ <lastmod>2026-03-28</lastmod>
60
+ <changefreq>monthly</changefreq>
61
+ <priority>0.6</priority>
62
+ </url>
63
+ <url>
64
+ <loc>https://webagentbridge.com/agent-bridge.json</loc>
65
+ <lastmod>2026-03-28</lastmod>
66
+ <changefreq>monthly</changefreq>
67
+ <priority>0.7</priority>
68
+ </url>
69
+ <url>
70
+ <loc>https://webagentbridge.com/demo</loc>
71
+ <lastmod>2026-03-28</lastmod>
72
+ <changefreq>weekly</changefreq>
73
+ <priority>0.9</priority>
74
+ </url>
75
+ <url>
76
+ <loc>https://webagentbridge.com/ai</loc>
77
+ <lastmod>2026-03-28</lastmod>
78
+ <changefreq>weekly</changefreq>
79
+ <priority>0.8</priority>
80
+ </url>
81
+ <url>
82
+ <loc>https://webagentbridge.com/openapi.json</loc>
83
+ <lastmod>2026-03-28</lastmod>
84
+ <changefreq>monthly</changefreq>
85
+ <priority>0.6</priority>
86
+ </url>
87
+ <url>
88
+ <loc>https://webagentbridge.com/feed.xml</loc>
89
+ <lastmod>2026-03-28</lastmod>
90
+ <changefreq>weekly</changefreq>
91
+ <priority>0.5</priority>
92
+ </url>
93
+ </urlset>